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


170

하나의 프로세스 메모리 / CPU 사용량을 실시간으로 모니터링하고 싶습니다. top바람직하게는 일종의 이력 그래프를 사용하여 하나의 프로세스와 유사 하지만 하나의 프로세스만을 목표로한다.


어떤 메모리 통계를 원하십니까? 그것들이 많이 있습니다.
vwduder

주어진 기간 동안의 메모리 사용량, 현재 사용량, 최대 사용량, 평균.
Josh K

답변:


139

Linux에서는 top실제로 히스토리 그래프가 없지만 단일 프로세스에 대한 초점을 실제로 지원합니다.

top -p PID

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

top -pid PID

9
그리고 매번 PID를 조회하고 싶지 않을 수도 있으므로 다음과 같이 시도하십시오 top -p `pgrep -f /usr/bin/kvm`.
Stefan Lasiewski

나는 Cacti를 사용하여 개별 프로세스를 모니터링하지만, 여기에 요구되는 간단한 상황에 대해서는 완전한 Cacti 설치를 설치하는 것이 너무 복잡하게 들립니다.
Stefan Lasiewski

@ 스테판 : 나는 그것을 원격으로 실행해야한다고 가정하고 있습니까?
Josh K

@Josh : 예 다른 서버에서 Cacti (MySQL, Apache 및 기타 패키지가 필요한 패키지)를 실행해야합니다. 대부분의 배포판에서 Yum 또는 apt-get을 사용하여 설치하는 것은 매우 간단합니다.
Stefan Lasiewski

@Stefan 만약 당신이 remoly 체크하고 싶다면 ssh @ remotehost 'top -p PID> ~ hostname_pid.txt; exit'and
klerk

61

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

모든 기능 중 맨 페이지 에 프로세스 F따르 려면을 (를) 누르 십시오 .

정말로, 당신은 시도해야합니다 htop. top처음 사용한 후에는 다시 시작하지 않았습니다 htop.

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

htop -p PID


7
멈춤 +1 이것은 내가 새로운 시스템에 설치 한 첫 번째 프로그램 중 하나입니다. 내 인생이 훨씬 쉬워집니다. 트리 뷰도 매우 편리합니다.
Barthelemy

9
top색상도 있습니다. 를 누릅니다 z.
tshepang

2
네가 옳아! top색상이 있습니다! 색상이 너무 나쁘면, 특히 htop다른 사용자 프로세스를 희미하게하고 프로그램 기본 이름을 강조하는 것과 비교할 때 특히 쓸모가 없습니다 .
Denilson Sá Maia

1
그리고 htop -p PID단지 @Michael Mrozek에 의해 주어진 예제와도 작동합니다.
noisebleed에

1
그런 다음 top을 사용해야하는 이유는 htop을 사용할 수 없거나 설치할 수 없기 때문입니다. 더 많은 기능을 제공하기 위해 htop이 만들어졌습니다.
lepe

59

psrecord

다음은 일종의 히스토리 그래프를 설명합니다 . 파이썬 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 예

memory_profiler

패키지 는 RSS 전용 샘플링과 일부 Python 관련 옵션을 제공합니다. 또한 자식 프로세스와 함께 프로세스를 기록 할 수도 있습니다 (참조 mprof --help).

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

기본적으로 이것은 python-tk내보낼 수 있는 Tkinter 기반 ( 필요할 수도 있음) 차트 탐색기를 팝업합니다 .

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 : 8080 에서 Grafana를 열고 authentication as admin:admin을 설정하고 datasource https : // localhost 를 설정하면 다음과 같은 차트를 그릴 수 있습니다.

그래프 나 차트

흑연 스택 및 전신

통계를 Statsd로 전송하는 Python 스크립트 telegraf(및 procstat입력 플러그인) 대신 Graphite로 직접 전송하는 데 사용할 수 있습니다.

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

[agent]
  interval = "1s"

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

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

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

sysdig

sysdigsysdig-inspect UI를 사용하여 (Debian 및 Ubuntu의 repos에서 사용 가능) CPU 사용률 및 RSS와 함께 매우 세밀한 세부 정보를 제공하지만 매우 유망하게 보이지만 불행히도 UI는 렌더링 할 sysdig 수 없으며 procinfo 프로세스별로 이벤트를 필터링 할 수 없습니다 . 쓰기 시간. 그러나 이것은 맞춤 ( sysdig루아로 작성된 확장) 으로 가능해야합니다 .


pgrep systemd는 여러 줄의 출력을 제공하므로 psrecord에 버그가 있습니다. 어떻게해야합니까? 모든 프로세스로 테스트하고 싶습니다.
EralpB

1
pgrep --help구조에 @EralpB . 적어도있다 --newest--oldest.
saaj

2
실제로 메모리 사용 히스토리 플롯을 제공하므로 허용되는 답변이어야합니다. psrecord 방법에 대한 참고 사항 Ctrl+C은 psrecord 프로세스에서 플롯을 저장하지 않고 종료되므로 테스트 대상 프로세스를 종료해야합니다.
user2561747

8

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

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의 경우 전체 1 초 동안 CPU 사용량 의 평균 10 개 스냅 샷을 측정합니다 (각 0.1 초 지연 * nTimes = 10). 그것은 현재 일어나고있는 일에 대한 정확하고 빠른 결과를 제공합니다.

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


흠, 10 프로세스가 CPU 사용량을 1로 모니터링합니까?
xebeche

@xebeche " 평균 10 개의 스냅 샷 을 측정합니다 " "nTimes = 10; # 사용자 지정 ":)
Aquarius Power

$nPercCpu쉘, 탑, grep, sed, cut ... bc : 10 개의 프로세스를 호출하여 1 개의 숫자 ( ) 를 검색한다는 사실이 마음에 들지 않습니다 . 예를 들어 1 Sed 또는 Awk 스크립트로 병합 할 수있는 것은 아닙니다.
xebeche

@ xebeche cool, 기존 명령에 더 나은 명령을 추가하여 편집하십시오 (대안으로). 내 호기심을 얻었습니다 :)
Aquarius Power

1
내 답변을 추가했습니다 . BTW, top출력 평균 이상 이므로 평균을 계산할 때 아무런 의미가 없습니다 $delay. Cf. CPU 사용량 계산 방법
xebeche

5

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

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

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


6
몇 년 동안 daemontools를 사용했습니다. 다른 프로세스의 감독자 / 감독으로서 훌륭합니다. 한 프로세스의 CPU / 메모리 사용량을 모니터링하는 데 어떻게 도움이됩니까?
Stefan Lasiewski

3

를 사용하면 쉼표로 구분 된 % CPU ( ) + % MEM ( ) 사용 로그를 쉽게 생성 할 수 top있으며,이 awk로그 는 나중에 통계 및 그래프 도구에 제공 할 수 있습니다.$9$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

$delay그러나 출력 타임 스탬프가 실제로 출력 방식에 $delay따라 뒤쳐져 있기 때문에 큰 결과는 좋지 않습니다 top. 너무 자세하게 설명하지 않고 간단한 해결 방법은 다음과 같이 제공된 시간을 기록하는 것입니다 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.


2

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

top -p $(pidof <process_name>)

8
그것은 몇 년 전부터 받아 들여진 대답과 첫 번째 의견이 말한 것과 거의 같습니다.
dhag

1

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

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

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


1

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

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

0

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

top -c a -pid PID

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

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


top실제로이 기능을 제공 하는 버전에 대한 자세한 내용을 추가하고 싶을 것 입니다. Fedora 19의 내 버전은 그렇지 않습니다. 우분투 13.04에서도 마찬가지입니다.
slm

당신이 맞아요!, 유용한 것을 발견해서 너무 기뻤습니다. 집에있는 Mac에서 잊어 버렸습니다.
Kieleth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.