커널 파라미터란?
리눅스 시스템의 커널에서 정의된 자원 설정값
해당변수값을 변경하여, 네트워크 성능, 서버 자원을 사용하는 프로세스들의 성능 등을 향상시킬수 있다.
커널파라미터값을 변경하면, 프로세스가 런타임중에도 즉시 반영되어 시스템을 최적화, 튜닝이 가능하다.
변수 조회 및 변경
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
변경법
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
'Work > Server' 카테고리의 다른 글
[VM] Virual Machine 리눅스 설치 - Virualbox사용 (0) | 2021.03.14 |
---|---|
[Window] 윈도우에서 우분투 설치 사용 (초간단 설치 WSL) (0) | 2021.03.14 |
[Centos] MariaDB 바이너리 설치 (yum없이 tar.gz설치) (2) | 2021.02.10 |
[Linux] vi 비주얼모드 전환 (복사 붙여넣기 안되는 현상) (3) | 2021.02.01 |
[Linux] 서버 다운(shutdown) 로그 확인 (3) | 2021.01.26 |