2019/12/09

ssd hard disk tuning

우분투 18.04

1. 낮은 시간 대기 안정적 커널 다운로드.
1.1 커널 다운로드
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/linux-headers-4.17.1-041701_4.17.1-041701.201806111730_all.deb
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/linux-headers-4.17.1-041701-lowlatency_4.17.1-041701.201806111730_amd64.deb
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/linux-image-unsigned-4.17.1-041701-lowlatency_4.17.1-041701.201806111730_amd64.deb
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/linux-modules-4.17.1-041701-lowlatency_4.17.1-041701.201806111730_amd64.deb

1.1.1 커널소스 다운로드 및 컴파일 예제.
커널 4.7.5 이상의 우분투에서 메인 라인 커널로 부팅
CONFIG_UEVENT_HELPER설정 하지 않으면 일부 머신은 "루트를 찾을 수 없음" 커널 패닉.

우분투 커널 4.6.x 이하의 경우에서만 발생.
4.7.5에서는 그러지 않음.

소스 다운로드
git clone --branch v4.7.5 --depth 1 git://git.launchpad.net/~ubuntu-kernel-test/ubuntu/+source/linux/+git/mainline-crack

-p1( http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.7.5/ )를 사용 하여 메인 라인의 모든 패치를 적용
이미 설치된 기본 커널 /boo /what에서 .config로 구성을 복사

ONFIG_UEVENT_HELPER = y 및 CONFIG_UEVENT_HELPER_PATH = ""를 사용하도록 편집

커널 컴파일.
fakeroot make-kpkg --initrd --revision=4.7.5.pjf kernel_image kernel_headers -j8
*.deb files are created in directory above this one.

1.1.2 실 장비 컴파일.
git clone --branch v4.17.1 --depth 1 git://git.launchpad.net/~ubuntu-kernel-test/ubuntu/+source/linux/+git/mainline-crack
패치 파일 확인.
https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/
-p 옵션으로 패치 적용.

fakeroot make-kpkg --initrd --revision=4.7.5.pjf kernel_image kernel_headers -j8

1.2 커널 설치
dpkg -i *.deb

1.3 시스템 재부팅
reboot

2) cron TRIM 설정
2.1 하드디스크 지원 확인.

DISC-MAX 열이 0B가 아닌 경우 lsblk -D를 시도 하고 TRIM/discard를 사용 가능함.

lsblk -D
NAME        DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda                0        0B       0B         0
└─sda1             0        0B       0B         0 ---> TRIM 사용할 수 없음.
nvme0n1            0      512B       2T         0 ---> 사용할 수 있음.
├─nvme0n1p1        0      512B       2T         0
├─nvme0n1p2        0      512B       2T         0
├─nvme0n1p3        0      512B       2T         0
├─nvme0n1p4        0      512B       2T         0
└─nvme0n1p5        0      512B       2T         0
nvme1n1            0      512B       2T         0
├─nvme1n1p1        0      512B       2T         0
└─nvme1n1p2        0      512B       2T         0

2.2 TRIM 활성화.
vi /etc/cron.weekly/fstrim
#!/bin/sh
/sbin/fstrim --all || true

2.2.1 실행권한 부여
sudo chmod +x /etc/cron.weekly/fstrim

3. grub 설정
3.1 배경 지식
CFO(Completey Fair Queuing) 스케줄.
레드햇 엔트프라이즈 Linux 4의 기본 알고리즘.
확장 가능한 프로세스 별 I/O 대기열 유지하고 사용 가능한 I/O 대역폭을 모든 I/O에 균등하게 분배 하려고 한다.
I/O 요청에 대한 I/O 대기 시간을 최소화한다.
스케줄러는 거의 실시간 동작을 제공하고 라운드 로분 정책을 사용하여 I/O 요청간에 공정성을 유지시켜 프로세스 고갈을 피한다.
스케줄러는 5개의 I/O 대기 열을 사용하여 요청을 적즉적으로 다시 정럴하여 I/O 성능을 향상 시키니다.

NOOP 스케줄러는 간단한 FIFO 대기열이며 I/O당 최소량의 CPU/명령을 사용하여 I/O를 완료 하기 위한 기본 병합 및 정렬 기능을 수행한다.
I/O 성능이 블록 장치(메모리 디스크) 또는 지능형 HBA 또는 외부에 연결된 컨트롤러에서 최적화되었거나 최적화 된 것으로 가정한다.

실 환경에서는 베어 메탈에 운영 체제가 설치되어 있으므로 워크로드에 가장 적합한 알고리즘을 선택해야 한다.
가상 세계에는 OS와 디스크 사이에 하이퍼 바이저가 있으며 하이버 바이저에는 자체 디스크 큐가 있다.
이러한 현실 때문에 일어나는 일들을 나열해 본다.

1. VM에 디스크 I/O 발생
2. 케스트 OS는 CPU 시간을 사용하여 활성화 된 디스크 알고리즘 기반으로 I/O를 이장적인 순서로 정력한다.
3. 게스트 OS는 기본 가상 하드웨어에 새로운 수서로 요청한다
4. 하이퍼 바이저는 해당 요청을 가져와 자체 알고리즘 기반으로 다시 정렬한다.
5. 하이퍼 바이저는 자체 순서에 따라 실제 하드웨어에 요청한다.

하이퍼 바이저가 자체 디스크 큐에 대해 저체 정렬을 수행마므로 게스트 OS에서 동일한 작업을 시도하는 지점은 거의 없다.
최소한 게스트 OS는 약간의 대기 시간을 발생시키고 일부 CPU 주기를 낭비한다.
최악의 경우 하이퍼 바이저 및 백엔드 스토리지가 어려운 사항에 처한게 된다.(I/O 블랜더)
NOOP 스케줄러 전환하면 게스트 OS는 I/O를 통과하기 전에 가능한 한 저게 I/O를 숭행 하므로 가상 환경에 적합하다.

elevator = noop 지원 및 위치 확인.
cat /sys/block/sda/queue/scheduler
noop deadline [cfq]

[cfq]는 활성 스케줄러이다.
NOOP로 전환하려면 부트러도에 기본 커널 매개 변수를 추가해야한다.
elevator = noop

3.2 SSD 디스크 대기열 비활성화.
3.2.1 부트로더 수정
vi /etc/default/grub

GRUB_CMDLINE_LINUX="elevator=noop"

3.2.2 적용
sudo update-grub

재부팅 후 스케줄러 변경을 확인한다.
cat /sys/block/sda/queue/scheduler
[noop] deadline cfq

noop가 선택 됨.

4 하드디스크 마운트 정보 수정 /etc/fstab

4.1 sata POSIX 표준 함수
- 메뉴얼 페치지 확인.
man -s 2 stat
int stat(const char *path, struct stat *buf);

4.1.1 struct stat 구조
메타 데이타 확인 사항 키워드
st_atime, st_mtime, st_ctime

st_atime: 파일에 접근한 최종 시간, mknod, execve, pipe, read 함수를 실행할 때 변경 됨.
st_mtime: 파일이 변경된 시간, mknode, truncate, utime, write 함수 실행 경우 변경
st_ctime: 상태 변경 시간으로 소유자나, 소유그룹, 링크, mode 등 innode 관련 정보 변경 시간.

File IO가 많이 발생하는 웹 서비스의 경우 I/O 처리는 Contents를 읽어서 클라이언트에게 보내주기 위해 File에 대해 수행하는 read 연산이다.

POXIX 표준.
read 연산도 파일이나 디렉토리의 메타 데이터중 st_atime(access time)을 변경하게 되며 이는 IO 성능에 나쁜 영향을 주게된다.
이를 매번 기록하지 않는다면 File IO의 성능은 많이 향상된다.

이런 기능을 noatime(no access time)이라고 하며 mount나 chattr의 명령으로 파일 시스템 전체, 또는 개별 파일마다 접근 시간 기록 여분를 설정 할 수 있다.

4.1.2 fstab notime 설정
vi /etc/fstab

/dev/mapper/vg_linux-lv_home /var                   ext4    defaults,noatime        1 2

4.1.3 chattr 파일/디렉토리마다 지정
fie의 attributes를 설정하는 chattr 명령어를 사용하여 atime 옵션으로 마운트된 file system에서 특정 파일/디렉토리만 notime을 적용할 수 있다.

chattr에 +A를 설정하면 atime을 기록하지 않는다.
정상 ㅅ러정 여부 확인은 lsattr의 결과값중 A 필드가 설정되었는지 확인해 보면된다.
# lsattr -d /var/www/html/
-------------e- /var/www/html/
 
# chattr +A /var/www/html
# lsattr -d /var/www/html/
-------A-----e- /var/www/html/

4.1.3.1 테스트
파일 상태를 확인할 수 있는 stat의 명령어는 포맷을 지정할 수 있는 -c 옵션이 있다.
지정할 수 있는 포맷중 %x는 access time, %y는 modification time, %z는 change time이다.

파일의 atime을 확인한 후 read()를 수행하는 명령어(cat,vi등)을 수행한 후에 atime을 확인하여 변경되지 않았으면 정성 적용된 것이다.



4.2 파일 수정.
/ 디렉토리에 대한 디스크 매개 변수에 약간의 쓰기 권한을 적용.

UUID=XXXXXX / ext4 errors=remount-ro 0 1
에 아래와 같이 변경.
UUID=XXXXXX / ext4 noatime,nodelalloc,barrier=0,i_version,commit=30,inode_readahead_blks=64,errors=remount-ro 0 1

temfs 수정
tmpfs /tmp tmpfs noatime,nodiratime,nodev,nosuid,mode=1777,size=1G,defaults 0 0
tmpfs /var/tmp tmpfs noatime,nodiratime,nodev,nosuid,mode=1777,size=1G,defaults 0 0

"size=1G"에 대해 이 매개 변수를 사용하여,
tmpfs 파일 시스템을 제한 한다.
제한하지 않으면 사용 가능한 램의 절반을 "사용"한다.
그러나 램에대해 "예약"  하지 않는다.

df -h 명령을 사용해 현재 시스템에서 1GB가 잘 작동해 설정 했음.

df -h
tmpfs           1.0G     0  1.0G   0% /var/tmp
/dev/sda1       916G  1.3G  869G   1% /home
tmpfs           3.2G     0  3.2G   0% /run/user/0
tmpfs           3.2G     0  3.2G   0% /run/user/1000


5. sysctl
vi /etc/sysctl.conf

vm.swappiness=1
vm.vfs_cache_pressure=50
vm.dirty_writeback_centisecs=1500

5.1 재 부팅
reboot

6. /etc/xdg/autostart
이 디렉토리 파일은 /etc/X11의 Xsession 스크립트에 의해 실행됨.
파일을 살펴보면 일부는 특정 그래픽 인터페이스에서만 실행된다는 것을 알 수 있다.

KDE에 맞게 조정되어 있어 몇 가지를 삭제한다.

파일 백업.
cp -a /etc/xdg/autostart /etc/xdg/autostart_orgi

*at-spi-dbus-bus.desktop
*gnome-keyring-secrets.desktop
*snap-userd-autostart.desktop
*gnome-keyring-ssh.desktop
*baloo_file.desktop
*spice-vdagent.desktop
*blueman.desktop
*gnome-welcome-tour.desktop
*update-notifier.desktop
*gnome-initial-setup-copy-worker.desktop
*kdeconnectd.desktop
*user-dirs-update-gtk.desktop
*gnome-initial-setup-first-login.desktop
*orca-autostart.desktop
*xdg-user-dirs.desktop
*gnome-keyring-pkcs11.desktop
*org.gnome.DejaDup.Monitor.desktop

7) TLP(노트북 참고)
화면 밝기 조정

apt install tlp

충전 임계 값 설정.
/etc/default/tlp
# Battery charge thresholds (ThinkPad only, tp-smapi or acpi-call kernel module
# required). Charging starts when the remaining capacity falls below the
# START_CHARGE_THRESH value and stops when exceeding the STOP_CHARGE_THRESH value.
# Main / Internal battery (values in %)

#START_CHARGE_THRESH_BAT0=75
#STOP_CHARGE_THRESH_BAT0=80

# Ultrabay / Slice / Replaceable battery (values in %)
#START_CHARGE_THRESH_BAT1=75
#STOP_CHARGE_THRESH_BAT1=80

8) Preload
apt install preload

/etd/default/preload 구성 파일이 있다
아 파일 옵션에 디스크 사용을 줄이는 옵션이 있음.

디스크 활동 줄이기 옵션 활성화.
OPTIONS="-l /dev/null"


9) 불필요한 시스템 서비스 비활성화.
systemctl disable mpd.socket
systemctl disable snapd
systemctl disable avahi-daemon
systemctl disable apparmor
systemctl disable ModemManager
systemctl mask ModemManager
systemctl disable NetworkManager-wait-online
systemctl mask NetworkManager-wait-online
systemctl disable nmbd --> 서비스 하므로 활성화
systemctl disable smbd --> 서비스 하므로 활성화
systemctl disable ssh ---> 개발환경이기 때문에 활성화.
systemctl disable lm-sensors
systemctl mask lm-sensors
systemctl mask apparmor
systemctl mask bluetooth
systemctl mask speech-dispatcher
systemctl mask pppd-dns
systemctl mask accounts-daemon
systemctl mask apport

분석
systemd-analyze time

systemd-analyze blame

댓글 없음:

댓글 쓰기