Performance Tuning with Pogoplug v4 on Arch Linux ARM
한 때 pogoplug V4 성능 튜닝 관련 유명한 글이 있었는데, 북마크에 넣기는 했는데 그 때는 관심이 없었다. Pogo 구입 전 기대에 비해 실제 성능이 너무도 떨어져서 튜닝은 커녕 그냥 pogo를 치워버렸다.
2년이 흘러 더 좋은 대안(백업 전용으로 쓰고있는 WD My Cloud)이 있음에도, 궂이 재미삼아 pogo를 다시 꺼낸 지금.. 오래된 bookmark를 다시 뒤져 이제야 따라해본다.
그 때도 별 의미 없다거나, Arch Linux ARM(이후 ALARM)에만 효과가 있고 debian은 의미 없다거나 하는 이야기가 있었는데, 어차피 소일꺼리로 만지는 것 직접 적용해보고 느껴보기로 했다. 그러나 Tuning 전/후 benchmark 등 수치적 확인은 않는 것으로 하고, 오로지 느껴만 본다. ^^
여튼, 위 글의 요지는 아래와 같다.
- Issue 1. Arch Linux ARM의 Network Performance Tuning이 엉망이라 바꿔야 한다.
- Issue 2. Pogo의 CPU가 워낙 느려서, I/O 부하를 조금이라도 줄여야 한다.
- Issue 3. 역시 Pogo는 너무 느려서, SAMBA도 기본 설정으로는 버겁다.
- Issue 4. Pogo의 암호화 HW 가속 기능을 활성화해서 SSH, OpenVPN 성능을 개선할 수 있다.
- Issue 5. Swap 영역을 지혜롭게 만들어서 128MB 밖에 안되는 RAM을 보전하자.
- Issue 6. USB2.0/3.0, SATA, Gigabit Ethernet은 High Speed Bus를 사용하는 반면, SD 카드와 NAND Flash는 Low Speed Bus를 사용하니까 SD와 NAND를 쓰지말자. (흑.. 부팅용으로 SD 쓰는데..)
이제부터는 주욱 root로 간다. sudo -s
Tip 1. Network Performance Tuning을 잘해보기
아래는 필자가 적어둔 Arch Linux ARM(ALARM)의 기본설정과 새로운 Tuning 값이다.
ALARM DEFAULT NEW TUNINGS
net.core.rmem_default = 163840 1
net.core.rmem_max = 163840 2801664
net.core.wmem_default = 163840
net.core.wmem_max = 163840 2097152
net.ipv4.tcp_rmem = 4096 87380 969536 4096 87380 2801664
net.ipv4.tcp_wmem = 4096 16384 969536 4096 16384 2097152
일단 Kernel 4.11.3의 Debian Jessie의 값은 어떤지 비교해보았다.
(sysctl -a | grep mem 명령으로 확인할 수 있다)
ALARM DEFAULT Debian Jessie NEW TUNINGS
net.core.rmem_default = 163840
net.core.rmem_max = 163840 163840 2801664
net.core.wmem_default = 163840
net.core.wmem_max = 163840 163840 2097152
net.ipv4.tcp_rmem = 4096 87380 969536 4096 87380 862528 4096 87380 2801664
net.ipv4.tcp_wmem = 4096 16384 969536 4096 16384 862528 4096 16384 2097152
위와 같이 ALARM과 거의 일치하는 Tuning 값을 가지고 있다. 그러면 충분히 따라해볼만 하다고 결정!
core 보다 tcp가 최대 메모리를 더 쓸 수 있는 문제를 고치고, core와 tcp가 가용한 자원을 끝까지 끌어쓸 수 있도록 수치를 결정한 것 같다...만 난 잘 모른다.
순정 파일인 /etc/sysctl.conf 대신 /etc/sysctl.d/ 디렉토리 아래에 99-T1_network_tuning.conf 파일을 만들고 새 tuning 값을 적어주었다.
net.core.rmem_max = 2801664
net.core.wmem_max = 2097152
net.ipv4.tcp_rmem = 4096 87380 2801664
net.ipv4.tcp_wmem = 4096 16384 2097152
하는 김에 아래 석 줄도 함께 넣어주란다. 빠른 서버에는 의미 없고, pogo 그저 아쉬우니까 하는거란다.
net.ipv4.tcp_timestamps = 0
net.core.optmem_max = 65535
net.core.netdev_max_backlog = 5000
아래 명령으로 ethtool의 설치 위치를 확인하자. 혹시 안깔려있다면 설치하고..
ifconfig로 이더넷 카드의 interface 명을 확인하고.. 내 경우엔 eth0
# which ethtool
/sbin/ethtool
# which ifconfig
/sbin/ifconfig
# ifconfig
eth0 Link encap:Ethernet HWaddr .......
/etc/udev/rules.d/50-eth.rules 파일을 만들고, 아래 내용을 채워넣는다.
ethtool/ifconfig의 위치와 이더넷 카드의 interface 명에 유의할 것!
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth0", RUN+="/sbin/ethtool -K %k gso on"
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth0", RUN+="/sbin/ethtool -K %k tso off"
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth0", RUN+="/sbin/ifconfig eth0 txqueuelen 5000"
일단 네트워크 관련은 여기까지..
리부팅 후 아래 명령들로 설정이 제대로 적용되었는지 확인
# sysctl -a | grep mem
# ifconfig
# ethtool -k eth0
nfs로 pogo에 접속해서 rsync로 파일을 로컬로 옮겨보았다. (포고가 server, client 측에서 rsync 실행)
3~5GB 짜리 동영상 두개인데, rsync가 알려주는 속도가 평소보다 조금 빠른 숫자가 나왔다. 익숙한 숫자는 27~28 MB/s 수준인데, 두 파일 모두 평균 30.x MB/s로 전송 종료됨. 리부팅한지 얼마 안되서 그럴 수 있고, 파일 두개 카피한 것 가지고 벤치마크를 대신할 수는 없다만, 좋은 숫자 나왔을 때 믿고 빠져야 인생이 편하다. ㅎㅎ
일단 오늘은 여기까지.. 솔찍히 효과가 아리송한데 조금만 더 지켜보자.
Tip 2. I/O Tuning을 잘해보기
이제는 약간 구닥다리가 되어버린 플래시 메모리(usb 메모리, sd card) 얼라인먼트로 부터 이야기가 시작된다. 몇년 전 부터 리눅스 파티션 툴은 얼라인먼트를 잘 맞춰준다고 하던데, 여하튼 이번에는 글쓴이를 따라서 신경써서 챙겨본다. 더불어 글쓴이가 테스트 하기로는 포고에서는 xfs가 cpu 부담이 가장 적고 빠르다고.. 테스트해볼 정렬이 없는 나는 그냥 그대로 받아쓰기로함.
# parted -a opt /dev/sdX (X는 본인 사정에 맞추어..)
(parted) mklabel gpt
(parted) mkpart xfs primary 0% 100% (mkpart primary xfs 0% 100% 로 해줘야 한다)
(parted) quit
parted에 -a opt 옵션을 줘서 플래시 메모리 optimal_io_size에 딱 맞춰서 한블럭 비우고 파티션을 시작하는 듯 하다. 다만 내 경우는 미리 확인해보니 optimal_io_size가 0이라 수동으로 align을 맞춰주었다. 그런데, 테스트해보니 자동도 잘 맞는다. ^^
참고로 부팅 디스크로 쓰려면 반드시 1번 파티션이 rootfs가 되어야 하고, ext3 또는 ext4가 되어야 한다.
io size 확인은 이렇게..
# cat /sys/block/sdb/queue/optimal_io_size
0
# cat /sys/block/sdb/queue/minimum_io_size
512
# cat /sys/block/sdb/queue/physical_block_size
512
# cat /sys/block/sdb/alignment_offset
0
내 경우처럼 optimal_io_size 값을 얻을 수 없고, alignment_offset이 0이면서, minimum_io_size가 2의 거듭제곱(512 = 2^9)이면 1 MiB 띄우란다.. (실은 이게 default.. 아놔 기껏 찾아봤더니 default... ㅜ.ㅠ)
# parted -a opt /dev/sdX
(parted) mklabel gpt
(parted) mkpart primary xfs 1MiB 100%
(parted) align-check opt 1
1 aligned
(parted) align-check min 1
1 aligned
(parted) unit s p
Number Start End Size File system Name Flags
1 2048s 31289343s 31287296s fat32 primary
(parted) quit
쩝.. 걍 익숙한 fdisk에서 gpt 파티션 만들고 시키는대로 따라가기만 하면 딱 이렇게 된다.. ㅎㅎ 파일 시스템을 xfs로 지정했으나 fat32로 만들어지는 위엄..
아래 명령으로 포멧.. 다시 한번 강조하지만 부팅 디스크는 xfs 파일 시스템을 사용하면 안된다.
# mkfs.xfs /dev/sdX1
만약, fat32 파일 시스템이 이미 있다고 에러 띄우면 -f 옵션을 줘서 강제로 덮자.
#<file system> <mount point> <type> <options> <dump> <pass>
UUID=”xxxxxxxx” /u01/external/ xfs defaults,nofail,noatime,nodev 0 1
file system과 mount point는 상황에 맞춰서..
- rmem_default와 wmem_default는 그냥 유지했음 [본문으로]
'SBC' 카테고리의 다른 글
포고플러그 Torrent 시드박스 구축 (deluge) (0) | 2017.07.27 |
---|---|
포고플러그 V4 Debian Jessie - 커널 업데이트 (0) | 2017.07.27 |
포고플러그 V4 Debian Jessie 설치 2017년 7월 기준 (0) | 2017.07.14 |
토렌트 시드박스 만들기 (transmission-bt, 포고플러그 V4) (0) | 2017.07.14 |
포고플러그 시리즈 4 Arch Linux 설치 (0) | 2015.10.11 |