질문과 유사CPU 로드를 기록하는 방법은 무엇입니까?, 프로세스의 메모리를 기록하고 싶습니다.
로그하려는 프로세스가 원격 서버에서 종료되었으며, 종료되기 직전의 CPU 로드 및 메모리 사용량을 확인하고 싶습니다.
[업데이트]
Stefano Palazzo의 깔끔하고 작은 Python 스크립트와
top
Michał의 한 줄 출력 값은 CPU 및 Mem 보다 작습니다 . 왜 그런지 아시나요?
출력 상단:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2312 schXX 20 0 1241m 328m 58m S 100 0.3 11:56.68 MATLAB
Stefano Palazzo의 Python 스크립트를 출력합니다.
python memlogger.py 2312
%CPU %MEM
76.00 0.20
76.00 0.20
답변1
셸에서 하나의 라이너를 만들 수 있습니다.
logpid() { while sleep 1; do ps -p $1 -o pcpu= -o pmem= ; done; }
pid=123으로 프로세스를 기록하려면 다음을 수행하십시오.
logpid 123
또는 파일에 로그를 보고 쓰려면:
logpid $$ | tee /tmp/pid.log
다른 데이터를 기록하려면 -o {this}
옵션을 수정하세요. man ps
사용할 수 있는 매개변수는 "표준 형식 지정자" 섹션을 참조하세요 . 다른 시간 해상도를 원하면 sleep {this}
기능을 변경하세요 logpid()
.
답변2
통계를 정확히 따르는 경우에는 원하는 프로세스의 pid를 지정하여 배치 모드로 top
실행할 수 있습니다 . top
이 페이지의 예를 들어보면(http://www.dedoimedo.com/computers/linux-cool-hacks.html) 입력한 경우
top -b -d 10 -n 3 >> top-file
"일괄 처리 모드(-b)에서 최고 실행이 가능합니다. 지연(-d) 플래그에 지정된 대로 총 3회 반복 횟수(-n)에 대해 10초마다 새로 고쳐집니다. 출력이 전송됩니다. 파일로." 당신을 포함하여 당신이 따르는 프로세스를 -p
지정할 수 있습니다 . pid
물론 이것은 순전히 CPU 및 RAM 이상의 것을 반환하지만 해당 필드를 포함합니다. 예를 들어 내 경우에는 다음을 사용하여 pid 9189를 모니터링할 때 다음을 얻습니다 top -b -d 10 -n 3 -p 9189 >> ~/top-file
.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9189 pmj27 20 0 1617016 808112 27916 S 0.0 0.3 1:36.63 gedit
답변3
이 간단한 Python 스크립트는 원하는 작업을 수행해야 합니다.
import time
import string
import sys
import commands
def get_cpumem(pid):
d = [i for i in commands.getoutput("ps aux").split("\n")
if i.split()[1] == str(pid)]
return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None
if __name__ == '__main__':
if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
print("usage: %s PID" % sys.argv[0])
exit(2)
print("%CPU\t%MEM")
try:
while True:
x,y = get_cpumem(sys.argv[1])
if not x:
print("no such process")
exit(1)
print("%.2f\t%.2f" % (x,y))
time.sleep(0.5)
except KeyboardInterrupt:
print
exit(0)
먼저 모니터링하려는 프로그램의 프로세스 ID를 찾아야 합니다. 그런 다음 PID를 인수로 사용하여 스크립트를 실행할 수 있습니다.
python log.py 3912
CPU 사용량과 RAM 사용량을 1초에 두 번 퍼센트 단위로 인쇄합니다.
%CPU %MEM
0.90 0.40
1.43 0.40
8.21 0.40
...
그런 다음 나중에 스프레드시트로 가져오기 위해 출력을 파일로 리디렉션하고( ) 구분 기호로 python log.py 9391 > firefox_log.txt
선택하여 데이터를 스프레드시트로 가져올 수 있습니다.Tab
Ctrl+C를 누르거나 프로세스가 종료되면 프로그램이 종료됩니다.
답변4
프로패스CPU 사용량 및 RSS(Resident Set Size)를 포함하여 애플리케이션(프로세스 트리)의 Procfs 메트릭을 기록하는 데 사용할 수 있습니다. 전체 공개: 제가 썼습니다.
Firefox를 예로 들어보겠습니다. 내 컴퓨터의 프로세스 트리는 다음과 같습니다.
/usr/lib/firefox/firefox
├─ /usr/lib/firefox/firefox -contentproc -childID 4 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 3 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 2 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 1 ...
├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
└─ /usr/lib/firefox/firefox -contentproc -childID 8 ...
Procpath를 사용하면 다음과 같이 이 트리에서 프로세스 메트릭을 수집할 수 있습니다.문서루트 PID에 대해 연합의 프로세스 감독자(예: systemd 또는 Docker)에게 문의하려는 경우:
procpath record -d firefox.sqlite '$..children[?(@.stat.comm == "firefox")]'
이 명령을 사용하면 Procpath는 10초마다 한 번씩 이 트리의 Procfs 메트릭을 수집하고 기록합니다. Byobu와 같은 터미널 멀티플렉서에서 실행되도록 하여 서버의 백그라운드에서 실행할 수 있습니다.
애플리케이션이 다시 충돌하는 경우 이 명령을 사용하여 애플리케이션의 CPU 사용량과 상주 세트 크기를 시각화할 수 있습니다.
procpath plot -d firefox.sqlite -f firefox.svg -q cpu -q rss --formatter=integer