2009-05-13 3 views
6

특정 상태에서 다양한 프로그램이 얼마나 많은 메모리를 터치했는지 추적하고 싶습니다. 예를 들어 그래픽 프로그램이 있다고 가정 해 보겠습니다. 이미지와 글꼴을 읽고 많은 수의 라이브러리 함수를 실행해야하는 창을 다시 그리지 않으므로 최소화 할 때 메모리 사용량이 현저히 줄어들 수 있습니다. 이러한 개체는 여전히 메모리에서 액세스 할 수 있지만 실제로 사용되지는 않습니다.리눅스 프로그램에서 메모리를 적극적으로 사용 추적하기

와 같은 도구는 프로그램의 주소 공간에 매핑되는 메모리의 양과 실제 RAM에있는 메모리의 양을 알려주기 때문에 제한적으로 사용됩니다. 마찬가지로 누설 감지기는 메모리가 액세스 할 수없는 경우에만 알려주고, 메모리가 사용되지 않는 경우에는 알려주지 않습니다.

이러한 방식으로 실제로 사용되거나 사용되지 않은 메모리를 추적 할 수있는 기존 도구가 있습니까? 가능하다면, 힙뿐만 아니라 프로그램/라이브러리 코드를 저장하는 메모리에서도 사용법을 추적하고 싶습니다.


편집 : 명확히하고 싶습니다 : 나는 특정 상태에 도달하면 프로그램이 실제로, 즉, 읽기, 쓰기, 또는 특정 시점 이후 실행 훨씬 많은 메모리를 알고 싶어요. 주소 공간의 페이지 수와 거주 페이지 수가 중요한 측정 값이지만 이는 내가 찾고있는 것이 아닙니다.

지금은 세 가지 방법을 추구하고 있습니다 :

  1. 난은/proc/셀프 /지도 읽기 (스택과 자신의 코드 제외) 모든 메모리 영역의 보호 비트를 지 웁니다 라이브러리를 작성했습니다 `mprotect`를 사용합니다. 보호 비트를 복원하고 카운터를 증가시키는 segfault 핸들러가 있습니다. `LD_PRELOAD`를 사용하여로드하고 신호 수신시 메모리 액세스 추적을 시작합니다. 이것은 겉으로보기에는 가짜 주소 (실제 오류가 발생했을 때 레지스터 또는 주변 메모리에 저장되지 않음)로 일부 오류를 생성합니다.
  2. `mmap`이 오류를 반환 할 때까지`mmap`을 사용하여 메모리에서 할당하고 읽는`purge` 프로그램을 작성했습니다. 이렇게하면 'purge'가 실행되는 동안 일시 중지되는 대상 프로세스의 모든 페이지가 강제로 종료됩니다. 그런 다음,`pidstat`를 사용하여 대상 프로세스가 재개 될 때 페이지 인의 수를 셉니다. 이것은 효과가있는 것처럼 보이지만 매우 둔감 한 도구입니다. 터치 된 페이지에 대한 정보는 제공하지 않습니다.
  3. 나는 valgrind가 특정 이벤트 (예 : 메모리 액세스)에서 특정 동작을 실행하게하는 플러그인을 작성할 수 있다고 들었습니다. 이것은 지금까지 유망 해 보인다.
+0

중복 : http://stackoverflow.com/questions/131303/linux-how-to-measure-actual -memory-of-an-application-or-process – lothar

답변

2

valgrind 도구 인 cachegrind는 메모리 사용을 추적하는 데 유용합니다.

캐시 그릿 (cachegrind) 의 출력을 그래픽으로 표시하는 몇 가지 도구가 있습니다.

업데이트 된 정보에 응답하려면 편집 :
valgrind가 출현하기 전에 mpatrol이라는 프로젝트를 사용했습니다.
mprotect()를 사용하여 페이지를 읽기 전용으로 만들고 액세스를
페이지로 추적합니다. 또한보고를 시작하고 중지 할시기를 지정할 수 있습니다.
은 n 번째 malloc 이후와 같습니다.

많은 기능 또는 원하는 기능을 모두 수행 할 수 있습니다.

주의 할 점은, 많이 valgrind보다 느립니다.