응용 프로그램의 메모리 및 CPU 사용량을 기록하는 방법은 무엇입니까?


16

질문 CPU로드를 기록하는 방법과 유사 합니까? 프로세스의 메모리를 기록하고 싶습니다.

로깅하려는 프로세스가 원격 서버에서 종료되었으며 종료되기 직전에 CPU로드와 메모리 사용량을 찾고 싶습니다.

[최신 정보]

Stefano Palazzo의 깔끔한 작은 파이썬 스크립트와

topCPU 및 Mem 보다 작은 Michał의 한 줄 출력 값 . 왜 그런지 알아?

출력 상단 :

 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 

스테파노 팔라 조의 파이썬 스크립트 출력 :

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20

불행히도 여기에 아직 언급 할 수는 없지만이 게시물이 왜 다른지 설명 ps할 수 있습니다 top. stackoverflow.com/questions/131303/…
PM

답변:


16

쉘에서 하나의 라이너를 만들 수 있습니다.

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().


간단하고 일을한다!
rafaelbattesti

3

top통계를 정확하게 따르는 경우 이후 top에 프로세스의 pid를 지정하여 배치 모드로 실행할 수 있습니다 . 입력 한 경우이 페이지 ( 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 및 램 이상을 반환하지만 thos 필드를 포함합니다. 예를 들어 내 경우에는 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

이 페이지는 파일로의 재 지정을 수행하지는 않지만 좀 더 정교한 수정을 수행하여 인쇄 된 CPU 만 얻을 수 있습니다. 누군가 출력을 파일로 리디렉션하고 주기적으로 업데이트하는 좋은 방법을 알고 있다면 알고 싶습니다. watch이 나에게 적합하지 않는 것 : superuser.com/questions/281347/filtering-top-command-output
오후

2

이 간단한 파이썬 스크립트는 당신이 원하는 것을해야합니다 :

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 사용량과 램 사용량을 초당 2 회 백분율로 인쇄합니다.

%CPU    %MEM
0.90    0.40
1.43    0.40
8.21    0.40
...

그런 다음 출력을 파일로 리디렉션하여 나중에 스프레드 시트로 가져오고 ( python log.py 9391 > firefox_log.txt) 데이터를 스프레드 시트로 가져 와서 Tab구분 기호로 선택할 수 있습니다.

Ctrl + C를 누르거나 프로세스가 종료되면 프로그램이 종료됩니다.


스테파노 씨, 대본 감사합니다. 불행히도 잘못된 결과를 출력하는 것 같습니다. 왜 그런지 아십니까? 업데이트 된 질문을 참조하십시오.
Framester

ps 매뉴얼 페이지 man7.org/linux/man-pages/man1/ps.1.html 에서 ps는 "사용 된 CPU 시간을 프로세스가 실행 된 시간 (cputime / realtime ratio)으로 나눈 CPU 백분율을 백분율로 표시합니다. "-시작한 이후 평균 CPU 사용량을 얻습니다.
Nicolas Charles
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.