it-swarm-ko.tech

단일 프로세스의 CPU / 메모리 사용량을 모니터링하는 방법은 무엇입니까?

하나의 프로세스 메모리/CPU 사용량을 실시간으로 모니터링하고 싶습니다. top와 유사하지만 하나의 프로세스 만 대상으로하는 것이 바람직합니다.

194
Josh K

Linux에서 top는 실제로 단일 프로세스에 대한 포커스를 지원하지만 실제로는 히스토리 그래프가 없습니다.

top -p PID

Mac OS X에서도 다른 구문으로 사용할 수 있습니다.

top -pid PID
157
Michael Mrozek

psrecord

다음은 역사 그래프입니다. Python psrecord 패키지는 정확히 이것을 수행합니다.

pip install psrecord                             # local user install
Sudo apt-get install python-matplotlib python-tk # for plotting; or via pip

단일 프로세스의 경우 다음과 같습니다. Ctrl+C) :

psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png

여러 프로세스에서 다음 스크립트는 차트를 동기화하는 데 도움이됩니다.

#!/bin/bash    
psrecord $(pgrep proc-name1) --interval 1 --duration 60 --plot plot1.png &
P1=$!
psrecord $(pgrep proc-name2) --interval 1 --duration 60 --plot plot2.png &
P2=$!
wait $P1 $P2
echo 'Done'

차트는 다음과 같습니다. psrecord example

memory_profiler

package 는 RSS 전용 샘플링과 일부 Python 관련 옵션을 제공합니다. 또한 자식 프로세스를 사용하여 프로세스를 기록 할 수도 있습니다 (mprof --help).

pip install memory_profiler
mprof run /path/to/executable
mprof plot

기본적으로 이것은 Tkinter 기반 (python-tk 필요한 경우) 차트 탐색기를 내보낼 수 있습니다.

mprof

흑연 스택 및 통계

간단한 일회성 테스트에는 과잉으로 보일 수 있지만 며칠 동안의 디버깅과 같은 것은 확실히 합리적입니다. 편리한 올인원 raintank/graphite-stack (Grafana의 저자) 이미지 및 psutilstatsd 클라이언트 procmon.py 구현을 제공합니다.

$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack

그런 다음 대상 프로세스를 시작한 후 다른 터미널에서 :

$ Sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'

그런 다음 http : // localhost : 808 에서 Grafana를 열고 admin:admin, 데이터 소스 설정 https : // localhost , 다음과 같은 차트를 그릴 수 있습니다.

grafana chart

흑연 스택 및 전신

Python 통계를 Statsd로 보내는 스크립트 대신 telegraf (및 procstat 입력 플러그인)을 사용하여 지표를 보낼 수 있습니다 흑연에 직접.

최소 telegraf 구성은 다음과 같습니다.

[agent]
  interval = "1s"

[[outputs.graphite]]
  servers = ["localhost:2003"]
  prefix = "testprfx"

[[inputs.procstat]]
  pid_file = "/path/to/file/with.pid"

그런 다음 줄 telegraf --config minconf.conf. 메트릭 이름을 제외하고 Grafana 부분은 동일합니다.

pidstat

pidstat (sysstat 패키지의 일부)는 쉽게 구문 분석 할 수있는 출력을 생성 할 수 있습니다. 프로세스에서 추가 메트릭이 필요한 경우에 유용합니다 (예 : 가장 유용한 3 개의 그룹 (CPU, 메모리 및 디스크)에는 다음이 포함됩니다. %usr, %system, %guest, %CPU, minflt/s, majflt/s, VSZ, RSS, %MEM, kB_rd/s, kB_wr/s, kB_ccwr/s. 관련 답변 에 설명했습니다.

87
saaj

htoptop를 대체합니다. 그것은 ... 색상! 간단한 키보드 단축키! 화살표 키를 사용하여 목록을 스크롤하십시오! PID를 남기지 않고 기록하지 않고 프로세스를 종료하십시오! 여러 프로세스를 표시하고 모두 종료하십시오!

모든 기능 중에서 맨 페이지에는 F 프로세스를 따라 .

실제로 htop를 시도해야합니다. top을 (를) 처음 사용한 후 htop을 (를) 다시 시작하지 않았습니다.

단일 프로세스를 표시하십시오.

htop -p PID

67
Denilson Sá Maia

스크립트에서 해당 정보를 사용하려면 다음을 수행하십시오.

calcPercCpu.sh

#!/bin/bash
nPid=$1;
nTimes=10; # customize it
delay=0.1; # customize it
strCalc=`top -d $delay -b -n $nTimes -p $nPid \
  |grep $nPid \
  |sed -r -e "s;\s\s*; ;g" -e "s;^ *;;" \
  |cut -d' ' -f9 \
  |tr '\n' '+' \
  |sed -r -e "s;(.*)[+]$;\1;" -e "s/.*/scale=2;(&)\/$nTimes/"`;
nPercCpu=`echo "$strCalc" |bc -l`
echo $nPercCpu

다음과 같이 사용하십시오 : calcPercCpu.sh 1234 여기서 1234는 pid입니다

지정된 $ nPid의 경우 CPU 사용량의 스냅 샷 10 개 중 평균를 1 초 전체로 측정합니다 (각 0.1 초 지연 * nTimes = 10). 그것은 현재 일어나고있는 일에 대한 정확하고 빠른 결과를 제공합니다.

필요에 따라 변수를 조정하십시오.

8
Aquarius Power

나는 일반적으로 다음 두 가지를 사용합니다.

  1. HP caliper : 프로세스 모니터링을위한 매우 유용한 도구로, 호출 그래프 및 기타 저수준 정보도 확인할 수 있습니다. 그러나 개인 용도로만 무료로 제공됩니다.

  2. daemontools : UNIX 서비스 관리를위한 도구 모음

5
Hemant

topawk을 사용하면 쉽게 만들 수 있습니다. 쉼표로 구분 된 % CPU ($9) + % MEM ($10) 사용 로그는 나중에 통계 및 그래프 도구에 제공 할 수 있습니다.

top -b -d $delay -p $pid | awk -v OFS="," '$1+0>0 {
print strftime("%Y-%m-%d %H:%M:%S"),$1,$NF,$9,$10; fflush() }'

출력은 다음과 같습니다

2019-03-26 17:43:47,2991,firefox,13.0,5.2
2019-03-26 17:43:48,2991,firefox,4.0,5.2
2019-03-26 17:43:49,2991,firefox,64.0,5.3
2019-03-26 17:43:50,2991,firefox,71.3,5.4
2019-03-26 17:43:51,2991,firefox,67.0,5.4

top의 출력이 작동하는 방식으로 인해 인쇄 된 타임 스탬프가 실제로 $delay 뒤에 있기 때문에 큰 $delay에 대해서는 좋은 결과를 얻지 못합니다. 너무 자세하게 설명하지 않고이 문제를 해결하는 간단한 방법은 top에서 제공 한 시간을 기록하는 것입니다.

top -b -d $delay -p $pid | awk -v OFS="," '$1=="top"{ time=$3 }
$1+0>0 { print time,$1,$NF,$9,$10; fflush() }'

그러면 타임 스탬프는 정확하지만 출력은 여전히 ​​$delay만큼 지연됩니다.

5
xebeche

프로세스 이름을 알고 있다면 사용할 수 있습니다

top -p $(pidof <process_name>)
2
user4757345

여기서 조금 늦었지만 기본 ps

WATCHED_PID=$({ command_to_profile >log.stdout 2>log.stderr & } && echo $!);
while ps -p $WATCHED_PID --no-headers --format "etime pid %cpu %mem rss"; do 
   sleep 1 
done

나는 이것을 하나의 라이너로 사용합니다. 여기서 첫 번째 줄은 명령을 실행하고 변수에 PID를 저장합니다. 그런 다음 ps는 경과 시간, PID 사용 CPU 백분율, 백분율 메모리 및 RSS 메모리를 인쇄합니다. 다른 필드도 추가 할 수 있습니다.

프로세스가 종료 되 자마자 ps 명령은 "성공"을 반환하지 않으며 while 루프가 종료됩니다.

프로파일 링하려는 PID가 이미 실행중인 경우 첫 번째 라인을 무시할 수 있습니다. 원하는 id를 변수에 넣으십시오.

다음과 같은 결과가 나타납니다.

  00:00  7805  0.0  0.0  2784
  00:01  7805 99.0  0.8 63876
  00:02  7805 99.5  1.3 104532
  00:03  7805  100  1.6 129876
  00:04  7805  100  2.1 170796
  00:05  7805  100  2.9 234984
  00:06  7805  100  3.7 297552
  00:07  7805  100  4.0 319464
  00:08  7805  100  4.2 337680
  00:09  7805  100  4.5 358800
  00:10  7805  100  4.7 371736
  ....
2
theist

논평할만한 평판은 충분하지 않지만 psrecord의 경우 프로그래밍 방식으로 직접 파이썬에서 직접 호출 할 수 있습니다.

from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
2
ZettaCircl

Top에 프로세스 당 (-p) 옵션 또는 관련 옵션이없는 컷 다운 Linux 배포가있는 경우 프로세스 이름에 대한 top 명령의 출력을 구문 분석하여 프로세스 당 CPU 사용량 정보를 얻을 수 있습니다.

while true;  do top -bn1 | awk '/your_process_name/ {print  $8}' ; sleep 1; done

8은 임베디드 Linux 배포판의 top 명령 출력에서 ​​프로세스 당 CPU 사용량을 나타냅니다.

1
Razan Paul
pidstat -p 7994 2 

03:54:43 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:54:45 PM     0      7994    1.50    1.50    0.00    3.00     1  AliYunDun
03:54:47 PM     0      7994    1.00    1.00    0.00    2.00     0  AliYunDun

2 초마다 인쇄 프로세스 7994 CPU 사용량

0
赵宝磊

특정 프로세스 기간 동안 평균이 필요한 경우 top의 accumulative -c 옵션을 시도하십시오.

top -c a -pid PID

Mac 10.8.5 용 상단에서 "-c a"를 찾았습니다.

Scientific Linux의 경우 옵션은 -S이며 대화식으로 설정할 수 있습니다.

0
Kieleth