우분투 실전 명령어 | ss로 TCP 연결 상태 분석

언제 쓰는가

서버가 느려졌는데 원인을 못 찾을 때, 가장 먼저 확인할 대상이 연결 상태입니다. 특히 ESTABLISHED가 비정상적으로 많거나 TIME-WAIT가 과하게 쌓이면 애플리케이션, 프록시, 커널 튜닝 중 어디를 볼지 방향이 잡힙니다. netstat 대신 ss를 쓰면 더 빠르고 정확하게 현재 연결 상태를 확인할 수 있습니다.

바로 쓰는 명령어

# 전체 TCP 연결 상태 요약
ss -s

# 현재 LISTEN 포트와 프로세스 확인
sudo ss -lntp

# ESTABLISHED 연결 상위 포트 확인
sudo ss -nt state established | awk 'NR>1 {print $4}' | sed 's/.*://' | sort | uniq -c | sort -nr | head
# 특정 포트(예: 443) 연결 상태 상세
sudo ss -ntp '( sport = :443 or dport = :443 )'

# TIME-WAIT 연결 개수 확인
ss -nt state time-wait | wc -l

# 주기적으로 상태 변화 보기
watch -n 2 'ss -s; echo; ss -nt state established | wc -l'

핵심 옵션/패턴

  • -s: 소켓 상태를 요약해서 빠르게 전체 상황을 본다.
  • -lntp: LISTEN 소켓, TCP, 포트 숫자 표시, 프로세스 정보까지 한 번에 본다.
  • state established, state time-wait: 문제 구간을 상태별로 분리해서 확인한다.
  • sport, dport 필터: 특정 서비스 포트 기준으로 트래픽을 좁혀 본다.
  • watch 조합: 순간 값이 아니라 추세를 보면서 장애 징후를 잡는다.

명령 출력 예시

$ ss -s
Total: 1287
TCP:   944 (estab 312, closed 510, orphaned 2, timewait 498)

Transport Total     IP        IPv6
RAW      0         0         0
UDP      22        18        4
TCP      434       312       122
INET     456       330       126
$ sudo ss -lntp
State  Recv-Q Send-Q Local Address:Port  Peer Address:Port Process
LISTEN 0      511    0.0.0.0:80       0.0.0.0:*         users:(("nginx",pid=1120,fd=6))
LISTEN 0      511    0.0.0.0:443      0.0.0.0:*         users:(("nginx",pid=1120,fd=8))
LISTEN 0      4096   127.0.0.1:5432   0.0.0.0:*         users:(("postgres",pid=980,fd=7))

자주 하는 실수

  • 루트 권한 없이 실행하고 프로세스 정보가 안 보인다고 결론 내리는 경우가 많다. 포트 소유 프로세스를 보려면 sudo가 필요하다.
  • ESTABLISHED 개수만 보고 정상/비정상을 단정하는 실수가 많다. 트래픽이 많은 서비스는 원래 많을 수 있으니 평소 기준치와 비교해야 한다.
  • TIME-WAIT가 많으면 무조건 장애라고 오해하기 쉽다. 배포 직후나 단기 트래픽 급증 시 일시적으로 늘 수 있으니 추세로 판단해야 한다.

검증 방법

# 1) 현재 서비스 포트가 정상 LISTEN 중인지 확인
sudo ss -lntp | grep -E ':80 |:443 '

# 2) 연결 폭주 여부를 상태별로 확인
ss -nt state established | wc -l
ss -nt state time-wait | wc -l

# 3) 애플리케이션 로그와 시간대 맞춰 대조
sudo journalctl -u nginx --since '10 minutes ago' --no-pager | tail -n 50

정상이라면 LISTEN 포트가 기대한 프로세스에 묶여 있고, ESTABLISHED/TIME-WAIT 수치가 평소 범위 안에서 움직입니다. 이상이면 특정 포트 쏠림, 급격한 상태 변화, 같은 시간대의 에러 로그가 함께 보입니다.

운영 팁

장애 대응 때는 ss -s 결과를 1분 간격으로 5회 정도 저장해 두면 원인 파악이 훨씬 빨라집니다. 단일 시점 스냅샷보다 추세 데이터가 훨씬 정확합니다. 필요한 경우 timestamp를 붙여 파일로 남기세요.

for i in {1..5}; do
  date '+%F %T'
  ss -s
  echo '---'
  sleep 60
done | tee /tmp/ss-state-sample.log

출처

  • man ss
  • iproute2 문서
  • Linux TCP/IP Sockets in Practice