스크립트(예: Python)를 실행하고 있다고 가정해 보겠습니다. 프로그램이 얼마나 오래 걸렸는지 알아보려면 다음을 실행하세요.
time python script1.py
스크립트가 실행되는 동안 얼마나 많은 RAM을 사용하는지 추적할 수 있는 명령이 있습니까? 사용 가능한 RAM 용량을 확인하려면 을 사용할 수 있지만 free
이 명령은 위 작업에 적합하지 않습니다.
답변1
이것시간(1)명령( time
패키지로 설치해야 할 수도 있고 에 있어야 함 /usr/bin/time
)은 이해할 수 있는 형식 문자열을 포함하여 많은 인수를 허용합니다( -f
또는 사용 --format
) .
%M Maximum resident set size of the process during its lifetime,
in Kbytes.
%K Average total (data+stack+text) memory use of the process, in
Kbytes.
/usr/bin/time
이 명령을 다음과 결합하지 마십시오 .time
배쉬 내장. 전체 파일 경로를 입력해야 할 수도 있습니다 /usr/bin/time
(셸에서 실행하도록 요청하려면).주문하다내장되지 않음) 또는 유형 command time
또는 \time
(감사합니다토비 스페이트& 도착하다화살그들의 의견을 물어보세요).
시도해 볼 수 있습니다(RSS는상주 세트 크기)
/usr/bin/time -f "mem=%K RSS=%M elapsed=%E cpu.sys=%S user=%U" python script1.py
당신은 또한 시도할 수 있습니다
/usr/bin/time --verbose python script1.py
질문하신 내용은 다음과 같습니다.
스크립트가 실행되는 동안 얼마나 많은 RAM이 사용됩니까?
이는 당신이 오해하고 있음을 나타냅니다. Linux(또는 최신 다중 프로세스 운영 체제)에서 실행되는 애플리케이션은 다음을 사용합니다.가상 메모리, 그리고 각각프로세스( python
스크립트를 실행하는 프로세스 포함)에는 자체가상 주소 공간.프로세스가 실행되고 있지 않음곧장존재하다물리적RAM이지만 자체 가상 주소 공간이 있음(그리고 그 안에서 실행) 커널은 복잡한 방식으로 가상 메모리를 구현합니다.페이징 요청게으름을 이용하라쓰기 중 복사기술과 구성메모리 관리 유닛. 이것메모리사용 및 관리되는 물리적 장치 및 리소스입니다.내부가상 메모리는 커널에 의해 구현됩니다(참조:페이지 캐시그리고 약이기다).
며칠 동안 더 자세히 알아보고 싶을 수도 있습니다.운영 체제. 나는 독서를 추천한다운영 체제: 세 가지 간단한 부분무료로 다운로드할 수 있는 책입니다. RAM은 전체 운영 체제에서 사용되며(개별 프로세스에서 직접 사용하지 않음) 특정 프로세스 RAM의 실제 페이지는 시간이 지남에 따라 변경될 수 있습니다(그리고 어떤 방식으로 다른 프로세스와 공유될 수 있음). 따라서 특정 프로세스의 RAM 소비는 지속적으로 변경되므로(평균 또는 최고 값 등이 필요할 수 있음) 잘 정의되지 않으며 가상 주소 공간의 크기도 마찬가지입니다.
다음을 사용할 수도 있습니다(특히 스크립트가 몇 초 동안 실행되는 경우).탑(1)유틸리티(다른 터미널에 있을 수도 있음) 또는참고(1)또는매핑(1)- 어쩌면 사용할지도시계(1)명령을 반복 ps
하십시오 pmap
. 직접 사용할 수도 있습니다 /proc/
(참조공정(5)...) 아마도 watch cat /proc/$(pidof python)/status
또는 또는 /proc/$(pidof python)/stat
등등 /proc/$(pidof python)/maps
...
하지만메모리 사용량(일부 프로세스의 커널에 의해)예넓게시간에 따라 변화특정 프로세스에 대해(가상 주소 공간도 변경됩니다. 예를 들어 호출을 통해)매핑(2)그리고 munmap
사용 되다ld-리눅스(8),드로펜(3),할당(3)& free
및 Python 인터프리터에 필요한 다른 많은 기능...).
당신은 또한 사용할 수 있습니다트랙(1)이해하다시스템 호출스크립트에 대해 Python에서 수행됨(따라서 mmap
& munmap
및 기타 사용 방법을 이해할 수 있음)시스템 호출(2)) 또는 메모리(예: 가상 주소 공간)와 관련된 시스템 호출로만 가져오기를 제한 strace
할 수 있습니다.-e trace=%memory
-e trace=memory
그런데,메모리 할당 추적Python 함수도 유용할 수 있습니다.
그럴 수도 있을 것 같아요너오직가상에 관심을 가져라메모리이는 Python 인터프리터가 Python 스크립트를 실행하는 데 사용하는 가상 주소 공간(RAM은 아님)에 관한 것입니다. 이는 프로세스 실행 중에 변경됩니다. 실제로는 RSS(또는 가상 주소 공간의 최대 피크 크기)가 더 유용할 수 있습니다.
당신은 또한 볼 수 있습니다리눅스AteMyRAM.
답변2
전설을 사용할 수도 있습니다.valgrind
, 패키지 관리자에서 설치해야 할 수도 있습니다.
$ valgrind c-projects/objtest/bin/objtest
==6543== Memcheck, a memory error detector
==6543== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==6543== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info
==6543== Command: c-projects/objtest/bin/objtest
==6543==
|ERROR|array:189: array_delete: delete index 0 but the highest is -1 (delete from empty array): index out of bounds
==6543==
==6543== HEAP SUMMARY:
==6543== in use at exit: 480 bytes in 20 blocks
==6543== total heap usage: 7,390 allocs, 7,370 frees, 256,217 bytes allocated
==6543==
==6543== LEAK SUMMARY:
==6543== definitely lost: 96 bytes in 4 blocks
==6543== indirectly lost: 384 bytes in 16 blocks
==6543== possibly lost: 0 bytes in 0 blocks
==6543== still reachable: 0 bytes in 0 blocks
==6543== suppressed: 0 bytes in 0 blocks
==6543== Rerun with --leak-check=full to see details of leaked memory
==6543==
==6543== For counts of detected and suppressed errors, rerun with: -v
==6543== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
고급 사용자이고 아름다운 차트를 원한다면 ms_print
다음과 같은 명령을 사용할 수 있습니다.
valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1
답변3
pmap 명령을 사용하면 프로세스에서 사용하는 메모리 양을 볼 수 있습니다. 귀하의 경우 pmap 명령에 대한 입력으로 스크립트의 PID를 제공해야 합니다.
pmap $(ps -ef | grep **<SCRIPT NAME>** | grep -v grep | awk '{print $2}')