답변:
시작하기 위해 필요한 것 (직접 작성하려는 경우) :
#!/bin/bash
#
# usage: bwmon PID
IN=0; OUT=0; TIME=0
get_traffic() {
t=`awk '/eth0:/ { printf("%s,%d,%d\n",strftime("%s"),$2,$10); }' < /proc/$1/net/dev`
IN=${t#*,}; IN=${IN%,*}
OUT=${t##*,};
TIME=${t%%,*};
}
get_traffic $1
while true
do
_IN=$IN; _OUT=$OUT; _TIME=$TIME
get_traffic $1
echo "$TIME,$(( $TIME - $_TIME )),$IN,$(( $IN - $_IN )),$OUT,$(( $OUT - $_OUT))"
sleep 1
done
코멘트:
stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3
nc
localhost를 통해 클라이언트 / 서버 쌍을 실행하여 초당 1 바이트를 전송하고 감시했습니다 /proc/<listening-nc-pid>/net/dev
. 그런 다음 nc
최대 속도로 전송 하는 두 번째 쌍을 실행했습니다 . 내가보고있는 파일은 두 번째 쌍의 데이터와 첫 번째 쌍의 데이터를 매우 분명히 계산했습니다. Linux 2.6.32에서 실행
function strftime never defined
; gawk 를 설치하여 수정되었습니다 .
/proc/<pid>/net/dev
그리고 /proc/net/dev
여기에 같은 내용이있다. 따라서 scipt는 주어진 프로세스가 아닌 eth0의 트래픽 만보고합니다.
eth0
프로세스에 표시된대로 의 인터페이스 카운터를 측정합니다 . 해당 인터페이스를 통해 프로세스가 보낸 데이터는 계산 하지 않습니다 .
사용 된 일반 I / O 대역폭에 만족하거나 프로그램이 거의 완전히 네트워크 I / O를 수행하는 경우 /proc/<pid>/io
파일을 볼 수 있습니다. rchar
및 wchar
필드를 원합니다 . 당신은 빼기 할 수 있습니다 read_bytes
그리고 write_bytes
그들이 읽고 저장 층에 기록 대표하기 때문에. http://www.kernel.org/doc/Documentation/filesystems/proc.txt의 섹션 3.3을 참조하십시오 .
더 해상도가 필요한 경우 .... 당신은 아마도 스크립트를 사용하여이 수 lsof
하고 strace
는 모든 코너 케이스를 바로 얻을 고통스러운 것이지만. 기본적인 아이디어는의 출력을 구문 분석하는 것입니다 strace -p <pid>
, 첫 번째 매개 변수를 잡아 (= 파일 기술자) 및 반환 값 (= 바이트 수) read()
, write()
, send()
, 및 recv()
호출 ( 주 I 피난처 ';을 수신하는 몇 가지 더 콜가를 t 모두 추적). 음수 값을 버리십시오. 오류를 나타냅니다. 를 사용하여 lsof -p <pid>
그림에 어떤에서 파일 기술자는 TCP / UDP 소켓이 있고, FD 당 카운트를 추가 할 수 있습니다. 이 전략은 검사하는 프로세스를 소유하는 한 루트가 필요하지 않지만 글을 쓰는 것은 물론 글을 쓰는 것이 실제로 털이 많습니다.
nethogs를 보십시오 :
NetHogs는 작은 'net top'도구입니다. 대부분의 도구와 마찬가지로 프로토콜 또는 서브넷 당 트래픽을 분류하는 대신 프로세스별로 대역폭을 그룹화합니다. NetHogs는로드 할 특수 커널 모듈에 의존하지 않습니다. 갑자기 많은 네트워크 트래픽이 발생하면 NetHog를 시작하고 이로 인해 어떤 PID가 발생했는지 즉시 확인할 수 있습니다. 이를 통해 야생에 빠지고 갑자기 대역폭을 차지하는 프로그램을 쉽게 식별 할 수 있습니다.