TCP 소켓의 리슨 백로그(listen backlog)를 확인하는 방법은 무엇인가요?
Environment
- Red Hat Enterprise Linux
- TCP connections in
LISTENstate
Issue
- "LISTEN" 상태의 TCP 소켓에서 backlog의 크기를 확인하는 방법은 무엇인가요?
listen()backlog에서accept()호출을 기다리는 핸드셰이크된 TCP 연결의 현재 수와 최대 수를 확인하는 방법은 무엇인가요?net.core.somaxconn및listen(int sockfd, int backlog);값을 증가시킨 것이 적용되었는지 확인하는 방법은 무엇인가요?
Resolution
ss -lt 명령어를 사용하여 "LISTEN" 상태의 모든 TCP 소켓을 확인합니다.
TCP 소켓이 established 상태인 경우, 문서에 설명된 대로 Recv-Q와 Send-Q는 바이트 단위를 의미합니다.
TCP 소켓이 listening 상태인 경우, Recv-Q는 현재 큐 크기를 의미하고, Send-Q는 설정된 backlog를 의미합니다.
예를 들어, 다음은 sshd가 backlog 128로 수신 대기 중이고, MySQL이 backlog 50으로 수신 대기 중인 상태를 보여줍니다:
# ss -lt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:ssh *:*
LISTEN 0 50 *:mysql *:*
ss는 다음 두 값 중 최솟값을 현재 backlog로 표시합니다:
/proc/sys/net/core/somaxconn
somaxconn - INTEGER
소켓 listen() backlog의 제한으로, 사용자 공간에서는 SOMAXCONN으로 알려져 있습니다.
기본값은 128입니다. TCP 소켓의 추가 튜닝을 위해 tcp_max_syn_backlog도 참조하십시오.
소켓 호출별 listen의 backlog 파라미터:
int listen(int sockfd, int backlog);
설명
listen()은 sockfd가 참조하는 소켓을 수동 소켓으로 표시합니다. 즉, accept(2)를 사용하여
들어오는 연결 요청을 수락하는 데 사용될 소켓으로 표시합니다.
sockfd 인수는 SOCK_STREAM 또는 SOCK_SEQPACKET 유형의 소켓을 참조하는 파일 디스크립터입니다.
backlog 인수는 sockfd에 대한 대기 중인 연결 큐가 증가할 수 있는 최대 길이를 정의합니다.
큐가 가득 찬 상태에서 연결 요청이 도착하면, 클라이언트는 ECONNREFUSED 오류를 수신하거나,
기반 프로토콜이 재전송을 지원하는 경우 요청이 무시되어 이후 재시도 시 연결이 성공할 수 있습니다.
Root Cause
ss는 iproute 도구에서 netstat을 대체하는 명령어로, 과거의 ifconfig, route, arp가 ip 명령어로 대체된 것과 유사합니다.
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments