우분투 실전 명령어 | 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