Infra/네트워크

2. TCP 네트워크 성능을 결정짓는 커널 파라미터 (네트워크 수용량 관련)

Velody 2020. 7. 26. 15:31

명령어 정리

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/

https://meetup.toast.com/posts/54