TCP 설정된 연결 수를 가져옵니다.

TCP 설정된 연결 수를 가져옵니다.

Linux 서버에서는 사용할 수 netstat -tan | grep ESTABLISHED| wc -l있지만 watch -n1.

이러한 접근 방식은 서버 사용량이 많지 않거나 모니터링 간격이 충분히 큰 경우에 잘 작동합니다. 그런데 부하가 높은 서버에 대한 대안으로 권장할 수 있는 것은 무엇입니까?

답변1

/proc를 사용하여 작업량 줄이기

접근하는 걸 좋아해요커널 변수를 통해 직접 /proc. 이는 매우 효율적이고 빠르며 시스템 친화적입니다.

/proc/net/tcp커널이 TCP 연결 및 수신 목록을 저장하는 이름의 의사 파일(커널 변수 테이블)이 있습니다 . 6번째 필드st~을 위한상태0A수신 항목 및 01설정된 연결에 대한 내용이 포함될 수 있습니다 .

계산TCP 확립된사이:

사용하여
grep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
사용하여
awk  </proc/net/tcp 'BEGIN{t=0};{if ($4 == "01") {t++;}};END{print t}'

또는

awk  </proc/net/tcp 'BEGIN{t=0};/^ *[0-9]+: [0-9A-F: ]{27} 01 /{t++};END{print t}'
사용하여
sed  </proc/net/tcp '/^ *[0-9]\+: [0-9A-F: ]\{27\} 01 /p;d' | wc -l

실행 시간

이 질문은 높은 작업 부하 시스템을 나타냅니다. 나는 작은 벤치를 만들었습니다.

밀리초 단위의 메소드 응답

그렙 테크노 2.48
정규식 없음 ($4=="01") 2.51
sed | 화장실 2.67
정규식 2.93으로 awk

ss -neopt 상태 설정 | wc -l Suprjami 15.14
lsof -i tcp -s tcp:설정된 Tonioc 25055.00

Ok Tonioc의 답변은 매우 느리지만 그의 장황함으로 인해 매우 흥미롭습니다. 따라서 작업량이 많은 시스템에서는 분명히 사용할 수 없습니다.

ss이 벤치를 사용하면 매우 유용한 전용 도구인 경우 /proc변수를 요청하는 것이 훨씬 더 빨라질 수 있음 을 알 수 있습니다 .

답변2

다음 명령을 사용하십시오.

ss -neopt state established

이렇게 하면 상태의 TCP 세션만 표시되며 ESTABLISHED다른 명령에 대한 파이프라인이 필요하지 않으므로 매우 빠릅니다.

ssnetstat이전 버전은 netstat파일 잠금이 적용되는 procfs에서 읽기만 하기 때문에 더 좋습니다 . ss실제로 커널 스케줄러에 의해 처리되는 커널 내부에서 쿼리를 만들고 항상 정확한 정보를 반환합니다.

답변3

다음 사항도 확인하세요.527875.

netstat + grep몇 가지 연결에 대한 훌륭하고 간단한 옵션이지만 연결 수가 많은 경우 다음 ss에서 권장하는 대로 권장합니다.nixCraft.

예를 들어:ss -s

Total: 78 (kernel 79)
TCP:   31 (estab 27, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 16

Transport Total     IP        IPv6
*     79        -         -        
RAW   0         0         0        
UDP   4         2         2        
TCP   31        2         29       
INET      35        4         31       
FRAG      0         0         0  

답변4

프로토콜과 상태별로 필터링할 수 있는 lsof도 있습니다. 예를 들어 TCP ESTABLISHED 연결을 찾는 경우는 다음과 같습니다.

~# lsof -i tcp -s tcp:ESTABLISHED

그럼 | wc -l 계산합니다. 참고: 엄청난 수의 연결을 사용하여 이 비용을 시도하지 않았습니다.

관련 정보