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


15

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



답변:


3

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

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

11
이것이 실제로 프로세스 당 카운터라고 생각하지 않습니다. 프로세스의 관점에서 볼 때 총 인터페이스 수에 불과하다고 생각합니다. nclocalhost를 통해 클라이언트 / 서버 쌍을 실행하여 초당 1 바이트를 전송하고 감시했습니다 /proc/<listening-nc-pid>/net/dev. 그런 다음 nc최대 속도로 전송 하는 두 번째 쌍을 실행했습니다 . 내가보고있는 파일은 두 번째 쌍의 데이터와 첫 번째 쌍의 데이터를 매우 분명히 계산했습니다. Linux 2.6.32에서 실행
Jander

나는 오류가 있었다 function strftime never defined; gawk 를 설치하여 수정되었습니다 .
tshepang

4
그 @Jander 맞습니다, /proc/<pid>/net/dev그리고 /proc/net/dev여기에 같은 내용이있다. 따라서 scipt는 주어진 프로세스가 아닌 eth0의 트래픽 만보고합니다.
scai

1
이것이 답변이 아님을 확인합니다. eth0프로세스에 표시된대로 의 인터페이스 카운터를 측정합니다 . 해당 인터페이스를 통해 프로세스가 보낸 데이터는 계산 하지 않습니다 .
Navin

@Navin 대답은 질문에 대답하려고하는 모든 것입니다. 잘못된 대답은 여전히 대답이다. 이것이 틀렸다면, 당신은 그것을 내려 놓을 수 있지만 여전히 답입니다.
terdon

6

사용 된 일반 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 당 카운트를 추가 할 수 있습니다. 이 전략은 검사하는 프로세스를 소유하는 한 루트가 필요하지 않지만 글을 쓰는 것은 물론 글을 쓰는 것이 실제로 털이 많습니다.


3

nethogs를 보십시오 :

NetHogs는 작은 'net top'도구입니다. 대부분의 도구와 마찬가지로 프로토콜 또는 서브넷 당 트래픽을 분류하는 대신 프로세스별로 대역폭을 그룹화합니다. NetHogs는로드 할 특수 커널 모듈에 의존하지 않습니다. 갑자기 많은 네트워크 트래픽이 발생하면 NetHog를 시작하고 이로 인해 어떤 PID가 발생했는지 즉시 확인할 수 있습니다. 이를 통해 야생에 빠지고 갑자기 대역폭을 차지하는 프로그램을 쉽게 식별 할 수 있습니다.

2
안타깝게도 단일 프로세스를 모니터링 할 수 없으며 기록하지 않습니다. 두 번째 요구 사항 (로깅)은 첫 번째 요구 사항보다 훨씬 중요합니다. 아, 그리고 그것은 관리자 권한없이 실행되지 않습니다 :(
tshepang

1
거의 확실하게 루트 권한이 필요합니다.
Falmarri

nethogs를 -t 플래그 (tracemode)와 함께 사용할 수 있습니다. 결과 출력을 분석하여 관심있는 단일 프로세스의 트래픽을 추출 할 수 있습니다.
Valerio Schiavoni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.