Linux

[Linux] Socket 상태 조회 ( Socket Statistics )

예은파파 2024. 1. 24. 17:19

리눅스에서 네트워크 상태를 확인하기 위해 흔히 사용하는 명령어로 netstat 명령어가 존재하나 

최근 리눅스 배포판은 netstat 보다 새로운 명령어인 ss 사용을 권장하고 있음.

 

ss는 옵션 없이 사용하면 listening socket을 제외하고 현재 연결되어 있는 모든 소켓(TCP/UDP/Unix)을 표시.

 

ss는 다양한 옵션을 제공한다. 자주 사용되는 옵션은 다음과 같다.

ss [options] [ filters ]
Option Description
a 전체 포트 보기 ( listening socket 포함 )
t TCP 포트 보기
u UDP 포트 보기
x 유닉스 포트 보기
l Listening 상태의 포트 보기
p 프로세스명 표시하기
n 출력화면의 호스트명, 포트 사용자명 보기

 

Filter Description
sport 송신 포트 번호 또는 프로토콜 명
dport 수신 포트 번호 또는 프로토콜 명

 

ss 명령어의 출력은 다양한 열과 행으로 구성되어 있다.

 

주요 열에는 "State" (상태), "Recv-Q" (수신 큐), "Send-Q" (송신 큐), "Local Address" (로컬 주소), "Foreign Address" (원격 주소), "PID/Program name" (프로세스 ID/프로그램 이름) 등이 포함

 

  • State : 소켓의 현재 상태. 여기에는 "ESTAB" (연결), "TIME-WAIT"(연결 종료 후 대기) 등이 있음.
  • Recv-Q : 수신 대기 큐의 크기, 이 값이 0이면 현재 데이터를 받고 있지 않음을 의미.수신 대기 큐에 있는 패킷들은 아직 응용프로그램에 의해 처리되지 않고 대기 중인 상태
  • Send-Q : 송신 대기 큐의 크기, 이 값이 0이면 현재 데이터를 보내고 있지 않음을 의미. 데이터를 네트워크로 보내기 위해 대기하는 데이터의 양
  • Local Address : 로컬 주소와 포트 번호
  • Peer Address : 원격 주소와 포트 번호

 

Recv-Q, Send-Q의 값이 점차 증가 한다면 해당 소켓에 대한 처리가 따라오지 못하거나 병목현상이 발생되고 있을 수 있고 이는 네트워크 대역폭의 이유 또는 응용프로그램 수신 부문에서 병목이 발생하고 있음을 뜻함.

 

nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned

- nstat 유틸리티를 이용하여 TcpExtTCPRcvCollapsed 및 TcpExtRcvPruned 카운트를 조회

  이 후 잠시 기다렸다가 다시 실행하였을 때, 카운터 값이 첫 번째 실행에 비해 증가한 경우 튜닝이 필요

 

위 명령어들을 통해 socket buffer

 

마지막으로 데몬 형태로 주기적으로 네트워크 상태를 체크하여 파일로 적재하는 예제 명령어 

nohup bash -c 'while true; do echo -e "$(date)\n$(ss -ntl | grep -e "12000" -e "Send-Q")\n" >> output.log; sleep 10; done' > /dev/null 2>&1 &