리눅스 네트워크 튜닝
손실이 적은 네트워크의 경우 다음을 참고하여 커널 네트워크 파라미터를 설정한다
미국과 유럽의 연구망(NREN)이 공동으로 개발한 네트워크 성능측정 프레임워크 perfSONAR(퍼프소나)의 추천 네트워크 파라미터로 설정하는 것을 추천한다.
https://github.com/perfsonar/toolkit/blob/master/scripts/configure_sysctl
하기 파라미터의 주된 특징으로는 네트워크와 TCP의 receive / write buffer의 max를 BDP(bandwidth delay product)를 고려하여 증가시킨 것이다.
커널 파라미터
1G 급 이상
net.core.default_qdisc = fq net.core.rmem_max = 67108864 net.core.wmem_max = 67108864 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.all.arp_filter = 1 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.default.arp_filter = 1 net.ipv4.tcp_congestion_control = htcp net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_rmem = 4096 87380 33554432 net.ipv4.tcp_wmem = 4096 65536 33554432
10Gbps 급 이상
net.core.default_qdisc = fq net.core.rmem_max = 268435456 net.core.wmem_max = 268435456 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.all.arp_filter = 1 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.default.arp_filter = 1 net.ipv4.tcp_congestion_control = htcp net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_rmem = 4096 87380 134217728 net.ipv4.tcp_wmem = 4096 65536 134217728
40Gbps 급 이상
net.core.default_qdisc = fq net.core.rmem_max = 536870912 net.core.wmem_max = 536870912 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.all.arp_filter = 1 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.default.arp_filter = 1 net.ipv4.tcp_congestion_control = htcp net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_rmem = 4096 87380 268435456 net.ipv4.tcp_wmem = 4096 65536 268435456
sysctl
재부팅 없이 곧바로 하나의 설정을 적용하려면
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 134217728"
재부팅 없이 곧바로 conf 파일을 적용하려면
sudo sysctl -p /etc/sysctl.conf
현재 설정 값을 확인하려면
sudo sysctl -a
MTU 설정
MTU(Maximum Transfer Unit)는 이더넷이 프레임을 분할(fragment)하여 전달하는 바이트 크기이다. 기본값은 1500이다. 이 값이 높으면 데이터를 fragment/defrag 하는 overhead 가 줄어들어 전송성능이 향상된다. 전송경로 상의 모든 네트워크 장비의 MTU가 높게 설정되어 있어야 의미가 있다. 점보프레임(Jumbo Frame) 설정이라고도 불린다.
(참고) 일반적으로 MTU=9000 까지는 설정이 된다. 가끔씩 MTU=9K 설정이 가능하다고 해서 9x1024=9216 으로 설정했는데 데이터 전송이 안되는 경우도 있다.
MTU 는 ifconfig 로 확인할 수 있다.
$ ifconfig enp1s0f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 210.xxx.228.yyy netmask 255.255.255.240 broadcast 210.xxx.228.zzz
일시적으로는 다음 명령어를 통해 MTU를 높일 수 있다.
$ ifconfig enp1s0f0 mtu 9000 enp1s0f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 900 inet 210.xxx.228.yyy netmask 255.255.255.240 broadcast 210.xxx.228.zzz
CentOS에서는 네트워크 스크립트에 MTU=9000 을 추가하여 영구적으로 설정할 수 있다.
TYPE=Ethernet ... DEVICE=enp1s0f0 ONBOOT=yes IPADDR=210.xxx.228.yyy NETMASK=255.255.255.240 GATEWAY=210.xxx.228.zzz ... MTU=9000
데이터 전송 경로에 MTU가 9000보다 낮은 경로가 있을 수도 있다. 이 경우에 대응하기 위해, 데이터 전송경로의 MTU를 테스트 한 후 데이터 전송을 하는 커널 flag 를 enable 하도록 하자.
... net.ipv4.tcp_mtu_probing = 1
100G 이상의 경우
일반적으로 장치에서 발생한 인터럽트는 CPU에 무작위로 binding 된다. 100Gbps 처리를 위해서는 특정 CPU 코어를 네트워크 인터페이스 전용으로 binding 하는 작업이 필요하다.
https://fasterdata.es.net/host-tuning/linux/100g-tuning/interrupt-binding/
CPU 모드를 performance 우선으로 변경해야 한다.
https://fasterdata.es.net/host-tuning/linux/100g-tuning/cpu-governor/
함께 읽기
https://fasterdata.es.net/network-tuning/
https://github.com/perfsonar/toolkit/blob/master/scripts/configure_sysctl