프로세스에서 많은 메모리를 소비하는 것이 무엇인지 알아보려고 하여 읽어 보았습니다 /proc/pid/smaps
(여기서 pid는 프로세스의 pid입니다).
나를 혼란스럽게 하는 것은 일부 항목에 이름이 없다는 것입니다. 예를 들어:
4805d000-4805e000 rwxp 0001d000 00:0b 19674210 /lib/ld-2.6.so
Size: 4 kB
Rss: 4 kB
Pss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 4 kB
Referenced: 4 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
4805e000-4805f000 ---p 00000000 00:00 0
Size: 4 kB
Rss: 0 kB
Pss: 0 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
4805f000-4885e000 rwxp 00000000 00:00 0
Size: 8188 kB
Rss: 8188 kB
Pss: 8188 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 8188 kB
Referenced: 8188 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
위에서 첫 번째 항목에는 name 이 있지만 /lib/ld-2.6.so
두 번째 및 세 번째 항목에는 이름이 없습니다. 그렇다면 이름 없는 항목은 무엇입니까? 어떤 라이브러리가 해당 라이브러리를 생성했는지 확인하는 방법은 무엇입니까?
궁금해서, 내 프로그램에서 무엇이 메모리를 소비하는지 알아내려고 시도할 수 있는 다른 것(valgrind 외에)이 있습니까?
커널 코드를 자세히 살펴본 후 이러한 항목은 실제로 어떤 파일(fs/proc/task_mmu.c)에도 매핑될 수 없다는 사실을 발견했습니다. 그러나 질문은 남아 있습니다. 그것은 무엇입니까? mmap()을 메모리 할당 방법으로 사용하시겠습니까?
답변1
이름이 없는 영역은 충분히 커져서 생성될 수 있습니다 malloc
.
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int *ip;
char *before, *after;
asprintf(&before, "cat /proc/%d/smaps > before", getpid());
asprintf(&after, "cat /proc/%d/smaps > after", getpid());
system(before);
ip = malloc(9999999);
if (!ip) abort();
system(after);
return 0;
}
그림에서 알 수 있듯이
$ CFLAGS=-g make ilikebigmallocs
cc -g ilikebigmallocs.c -o ilikebigmallocs
$ ./ilikebigmallocs
$ diff before after
64a65,80
> 7f97425ac000-7f9742f36000 rw-p 00000000 00:00 0
> Size: 9768 kB
> Rss: 4 kB
...
따라서 적어도 귀하의 영역 중 일부는 malloc
아마도 유사한 것(비하인드 스토리라고 함 mmap
)에 의해 생성되었을 것입니다. strace
(또는 sysdig
) 다음을 기록할 수 있습니다.
$ strace -e trace=memory -o blah ./ilikebigmallocs
$ awk '/^mmap/{print $NF}' blah
0x7fc6193b1000
0x7fc6193a6000
...
$ grep 7fc6193b1000 after
7fc6193b1000-7fc6193b2000 rw-p 00000000 00:00 0
$
메모리가 부족한 프로세스에서 특정 코드의 특정 백업을 gdb
처리하기 위해 malloc 추적기나 다른 것을 사용할 수 있을 것 같습니다 .mmap