찾았어요좋은 모니터이를 통해 단일 프로세스에 대한 다양한 런타임 데이터를 기록할 수 있습니다. 대역폭 사용량과 동일한 작업을 수행하는 동등한 방법을 찾고 있습니다. 이상적으로 명령은 bwmon --pid 1 --log init.log
다음과 같아야 합니다. 관리자 권한 없이 실행이 가능한가요?
답변1
사용된 일반 I/O 대역폭에 만족하는 경우(또는 프로그램이 거의 독점적으로 네트워크 I/O를 수행하는 경우) 파일을 볼 수 있습니다 /proc/<pid>/io
. 당신은 필드 rchar
를 원합니다 wchar
. 합계 는 스토리지 계층에 대한 읽기 및 쓰기를 나타내므로 read_bytes
합계를 빼야 할 수도 있습니다 . write_bytes
섹션 3.3을 참조하세요.http://www.kernel.org/doc/Documentation/filesystems/proc.txt.
더 많은 솔루션이 필요하다면... lsof
이 스크립트를 사용하고 작성할 수 있습니다 strace
. 하지만 모든 특수한 경우를 올바르게 처리하는 것은 어려울 것입니다. 기본 아이디어는 , 및 호출 의 출력 strace -p <pid>
을 구문 분석하는 것입니다(read()
write()
send()
recv()
노트수신할 시스템 호출이 몇 개 더 있습니다. 아직 모두 추적하지 않았습니다. 음수 값은 삭제되며 오류를 나타냅니다. lsof -p <pid>
어떤 파일 설명자가 TCP/UDP 소켓인지 확인하고 각 fd의 수를 합산하는 데 사용됩니다 . 이 정책은 확인 중인 프로세스를 소유하고 있는 한 루트가 필요하지 않지만 잘 작성하는 것은커녕 작성하기가 정말 번거롭습니다.
답변2
노력하다인터넷돼지:
NetHogs는 작은 "netHogs" 도구입니다. 대부분의 도구처럼 프로토콜이나 서브넷별로 트래픽을 분류하는 대신 프로세스별로 대역폭을 그룹화합니다. NetHogs는 로드하기 위해 특수 커널 모듈에 의존하지 않습니다. 네트워크 트래픽이 갑자기 급증하는 경우 NetHogs를 시작하고 어떤 PID가 상황을 일으키는지 즉시 확인할 수 있습니다. 이렇게 하면 미친 듯이 실행되고 갑자기 대역폭을 차지하는 프로그램을 쉽게 식별할 수 있습니다.
답변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초마다 확인
- Linux에서만 작동하지만 다른 Unix에서도 비슷하게 작동합니다(procfs 또는 기타).
- 출력은 sqlite.db에 저장될 수 있습니다.
stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3