/proc/pid/smaps에 이름이 없는 항목은 무엇입니까?

/proc/pid/smaps에 이름이 없는 항목은 무엇입니까?

프로세스에서 많은 메모리를 소비하는 것이 무엇인지 알아보려고 하여 읽어 보았습니다 /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

관련 정보