
Linux 서버에서는 사용할 수 netstat -tan | grep ESTABLISHED| wc -l
있지만 watch -n1
.
이러한 접근 방식은 서버 사용량이 많지 않거나 모니터링 간격이 충분히 큰 경우에 잘 작동합니다. 그런데 부하가 높은 서버에 대한 대안으로 권장할 수 있는 것은 무엇입니까?
답변1
/proc를 사용하여 작업량 줄이기
접근하는 걸 좋아해요커널 변수를 통해 직접 /proc
. 이는 매우 효율적이고 빠르며 시스템 친화적입니다.
/proc/net/tcp
커널이 TCP 연결 및 수신 목록을 저장하는 이름의 의사 파일(커널 변수 테이블)이 있습니다 . 6번째 필드st
~을 위한상태0A
수신 항목 및 01
설정된 연결에 대한 내용이 포함될 수 있습니다 .
계산TCP 확립된사이:
사용하여grepgrep </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
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
다른 명령에 대한 파이프라인이 필요하지 않으므로 매우 빠릅니다.
ss
netstat
이전 버전은 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 계산합니다. 참고: 엄청난 수의 연결을 사용하여 이 비용을 시도하지 않았습니다.