Work/Server

[Linux] 커널 파라미터 수정 - TCP 성능향상

bangu4 2021. 3. 13. 21:44

커널 파라미터란?


리눅스 시스템의 커널에서 정의된 자원 설정값

해당변수값을 변경하여, 네트워크 성능, 서버 자원을 사용하는 프로세스들의 성능 등을 향상시킬수 있다.

커널파라미터값을 변경하면, 프로세스가 런타임중에도 즉시 반영되어 시스템을 최적화, 튜닝이 가능하다.

 

 

변수 조회 및 변경

sysctl 명령어 또는 /proc/sys 폴더 아래의 파일로 현재 적용된 값 조회/변경 가능 (root계정으로 진행)

 

조회 (icmp 네트워크 관련값)

> sysctl -a | grep icmp


net.netfilter.nf_conntrack_icmpv6_timeout = 30
net.netfilter.nf_conntrack_icmp_timeout = 30
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.icmp_errors_use_inbound_ifaddr = 0
net.ipv4.icmp_ratelimit = 1000
net.ipv4.icmp_ratemask = 6168
net.ipv6.icmp.ratelimit = 1000

WSL에서 조회한 결과

 

변경법

 

1. net.ipv4.ip_local_port_range 소켓생성시 사용가능한 포트범위 증가


 - TCP통신 서버접속시 사용하는 소켓생성할 때 사용가능한 로컬 포트 범위, 서버to서버 대용량 접속시에 클라이언트쪽의 사용가능한 로컬포트가 고갈될 수 있음

 - (사용가능한 포트수)/60(TIME_WAIT시간) 값이 초당최대요청수,

 - RPS(Requests Per Second)가 이 수치에 근접하다면 범위 증가 필요, 일반적으로 450RPS

 - 현재값 확인 : sysctl net.ipv4.ip_local_port_range

 - 설정방법 : 1024 ~ 65535 보다 범위가 좁으면 1024 ~ 65535 로 설정

   └ 즉시적용 : 

sysctl -w net.ipv4.ip_local_port_range=1024 65535

echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range

- 영구적용:

echo "net.ipv4.ip_local_port_range=1024 65535" >> /etc/sysctl.conf 

 



2. netdev_max_backlog 증가

- 각 네트워크 장치 별로 커널이 처리하도록 쌓아두는 queue의 크기

- 현재값 확인 : sysctl net.core.netdev_max_backlog

- 설정 : 30000 미만일 경우 30000으로 설정

- 즉시 설정

sysctl -w net.core.netdev_max_backlog=30000 

echo 30000 > /proc/sys/net/core/netdev_max_backlog

 - 영구 설정

echo "net.core.netdev_max_backlog=30000" >> /etc/sysctl.conf

 



3. somaxconn 수신 연결 갯수 증가

 

 - listen backlog, listen()으로 바인딩 된 서버 소켓에서 accept()를 기다리는 소켓 개수의 hard limit

 - accept()을 기다리는 ESTABLISHED 상태의 소켓(즉, connection completed)을 위한 queue

 - 현재값 확인 : sysctl net.core.somaxconn

 - 설정방법 :  1024 미만일 경우 1024 설정

 - 즉시적용

sysctl -w net.core.somaxconn=1024

echo 1024 > /proc/sys/net/core/somaxconn

 - 영구설정

echo "net.core.somaxconn=1024" >> /etc/sysctl.conf


 

4. SYN 백로그 큐 증가

- SYN_RECEIVED 상태의 소켓(즉, connection incompleted)을 위한 queue

 - 백로그큐(Backlog Queue)가 가득차면 다른 접속 요구를 받아들이지 못함

 - 현재값 확인 : sysctl net.ipv4.tcp_max_syn_backlog

 - 설정방법 : 1024 미만일 경우 1024 설정

 - 즉시적용 :

sysctl -w net.ipv4.tcp_max_syn_backlog=1024

echo 1024 > /proc/sys/net/ipv4/tcp_max_syn_backlog

 - 영구적용

echo "net.ipv4.tcp_max_syn_backlog=1024" >> /etc/sysctl.conf

 



5. SYN syncookies 기능 ON


 - TCP 연결에서 SYN Backlog가 가득찼을때 SYN패킷을 SYN Backlog에 저장하지 않고 ISN(Initial Sequence Number 을 만들어서 SYN + ACK를 클라이언트로 전송하여 SYN 패킷 Drop 방지

 - 현재값 확인 : sysctl net.ipv4.tcp_syncookies

- 설정방법 : 0 으로 설정되어 있으면 1로 설정
 
- 즉시적용 :

sysctl -w net.ipv4.tcp_syncookies=1

echo 1 > /proc/sys/net/ipv4/tcp_syncookies

 - 영구설정

echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf

 


6. tcp_max_tw_buckets 소켓 개수 증가

 - 시스템이 가질 수 있는 TIME_WAIT 상태 소켓 개수 제한

 - 설정값 만큼의 TIME_WAIT 상태의 소켓이 있다면, TIME_WAIT 상태로 전이되어야 할 소켓은 더이상 대기하지 않고 파괴(destroy)

 - 현재값 확인 : sysctl net.ipv4.tcp_max_tw_buckets

- 설정방법 : 1800000 미만일 경우 1800000 설정

- 즉시적용

sysctl -w net.ipv4.tcp_max_tw_buckets=1800000

echo 1800000 > /proc/sys/net/ipv4/tcp_max_tw_buckets

- 영구적용

echo "net.ipv4.tcp_max_tw_buckets=1800000" >> /etc/sysctl.conf

 


7. tcp_tw_reuse 기능 ON

 - 사용할 수 있는 local port 수가 모자라면, 현재 TIME_WAIT 상태의 소켓 중 프로토콜상 사용해도 무방해 보이는 소켓을 재사용

 - 현재값 확인 : sysctl net.ipv4.tcp_tw_reuse

 - 설정방법 :  0 으로 설정되어 있으면 1로 설정

 - 즉시적용 :

sysctl -w net.ipv4.tcp_tw_reuse=1

echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

 - 영구적용 :

echo "net.ipv4.tcp_tw_reuse=1" >> /etc/sysctl.conf


8. tcp_timestamps 기능 ON

 - 단시간에 sequence number가 overflow되는 상황에서 새로 수신한 패킷을 버리는 문제를 해결(*tcp_tw_reuse 옵션 사용을 위해 필수)

 - TIME_WAIT 상태의 소켓에 통신이 이루어진 마지막 시간(timestamp)를 기록

 - 현재값 확인 : sysctl net.ipv4.tcp_timestamps

 - 설정방법 : 0 으로 설정되어 있으면 1로 설정

 - 즉시적용 :

sysctl -w net.ipv4.tcp_timestamps=1

echo 1 > /proc/sys/net/ipv4/tcp_timestamps

 - 영구적용 :

echo "net.ipv4.tcp_timestamps=1" >> /etc/sysctl.conf

 

 

9. tcp_tw_recycle 기능 OFF

- 소켓이 TIME_WAIT 상태에 머무르는 시간을 1분 대신 RTO(Retransmission Timeout) 시간만큼 변경하여 TIME_WAIT 상태의 소켓 수를 감소시킴

 - 기능사용시 네트워크 성능은 크게 향상되지만 클라이언트가 NAT/LB 환경인 경우 일부 클라이언트로 부터의 SYN 패킷이 유실 발생

 - 현재값 확인 : sysctl net.ipv4.tcp_tw_recycle

 - 설정방법 :  1 로 설정되어 있으면 0으로 설정

 - 즉시적용 :

sysctl -w net.ipv4.tcp_tw_recycle=0

echo 0 > /proc/sys/net/ipv4/tcp_tw_recycle

 - 영구적용:

echo "net.ipv4.tcp_tw_recycle=0" >> /etc/sysctl.conf

 

10. tcp_window_scaling 기능 ON

 - TCP 헤더의 옵션 필드에 window scale라는 필드를 정의하여 advertise할 수 있는 receiver window size를 증가

 - 현재값 확인 : sysctl net.ipv4.tcp_window_scaling

 - 설정방법 : 0으로 설정되어 있으면 1로 설정

 - 즉시적용 :

sysctl -w net.ipv4.tcp_window_scaling=1

echo 1 > /proc/sys/net/ipv4/tcp_window_scaling

 - 영구적용: 

echo "net.ipv4.tcp_window_scaling=1" >> /etc/sysctl.conf 

 

 


11. TCP socket 송수신(Send,Receive) buffer 사이즈 증가

- receiver window size 증가를 위해 실제 커널에 설정된 소켓당 버퍼 크기를 증가

 - 현재값 확인 : 
   └ sysctl net.core.wmem_default
   └ sysctl net.core.rmem_default
   └ sysctl net.core.wmem_max
   └ sysctl net.core.rmem_max
   └ sysctl net.ipv4.tcp_wmem
   └ sysctl net.ipv4.tcp_rmem

 - 설정방법 : 
 - wmem_default : 253952 미만일 경우 253952 설정
 - rmem_default : 253952 미만일 경우 253952 설정
 - wmem_max : 8388608 미만일 경우 8388608 설정
 - rmem_max : 8388608 미만일 경우 8388608 설정
 - tcp_rmem : 8192   87380   8388608 미만일 경우 8192   87380   8388608 설정
 - tcp_wmem : 8192   87380   8388608 미만일 경우 8192   87380   8388608 설정 

- 즉시 적용 :

sysctl -w [파라미터명]=[값] 또는 echo [값] > [파라미터경로]

 - 영구 적용 :

echo "[파라이터명]=[값]" >> /etc/sysctl.conf 

 

 

12. iptables에 아래 예시와 같은 네트워크 제한에 대한 설정 내용이 존재하는지 확인


 - 현재값 확인 : iptables -nL

 - 예시1) 한 ip에서 20개 이상의  syn 요청이 올경우 차단

   └ target     prot opt source               destination
   └ DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp flags:0x17/0x02 #conn src/32 > 20


 - 예시2) syn 20번연결후 초당 10회연결제한

   └ target     prot opt source               destination
   └ RETURN     all  --  0.0.0.0/0            0.0.0.0/0            limit: avg 10/sec burst 20
   └ DROP       all  --  0.0.0.0/0            0.0.0.0/0


 설정 제외 커널 파라미터

A. tcp_fin_timeout
 - 'net.ipv4.fin_timeout'은 FIN_WAIT_2 상태에 머무를 수 있는 최대 시간을 설정
 - FIN_WAIT_2에 머무르는 소켓은 매우 드물고, 어차피 자연스레 TIME_WAIT 상태로 전이되기에 이 설정값은 기본으로 두어도 이슈 없음

B. net.ipv4.tcp_mem
 - 커널에서 TCP를 위해 사용할 수 있는 메모리 크기를 지정(단위 페이지(page))
 - TCP 소켓 전체에 대한 값
 - 부팅시 시스템의 메모리에 맞추어 자동으로(auto-tuned) 설정
 - 커널에 의해 시스템 메모리에 맞게 최적화된 값이 설정되기 때문에 되도록 수정 지양

 

 

더보기
참조사이트
- http://faq.hostway.co.kr/Linux_ETC/7179 : ulimit
- http://egloos.zum.com/antamis/v/629288 : tcp_max_syn_backlog, tcp_syncookies, iptables
- https://meetup.toast.com/posts/53 : tcp_window_scaling, socket buffer size
- https://meetup.toast.com/posts/54 : ulimit, netdev_max_backlog, somaxconn, tcp_max_syn_backlog
- https://meetup.toast.com/posts/55 : tcp_max_tw_buckets, tcp_tw_reuse, tcp_timestamps, tcp_tw_recycle
- https://tech.kakao.com/2016/04/21/closewait-timewait/ : net.ipv4.ip_local_port_range

waspro.tistory.com/406