Pogoplug V4 성능 튜닝 [작성중]

SBC 2017. 7. 26. 20:08 Posted by juvenile

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[각주:1] = 163840                
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 옵션을 줘서 강제로 덮자.


/etc/fstab에는 마운트 옵션을 아래처럼 지정한다.

#<file system>   <mount point>   <type>  <options>                      <dump> <pass>
UUID=”xxxxxxxx”  /u01/external/   xfs    defaults,nofail,noatime,nodev   0      1

file system과 mount point는 상황에 맞춰서..






  1. rmem_default와 wmem_default는 그냥 유지했음 [본문으로]