이것이이 질문에 대한 최고의 포럼이 아니라면 용서하십시오. 그러나 프로그래밍 자체보다 커널과 관련이있는 것 같습니다.
통계를 그래프로보고 모니터링 할 수 있도록 시스템에 열린 포트를 쿼리하는 스크립트를 작성 중입니다. 이를 위해 iproute 패키지에서 “ss”명령을 사용하고 있습니다. 실행 ss -s|grep estab
하면 다음과 유사한 출력이 수신됩니다.
TCP: 296 (estab 6, closed 238, orphaned 0, synrecv 0, timewait 238/0), ports 0
내 질문은 timewait 변수와 관련이 있으며, TIME_WAIT 상태의 계산 소켓을 보여줍니다. 슬래시 후 참조 된 숫자를 알아 내려고 시도했을 때 소스 코드를 검색하는 회오리 바람이되어 궁극적으로 다음 스 니펫을 찾았습니다.
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의 슬래브 캐시 및보고 인터페이스에 대한 학습으로 이어졌습니다.
질문 : 슬래 블 테이블은 TIME_WAIT 소켓 계산과 어떤 관련이 있습니까? 시도한 모든 서버에서 명령을 실행할 때마다 숫자가 항상 0 이었으므로이 숫자가보고되는 이유를 알 수 없습니다.
답변
그것은 tcp_tw_buckets
궁극적으로 폴링 된 것처럼 보입니다 .Linux 2.6.12에서 제거 된 구조체입니다.
따라서 마지막 숫자는 7 살짜리 커널이 아니면 항상 0 일 것입니다.
슬랩 쿼리에 관해서는 사용 가능한 다른 방법보다 엄청나게 빠릅니다.