iproute 패키지의 "ss" 명령, 슬랩 테이블의 timewait 소켓을 쿼리하는 이유는 무엇입니까?

iproute 패키지의 "ss" 명령, 슬랩 테이블의 timewait 소켓을 쿼리하는 이유는 무엇입니까?

이 질문에 대한 최고의 포럼이 아니라면 용서해 주세요. 하지만 프로그래밍 자체보다는 커널과 더 관련이 있는 것 같습니다.

그래프를 그리고 통계를 모니터링할 수 있도록 시스템에 열려 있는 포트를 쿼리하는 스크립트를 작성 중입니다. 이를 위해 iproute 패키지의 "ss" 명령을 사용합니다. 실행하면 ss -s|grep estab다음과 유사한 출력을 받게 됩니다.

TCP:   296 (estab 6, closed 238, orphaned 0, synrecv 0, timewait 238/0), ports 0

내 문제는 소켓이 TIME_WAIT 상태로 계산되었음을 보여주는 timewait 변수와 관련이 있습니다. 슬래시 뒤에 어떤 숫자가 참조되었는지 알아내려고 했을 때 소스 코드를 검색하는 회오리바람 모험으로 바뀌었고 결국 다음 코드 조각을 보게 되었습니다.

printf("TCP:   %d (estab %d, closed %d, orphaned %d, synrecv %d, timewait %d/%d), ports %d\n",
       s.tcp_total + slabstat.tcp_syns + s.tcp_tws,
       sn.tcp_estab,
       s.tcp_total - (s.tcp4_hashed+s.tcp6_hashed-s.tcp_tws),
       s.tcp_orphans,
       slabstat.tcp_syns,
       s.tcp_tws, slabstat.tcp_tws,
       slabstat.tcp_ports
       );

나는 "slabstat"의 의미를 검색하다가 결국 /proc/slabinfo에 있는 slab 캐시와 해당 보고 인터페이스를 알게 되었음을 인정해야 합니다.

질문: slabtable은 TIME_WAIT 소켓 계산과 어떤 관련이 있나요? 시도하는 모든 서버에서 명령을 실행할 때마다 숫자가 항상 0이기 때문에 이 숫자가 보고되는 이유를 알 수 없습니다.

답변1

tcp_tw_buckets결국 폴링된 것은 Linux 2.6.12부터 제거된 구조였던 것 같습니다 .

따라서 7년 된 커널이 아닌 이상 마지막 숫자는 항상 0이 될 것입니다.

슬래브 쿼리에 관해서는 내가 아는 한 다른 방법보다 훨씬 빠릅니다.

관련 정보