애플리케이션의 메모리 및 CPU 사용량을 기록하는 방법은 무엇입니까?

애플리케이션의 메모리 및 CPU 사용량을 기록하는 방법은 무엇입니까?

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

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

[업데이트]

Stefano Palazzo의 깔끔하고 작은 Python 스크립트와

topMichał의 한 줄 출력 값은 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

CPU 대 RSS 플롯

관련 정보