본문 바로가기
Work/Server

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

커널 파라미터란?


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

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

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

 

 

변수 조회 및 변경

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