단일 프로세스의 대역폭 사용량을 모니터링 할 수있는 도구가 있습니까? 있는 멋진

단일 프로세스의 다양한 런타임 데이터를 기록 할 수 있는 멋진 모니터 를 찾았 습니다 . 대역폭 사용량과 동일한 기능을 찾고 있습니다. 이상적으로는 명령이 다음과 같아야 bwmon --pid 1 --log init.log합니다. 그런가요? 관리자 권한없이 실행할 수 있습니까?



답변

시작하기 위해 필요한 것 (직접 작성하려는 경우) :

#!/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

코멘트:

  • eth0 만 확인
  • 1 초마다 확인
  • 리눅스에서만 작동하지만 다른 유닉스는 비슷하게 작동합니다 (procfs 등).
  • 출력은 sqlite.db에 저장할 수 있습니다. stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3

답변

사용 된 일반 I / O 대역폭에 만족하거나 프로그램이 거의 완전히 네트워크 I / O를 수행하는 경우 /proc/<pid>/io파일을 볼 수 있습니다. rcharwchar필드를 원합니다 . 당신은 빼기 할 수 있습니다 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가 발생했는지 즉시 확인할 수 있습니다. 이를 통해 야생에 빠지고 갑자기 대역폭을 차지하는 프로그램을 쉽게 식별 할 수 있습니다.


답변