메모리 누수를 감지하는 방법?


16

현재 우분투 시스템에서 메모리 누수가 더 큰 것 같습니다

이상한 Eclipse 메모리 오류를보고 한 후 ( /ubuntu/148998/eclipse-constant-different-out-of-memory-errors ) 오늘 콘솔에 '메모리 부족'오류 메시지가 표시되기 시작했습니다. 입력하는 것과 같은 간단한 작업을 수행 sudo -s하거나 심지어free -m

'자유 -m'에서 타이핑 repeadetly 내 RAM 빠르게 900M에 700M에서 (로 메모리를 확보 한 후 몇 초에 2000M의 크기까지 성장까지가는 방법을 나에게 보여 주었다 echo 3 > /proc/sys/vm/drop_caches)

이클립스가 원인이 아니기 때문에 프로세스를 완전히 종료했으며 램이 계속 올라갔습니다. 누출이 어디에서 발생하는지 감지 할 수있는 방법이 있습니까? apt-get update실패했기 때문에 시스템을 더 이상 업데이트 할 수 없습니다 (아마도 메모리가 부족하기 때문에)

사용 Ubuntu 11.10


나는 내가 미쳤다고 매우 행복하다. 13.10으로 업그레이드 한 후 동일한 문제가 있었지만 11.10과 함께하는 것을 기억합니다. 질문은 CrashPlan을 사용하고 있습니까? 나는 그것을 좁히는 것처럼 보이며, 나는 그것을 고치는 방법을 모른다. 메모리 조정을 시도했지만 작동하지 않습니다. 나는 그것이 당신에게 단서를 줄 수 있기를 바랍니다
semi-newbie

커널이 캐시를 삭제하도록 강요 할 필요는 없습니다. 더 많은 물리적 메모리가 필요하면 즉시 플러시되고 공간이 회수됩니다. 캐싱되지 않은 객체는 훨씬 느린 보조 스토리지에서 검색해야하므로 전체 성능에 부정적인 영향을 줄 수 있습니다. 사용 가능한 메인 메모리는 결코 좋은 것이 아닙니다. 캐시 관리가 잘못되었거나 사용량이 매우 적음을 나타냅니다.
David Foerster

답변:


9

memprof는 메모리 사용량을 프로파일 링하고 메모리 누수를 찾는 도구입니다. 프로그램의 각 기능에 의해 할당 된 메모리 양을 프로파일로 생성 할 수 있습니다. 또한 메모리를 스캔하고 할당했지만 더 이상 어디에도 참조되지 않은 블록을 찾을 수 있습니다.

memprof는 라이브러리를 사전로드하여 C 라이브러리의 메모리 할당 기능을 대체하며 프로그램을 다시 컴파일하지 않아도됩니다.

멤 프로

출처 : 우분투 매뉴얼


11

먼저 충분한 여유 공간이있는 임시 폴더를 사용할 수 있어야합니다. 다음 명령은 크기가 몇 GB 일 수있는 덤프를 작성합니다.

다음 명령을 사용하여 새 tmp 폴더를 만들 수 있습니다. /tmp충분한 공간이있는 다른 파일 시스템으로 변경하고 싶을 수도 있습니다

TMPDIR=$(mktemp -d -t -p /tmp)

메모리 누수를 찾는 단계

  1. 메모리 누수를 유발하는 프로세스의 PID를 찾고 (예를 들어 htop사용 가능한 경우 에도 사용할 수 있음) 호출 된 변수에 저장하십시오.pid

    ps -aux
    
  2. 변수에서 PID를 사용할 수 있다고 가정 pid하면 메모리 소비량을 캡처하여 다음 /proc/$pid/smaps과 같은 파일로 저장할 수 beforeMemInc.txt있습니다.

    cat /proc/$pid/smaps > $TMPDIR/beforeMemInc.txt
    
  3. 메모리 소비가 증가 할 때까지 기다리십시오.
  4. /proc/$pid/smaps다시 캡처 하여 다른 이름으로 저장afterMemInc.txt

    cat /proc/$pid/smaps > $TMPDIR/afterMemInc.txt
    
  5. 첫 번째 차이점 찾기 smaps, 2 smaps예와를,

    diff -u $TMPDIR/beforeMemInc.txt $TMPDIR/afterMemInc.txt
    
  6. 메모리가 증가한 주소 범위를 기록해 두십시오 (예 :

       beforeMemInc.txt            afterMemInc.txt
    ---------------------------------------------------
    2b3289290000-2b3289343000   2b3289290000-2b3289343000  #ADDRESS
    Shared_Clean:    0 kB       Shared_Clean:    0 kB          
    Shared_Dirty:    0 kB       Shared_Dirty:    0 kB
    Private_Clean:   0 kB       Private_Clean:   0 kB
    Private_Dirty:  28 kB       Private_Dirty:  36 kB  
    Referenced:     28 kB       Referenced:     36 kB
    Anonymous:      28 kB       Anonymous:      36 kB  #INCREASE MEM
    AnonHugePages:   0 kB       AnonHugePages:   0 kB
    Swap:            0 kB       Swap:            0 kB
    KernelPageSize:  4 kB       KernelPageSize:  4 kB
    MMUPageSize:     4 kB       MMUPageSize:     4 kB
    Locked:          0 kB       Locked:          0 kB
    VmFlags: rd wr mr mw me ac  VmFlags: rd wr mr mw me ac
    
  7. GDB를 사용하여 실행중인 프로세스에서 메모리를 덤프하거나 코어 덤프를 사용하여 가져 오기

    gcore -o $TMPDIR/process $PID
    
  8. 실행중인 프로세스에서 gdb를 사용하여 메모리를 일부 파일로 덤프했습니다.

    cd $TMPDIR
    gdb -p $pid
    dump memory memory.dump 0x2b3289290000 0x2b3289343000
    
  9. 이제 strings명령을 사용 hexdump -C하여memory.dump

    strings memory.dump
    

    이것으로부터 소스 코드에서 해당 문자열을 찾는 데 도움이되는 읽을 수있는 정보를 얻습니다.

  10. 소스를 분석하여 누출을 찾으십시오.

Docker 컨테이너에 있으며 cat /proc/2882/smaps > /tmp/before.txt2 단계에서 실행할 때 권한 거부 오류가 발생 합니다. 무엇을 잘못 했습니까?
Devy

8

drop_cache 트릭은 메모리를 비우지 않으며 캐시를 재설정합니다. 용도 PS의 명령은이 용도에게 더 많은 메모리를 처리하는 확인하십시오.

예를 들어 상주 메모리 사용자 상위 15 명의 목록을 모니터링합니다.

$ watch "ps --sort -rss -eo pid,pmem,rss,vsz,comm | head -16"
  PID %MEM   RSS    VSZ COMMAND
 2590 13.4 136892 825000 firefox
 1743 10.7 109020 300780 Xorg
 2067  8.5 86764 1118140 unity-2d-shell
 3307  4.1 42560 627780 unity-2d-spread
 2068  2.9 29904 617644 unity-2d-panel
 2092  2.5 25524 1291204 nautilus
 2457  1.9 20292 530276 gnome-terminal
 2351  1.9 20016 821488 unity-scope-vid
 2161  1.9 19476 531968 unity-panel-ser
 2034  1.7 18256 759716 gnome-settings-
 2074  1.5 16176 518016 nm-applet
 2273  1.5 15452 580416 unity-lens-vide
 2051  1.4 15112 524260 metacity
 2395  1.2 12836 407336 update-notifi

공유 메모리 예약도 확인할 수 있지만 세그먼트의 소유자 인 사람 만 알 수 있습니다.

Pmap 할당 :

$ ls -l /run/shm
total 272
-r-------- 1 ed      ed      67108904 Nov 29 18:17 pulse-shm-1884617860
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-2352897759
-r-------- 1 ed      ed      67108904 Nov 29 18:12 pulse-shm-3444873503
-r-------- 1 ed      ed      67108904 Nov 29 18:12 pulse-shm-3485341848
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-535843976
-r-------- 1 ed      ed      67108904 Nov 29 19:12 pulse-shm-789046959
-r-------- 1 ed      ed      67108904 Nov 29 18:38 pulse-shm-863909656

$ df /run/shm 
Filesystem     1K-blocks  Used Available Use% Mounted on
none              509332   272    509060   1% /run/shm

예약 된 할당은 실제 할당 된 페이지보다 훨씬 높습니다 (df 'used')

시스템 V 할당 :

$ ipcs -m 

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 294912     ed         700        122880     2          dest         
0x00000000 327681     ed         700        4823040    2          dest         
0x00000000 491522     ed         600        393216     2          dest         
0x00000000 589827     ed         700        4578120    2          dest         
0x00000000 425988     ed         700        27852      2          dest         
0x00000000 458757     ed         600        393216     2          dest         

편집 : 메모리 사용량이 가장 많은 프로세스를 가져 오려면 전달 --sort -rss해야 ps합니다. 그렇지 않으면 프로세스 목록이 숫자 순으로 정렬되어 메모리 사용량이 가장 적은 프로세스를 제공합니다.


5

메모리 누수 메시지를 지속적으로 내뿜는 오래된 컴퓨터가 있습니다.

root@:~# free -m
             total       used       free     shared    buffers     cached
Mem:          1898       1523        374        131         32        588
-/+ buffers/cache:        902        995
Swap:         1942        480       1462

내 스크립트 :

sync; sudo echo 3 > /proc/sys/vm/drop_caches

그것을 명명 cache.sh

root@~# ./cache.sh
root@~# free -m
             total       used       free     shared    buffers     cached
Mem:          1898       1106        791        126          1        207
-/+ buffers/cache:        897       1000
Swap:         1942        480       1462

내가 374MB로 줄어든 것을 확인한 sync; sudo echo 3 > /proc/sys/vm/drop_caches후 다시 417MB를 얻었습니다. 하나는 수 cron는 5 분마다 실행하거나 터미널 개방이 있고 성능 저하를 볼 때 그것을 실행합니다. 예, 머신에 메모리를 추가해야합니다 ...


포맷팅이 문제인 것 같습니다. 어떻게 수정해야할지
Warpig

1
게시물 아래에 있는 수정 링크를 사용하십시오 . 텍스트 영역 위에 Markdown 서식 도움말에 연결되는 서식 도구 모음과 주황색 물음표가 있습니다.
David Foerster

질문에 대한 최근 의견을 살펴보십시오 . 캐시를 플러시하고 삭제하여 주 메모리를 비우는 아이디어가 잘못 안내되었다고 확신하며 그 결론에 혼자가 아니라는 것을 알고 있습니다.
David Foerster

많은 감사, 데이비드 ... 캐시 플러시 / 삭제가 잘못되었다는 데 전적으로 동의합니다.하지만 뭔가 끊어지고 기계가 정지 / 잠기는 중입니다 ... 파이어 폭스 문제를 생각하면서 그 문제에 대해 당황했습니다. ..
Warpig

3

memstat 는 또한 각 블록이 사용하는 메모리의 양과로드 된 라이브러리가 사용하는 메모리의 양을 보여주는 좋은 도구입니다. 최고의 도구는 아니지만 세부 정보와 통계를 수집하는 데 사용할 가치가 있습니다.

memstat -w -p pid 사용하기 좋은 명령입니다.


1
링크는 내가 생각, 고장 이 일이 좋다
vladkras

1

비슷한 문제가 있었지만 매우 이상한 해결책이 있습니다.

알 수없는 이유로 랩톱 설치 및 실행에 메일 서버가 있었는데 이유가 무엇인지 모르겠습니다. 그러나 서비스를 종료하고 랩톱의 해당 소프트웨어가 ddos ​​공격을 받고 있음이 밝혀졌습니다. 그 후 모든 것이 정상이었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.