2. TCP 네트워크 성능을 결정짓는 커널 파라미터 (네트워크 수용량 관련)
명령어 정리
Maximum File Count
설명 | 명령어 |
리눅스 전체 시스템이 가질 수 있는 최대 파일 개수 (변경을 할 일이 없다고 보면 된다) | $ sysctl fs.file-max |
리눅스 프로세스별 가질 수 있는 최대 파일 개수 | $ ulimit -a // 확인 $ ulimit -SHn 65535 // 증가 |
현재 열려있는 파일 현황 | $ sysctl fs.file-nr // 결과는 열려 있는 파일 수, 열려있으나 사용되지 않은 파일 수, 열 수 있는 파일의 최대 개수 |
Backlog
설명 | 명령어 |
네트워크 장치 별로 커널이 처리하도록 쌓아두는 Queue의 크기 설정 | $ sysctl -w net.core.netdev_max_backlog="30000" |
Listen()으로 바인딩 된 서버 소켓에서 Accept()를 기달리는 (ESTABLISHED 상태, Connection Completed) 소켓 개수 설정 | $ sysctl -w net.core.somaxconn="1024" |
SYN_RECEIVED (Connection Imcompleted) 소켓 개수 설정 | $ sysctl -w net.ipv4.tcp_max_syn_backlog="1024" |
Maximum File Count
리눅스와 일반적인 유닉스의 소켓은 파일과 같은 취급을 받는다.
$ sysctl fs.file-max
fs.file-max = 775052
해당 값은 이미 적당히 크게 설정되어있으므로 만질일은 별로 없다고 한다.
그러므로 상단의 Parameter 보다는 프로세서별 설정인 User Limit을 만져주면 된다.
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 30473
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 30473
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
상단의 결과에서 Open Files가 프로세스가 가질 수 있는 소켓 포함 파일 개수이며 아래와 같이 증가 가능하다
ulimit -SHn 65535
Backlog
패킷의 처리과정 앞에는 Queue가 존재하고 만약 패킷 처리량이 Queue보다 증가한다면 넘치는 패킷은 버려지게 되므로 Queue를 늘려주는 경우도 있다.
- Inbound Queue vs. Outbound Queue
- In-bound Queue 설정을 바꾸는것이 더 민감한데 그 이유는 Out-bound Queue의 패킷량은 애플리케이션으로 조절이 가능하기 때문이다. 또한 In-bound Queue에서 넘치는 패킷은 애플리케이션 레벨에선 알 수 있는 방법이 없기 때문이다.
- 그러므로 대규모 패킷을 처리하는 서버에서는 In-bound Queue길이를 적당히 증가시켜야 한다.
네트워크 장치 별로 커널이 처리하도록 쌓아두는 Queue의 크기 설정
$ sysctl -w net.core.netdev_max_backlog="30000"
Listen()으로 바인딩 된 서버 소켓에서 Accept()를 기달리는 (ESTABLISHED 상태, Connection Completed) 소켓 개수 설정 (Listen Backlog)
$ sysctl -w net.core.somaxconn="1024"
위에 설정값과 다르게 SYN_RECEIVED (Connection Imcompleted) 소켓 개수 설정
$ sysctl -w net.ipv4.tcp_max_syn_backlog="1024"
Port Range
Bind() = TCP 연결을 맺을때, 클라이언트 소켓은 하나의 포트를 선점해야 한다. 이 때 아래의 4가지 요소는 구분자로 사용된다.
- 출발지 주소
- 출발지 포트
- 목적지 주소
- 목적지 포트
Listen() = TCP 연결을 맺을때 시스템 소켓을 추가 소모하지 않는다. 그러므로 일반적인 서버에서는 가질 수 있는 포트 수와 서버의 클라이언트 동시 연결 수는 크게 관계가 없다.
하지만 Proxy 서버는 다른 백엔드 서버에 연결하기 위한 클라이언트 소켓이 필요하다 그러므로 아래와 같이 시스템에 동시에 가질 수 있는 클라이언트 소켓 수를 결정하는것이 좋다.
$ sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 61000
$ sysctl -w net.ipv4.ip_local_port_range="1024 65535"
출처 :
https://blog.cloudflare.com/ko/syn-packet-handling-in-the-wild-kr/