리눅스 네트워크 튜닝

손실이 적은 네트워크의 경우 다음을 참고하여 커널 네트워크 파라미터를 설정한다


미국과 유럽의 연구망(NREN)이 공동으로 개발한 네트워크 성능측정 프레임워크 perfSONAR(퍼프소나)의 추천 네트워크 파라미터로 설정하는 것을 추천한다.
https://github.com/perfsonar/toolkit/blob/master/scripts/configure_sysctl

하기 파라미터의 주된 특징으로는 네트워크와 TCP의 receive / write buffer의 max를 BDP(bandwidth delay product)를 고려하여 증가시킨 것이다.



커널 파라미터

1G 급 이상

/etc/sysctl.conf
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 급 이상

/etc/sysctl.conf
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 급 이상

/etc/sysctl.conf
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 을 추가하여 영구적으로 설정할 수 있다.

/etc/sysconfig/network-scripts/ifcfg-enp1s0f0
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 하도록 하자.

/etc/sysctl.conf
...
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

https://linux.die.net/man/8/sysctl