시스템에서 현재 TCP 연결 수 얻기


22

대신에 wc -l /proc/net/tcp더 빠른 방법이 있습니까?

총 TCP 연결 수가 필요합니다.


5
어쩌면 시도ss -s
Ulrich Dangel

@UlrichDangel cool, 그것은 sockstat를 읽음으로써 더 빠릅니다. 실제로 답변 영역에 넣을 수 있습니다 ;-)
데이지

답변:


20

숫자를 얻고 싶고 세부 정보가 필요하지 않은 경우에서 데이터를 읽을 수 있습니다 /proc/net/sockstat{,6}. 절대 연결 수를 얻으려면 두 값을 모두 결합해야합니다.

커널 자체 NETLINK_INET_DIAG에서 정보를 얻으려면 커널에서 정보를 읽지 않고도 정보를 얻을 수 있습니다. /proc


1
내 솔루션의 성능과 위의 제안 된 솔루션을 비교하여 많은 연결이있는 시스템에서 테스트 한 결과가 궁금합니다. 최종의 답변을 얻기 위해 추가 산술 및 필터링이 필요합니다. 단일 숫자입니다!
Johan

7

더 빠른 방법? 그렇게하면 1 초 안에 응답을 얻을 수 있습니다. 실제로 내 컴퓨터에서 0.009 초가 걸립니다!

타이핑이 덜 필요한 방법을 찾고 있습니까? 이 경우 별칭을 설정하십시오 (예 :

alias tcpcount="wc -l /proc/net/tcp"

별명을 입력하면됩니다. 예를 들어이 tcpcount번호를 얻기 위해 예에서 사용한 것과 같은 이름 입니다.

로그인 할 때마다 별명이 정의되도록 행을 입력하거나 .bashrc에 추가하십시오.

많은 수의 연결의 경우 다음이 약간 더 빠르게 실행될 수 있습니다 (매우 적은 수의 연결의 경우 약간 느려질 수 있음).

#!/bin/bash
/usr/bin/tail -1 /proc/net/tcp | (IFS=:
read COUNT DISCARD
echo $COUNT
)

아니면 ...

awk 'END {print NR}' /proc/net/tcp

이 두 솔루션 모두 "wc"가 라인 수를 계산하는 데 매우 적합하지 않다고 가정합니다. 내 테스트는이 가정이 사실임을 보여줍니다.

첫 번째는 tail 명령이 불필요한 데이터를 버리는 데 실제로 도움이되어 여분의 하위 쉘을 만들고 환경 변수에 대한 추가 작업을 수행한다는 전제를 수행합니다. / proc / net / tcp의 줄에 이미 번호가 매겨져 줄을 세지 않아도된다는 사실을 이용합니다. 최종 솔루션은 awk가 더 큰 프로그램을로드하고 여러 프로세스를 생성하기 때문에 단점을 상쇄하기에 충분하다고 가정합니다. awk 솔루션은 간단한 한 줄 별칭 정의에 잘 어울리는 추가 이점을 제공합니다 (스크립트가 없기 때문에 추가 이점을 제공하므로 추가 쉘 프로세스가 없어서 몇 초의 이점이 있습니다).


1
3 초 이상 걸리는 40k + 연결
데이지

2
흠, 나는 읽는 것보다 훨씬 빠른 방법이 없다고 생각 /proc/net/tcp합니다. 시도해 볼 수는 netstat -n -t | wc -l있지만 netstat도 다음과 같이 읽습니다./proc/net/tcp
Kotte

netstat는 시스템에서 / proc / net / tcp를 읽는 것보다 3 배 이상 느리지 만 연결 수가 매우 적으므로 연결 수가 많으면 일부 시작 오버 헤드가 완화 될 수 있습니다. netstat를 사용하면 여러 주에서 연결 수를 쉽게 얻을 수 있습니다 ....
Johan

1
RAM이 16GB 인 서버에서는 이제 netstat -nt약 180.000 개의 연결로 1 분 이상이 소요됩니다 . 왜 그렇게 느려 야하는지 이유가 없습니다 ... (읽기도 /proc/net/tcp매우 느립니다)
Marki555

1
연결이 180k 인 컴퓨터에서 일부 부끄러운 테스트는 awk접근 방식이 ~보다 느리다는 것을 나타냅니다 wc. tail와 동등한 것으로 보입니다 wc.
Felix Frank

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.