2012-02-08 2 views
51

내 앱이 oom-killer에 의해 사망했습니다. 스왑이없는 라이브 USB에서 실행되는 우분투 11.10이며 PC에는 1 기가의 RAM이 있습니다. 실행중인 유일한 응용 프로그램 (내 모든 우분투 물건 제외)은 내 프로그램 flasherav입니다./tmp는 메모리 맵핑 된 것이고 크래시 당시에는 약 200MB의 파일이있었습니다 (따라서 ~ 200MB의 RAM을 차지했습니다).Linux oom-killer의 로그 이해

나는 정확하게 모든 메모리가 사용되는 곳을 이해할 수있는 옴 킬러 로그를 분석하는 방법을 이해하려고합니다. 즉, ~ 1 기가까지 합쳐질 다른 덩어리는 무엇입니까? 범인 살해범? 일단 내가 이해한다면, 나는 가해자의 사용량을 줄이기 위해 일할 수 있으므로 앱은 1GB RAM이 장착 된 컴퓨터에서 실행됩니다. 내 구체적인 질문이 있습니다.

상황을 분석하기 위해 "total_vm"열을 요약했는데 609342KB (/ tmp의 200MB에 추가 할 때 여전히 809MB 만 사용) 만 얻습니다. 아마도 "total_vm"열의 정의가 잘못되었습니다. 할당 된 메모리는 아니지만 사용 된 메모리와 공유 메모리가 포함됩니다. 그렇다면 실제로 사용 된 메모리를 과장하지 않아야합니까? (따라서 메모리가 부족해서는 안됩니다) 맞습니까? 사용중인 다른 메모리 덩어리가 아래 목록에 포함되지 않습니까? 리눅스에서

[11686.040460] flasherav invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0 
[11686.040467] flasherav cpuset=/ mems_allowed=0 
[11686.040472] Pid: 2859, comm: flasherav Not tainted 3.0.0-12-generiC#20-Ubuntu 
[11686.040476] Call Trace: 
[11686.040488] [<c10e1c15>] dump_header.isra.7+0x85/0xc0 
[11686.040493] [<c10e1e6c>] oom_kill_process+0x5c/0x80 
[11686.040498] [<c10e225f>] out_of_memory+0xbf/0x1d0 
[11686.040503] [<c10e6123>] __alloc_pages_nodemask+0x6c3/0x6e0 
[11686.040509] [<c10e78d3>] ? __do_page_cache_readahead+0xe3/0x170 
[11686.040514] [<c10e0fc8>] filemap_fault+0x218/0x390 
[11686.040519] [<c1001c24>] ? __switch_to+0x94/0x1a0 
[11686.040525] [<c10fb5ee>] __do_fault+0x3e/0x4b0 
[11686.040530] [<c1069971>] ? enqueue_hrtimer+0x21/0x80 
[11686.040535] [<c10fec2c>] handle_pte_fault+0xec/0x220 
[11686.040540] [<c10fee68>] handle_mm_fault+0x108/0x210 
[11686.040546] [<c152fa00>] ? vmalloc_fault+0xee/0xee 
[11686.040551] [<c152fb5b>] do_page_fault+0x15b/0x4a0 
[11686.040555] [<c1069a90>] ? update_rmtp+0x80/0x80 
[11686.040560] [<c106a7b6>] ? hrtimer_start_range_ns+0x26/0x30 
[11686.040565] [<c106aeaf>] ? sys_nanosleep+0x4f/0x60 
[11686.040569] [<c152fa00>] ? vmalloc_fault+0xee/0xee 
[11686.040574] [<c152cfcf>] error_code+0x67/0x6c 
[11686.040580] [<c1520000>] ? reserve_backup_gdb.isra.11+0x26d/0x2c0 
[11686.040583] Mem-Info: 
[11686.040585] DMA per-cpu: 
[11686.040588] CPU 0: hi: 0, btch: 1 usd: 0 
[11686.040592] CPU 1: hi: 0, btch: 1 usd: 0 
[11686.040594] Normal per-cpu: 
[11686.040597] CPU 0: hi: 186, btch: 31 usd: 5 
[11686.040600] CPU 1: hi: 186, btch: 31 usd: 30 
[11686.040603] HighMem per-cpu: 
[11686.040605] CPU 0: hi: 42, btch: 7 usd: 7 
[11686.040608] CPU 1: hi: 42, btch: 7 usd: 22 
[11686.040613] active_anon:113150 inactive_anon:113378 isolated_anon:0 
[11686.040615] active_file:86 inactive_file:1964 isolated_file:0 
[11686.040616] unevictable:0 dirty:0 writeback:0 unstable:0 
[11686.040618] free:13274 slab_reclaimable:2239 slab_unreclaimable:2594 
[11686.040619] mapped:1387 shmem:4380 pagetables:1375 bounce:0 
[11686.040627] DMA free:4776kB min:784kB low:980kB high:1176kB active_anon:5116kB inactive_anon:5472kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15804kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:80kB slab_unreclaimable:168kB kernel_stack:96kB pagetables:64kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:6 all_unreclaimable? yes 
[11686.040634] lowmem_reserve[]: 0 865 1000 1000 
[11686.040644] Normal free:48212kB min:44012kB low:55012kB high:66016kB active_anon:383196kB inactive_anon:383704kB active_file:344kB inactive_file:7884kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:885944kB mlocked:0kB dirty:0kB writeback:0kB mapped:5548kB shmem:17520kB slab_reclaimable:8876kB slab_unreclaimable:10208kB kernel_stack:1960kB pagetables:3976kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:930 all_unreclaimable? yes 
[11686.040652] lowmem_reserve[]: 0 0 1078 1078 
[11686.040662] HighMem free:108kB min:132kB low:1844kB high:3560kB active_anon:64288kB inactive_anon:64336kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:138072kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:0kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:1460kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:61 all_unreclaimable? yes 
[11686.040669] lowmem_reserve[]: 0 0 0 0 
[11686.040675] DMA: 20*4kB 24*8kB 34*16kB 26*32kB 19*64kB 13*128kB 1*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 4784kB 
[11686.040690] Normal: 819*4kB 607*8kB 357*16kB 176*32kB 99*64kB 49*128kB 23*256kB 4*512kB 0*1024kB 0*2048kB 2*4096kB = 48212kB 
[11686.040704] HighMem: 16*4kB 0*8kB 1*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 80kB 
[11686.040718] 14680 total pagecache pages 
[11686.040721] 8202 pages in swap cache 
[11686.040724] Swap cache stats: add 2191074, delete 2182872, find 1247325/1327415 
[11686.040727] Free swap = 0kB 
[11686.040729] Total swap = 524284kB 
[11686.043240] 262100 pages RAM 
[11686.043244] 34790 pages HighMem 
[11686.043246] 5610 pages reserved 
[11686.043248] 2335 pages shared 
[11686.043250] 240875 pages non-shared 
[11686.043253] [ pid ] uid tgid total_vm  rss cpu oom_adj oom_score_adj name 
[11686.043266] [ 1084]  0 1084  662  1 0  0    0 upstart-udev-br 
[11686.043271] [ 1094]  0 1094  743  79 0  -17   -1000 udevd 
[11686.043276] [ 1104] 101 1104  7232  42 0  0    0 rsyslogd 
[11686.043281] [ 1149] 103 1149  1066  188 1  0    0 dbus-daemon 
[11686.043286] [ 1165]  0 1165  1716  66 0  0    0 modem-manager 
[11686.043291] [ 1220] 106 1220  861  42 0  0    0 avahi-daemon 
[11686.043296] [ 1221] 106 1221  829  0 1  0    0 avahi-daemon 
[11686.043301] [ 1255]  0 1255  6880  117 0  0    0 NetworkManager 
[11686.043306] [ 1308]  0 1308  5988  144 0  0    0 polkitd 
[11686.043311] [ 1334]  0 1334  723  85 0  -17   -1000 udevd 
[11686.043316] [ 1335]  0 1335  730  108 0  -17   -1000 udevd 
[11686.043320] [ 1375]  0 1375  663  37 0  0    0 upstart-socket- 
[11686.043325] [ 1464]  0 1464  1333  120 1  0    0 login 
[11686.043330] [ 1467]  0 1467  1333  135 1  0    0 login 
[11686.043335] [ 1486]  0 1486  1333  135 1  0    0 login 
[11686.043339] [ 1487]  0 1487  1333  136 1  0    0 login 
[11686.043344] [ 1493]  0 1493  1333  134 1  0    0 login 
[11686.043349] [ 1528]  0 1528  496  45 0  0    0 acpid 
[11686.043354] [ 1529]  0 1529  607  46 1  0    0 cron 
[11686.043359] [ 1549]  0 1549 10660  100 0  0    0 lightdm 
[11686.043363] [ 1550]  0 1550  570  28 0  0    0 atd 
[11686.043368] [ 1584]  0 1584  855  35 0  0    0 irqbalance 
[11686.043373] [ 1703]  0 1703 17939  9653 0  0    0 Xorg 
[11686.043378] [ 1874]  0 1874  7013  174 0  0    0 console-kit-dae 
[11686.043382] [ 1958]  0 1958  1124  52 1  0    0 bluetoothd 
[11686.043388] [ 2048] 999 2048  2435  641 1  0    0 bash 
[11686.043392] [ 2049] 999 2049  2435  595 0  0    0 bash 
[11686.043397] [ 2050] 999 2050  2435  587 1  0    0 bash 
[11686.043402] [ 2051] 999 2051  2435  634 1  0    0 bash 
[11686.043406] [ 2054] 999 2054  2435  569 0  0    0 bash 
[11686.043411] [ 2155]  0 2155  1333  128 0  0    0 login 
[11686.043416] [ 2222]  0 2222  684  67 1  0    0 dhclient 
[11686.043420] [ 2240] 999 2240  2435  415 0  0    0 bash 
[11686.043425] [ 2244]  0 2244  3631  58 0  0    0 accounts-daemon 
[11686.043430] [ 2258] 999 2258 11683  277 0  0    0 gnome-session 
[11686.043435] [ 2407] 999 2407  964  24 0  0    0 ssh-agent 
[11686.043440] [ 2410] 999 2410  937  53 0  0    0 dbus-launch 
[11686.043444] [ 2411] 999 2411  1319  300 1  0    0 dbus-daemon 
[11686.043449] [ 2413] 999 2413  2287  88 0  0    0 gvfsd 
[11686.043454] [ 2418] 999 2418  7867  123 1  0    0 gvfs-fuse-daemo 
[11686.043459] [ 2427] 999 2427 32720  804 0  0    0 gnome-settings- 
[11686.043463] [ 2437] 999 2437 10750  124 0  0    0 gnome-keyring-d 
[11686.043468] [ 2442] 999 2442  2321  244 1  0    0 gconfd-2 
[11686.043473] [ 2447]  0 2447  6490  156 0  0    0 upowerd 
[11686.043478] [ 2467] 999 2467  7590  87 0  0    0 dconf-service 
[11686.043482] [ 2529] 999 2529 11807  211 0  0    0 gsd-printer 
[11686.043487] [ 2531] 999 2531 12162  587 0  0    0 metacity 
[11686.043492] [ 2535] 999 2535 19175  960 0  0    0 unity-2d-panel 
[11686.043496] [ 2536] 999 2536 19408  1012 0  0    0 unity-2d-launch 
[11686.043502] [ 2539] 999 2539 16154  1120 1  0    0 nautilus 
[11686.043506] [ 2540] 999 2540 17888  534 0  0    0 nm-applet 
[11686.043511] [ 2541] 999 2541  7005  253 0  0    0 polkit-gnome-au 
[11686.043516] [ 2544] 999 2544  8930  430 0  0    0 bamfdaemon 
[11686.043521] [ 2545] 999 2545 11217  442 1  0    0 bluetooth-apple 
[11686.043525] [ 2547] 999 2547  510  16 0  0    0 sh 
[11686.043530] [ 2548] 999 2548 11205  301 1  0    0 gnome-fallback- 
[11686.043535] [ 2565] 999 2565  6614  179 1  0    0 gvfs-gdu-volume 
[11686.043539] [ 2567]  0 2567  5812  164 1  0    0 udisks-daemon 
[11686.043544] [ 2571]  0 2571  1580  69 0  0    0 udisks-daemon 
[11686.043549] [ 2579] 999 2579 16354  1035 0  0    0 unity-panel-ser 
[11686.043554] [ 2602]  0 2602  1188  47 0  0    0 sudo 
[11686.043559] [ 2603]  0 2603 374634 181503 0  0    0 flasherav 
[11686.043564] [ 2607] 999 2607 12673  189 0  0    0 indicator-appli 
[11686.043569] [ 2609] 999 2609 19313  311 1  0    0 indicator-datet 
[11686.043573] [ 2611] 999 2611 15738  225 0  0    0 indicator-messa 
[11686.043578] [ 2615] 999 2615 17433  237 1  0    0 indicator-sessi 
[11686.043583] [ 2627] 999 2627  2393  132 0  0    0 gvfsd-trash 
[11686.043588] [ 2640] 999 2640  1933  85 0  0    0 geoclue-master 
[11686.043592] [ 2650]  0 2650  2498  1136 1  0    0 mount.ntfs 
[11686.043598] [ 2657] 999 2657  6624  128 1  0    0 telepathy-indic 
[11686.043602] [ 2659] 999 2659  2246  112 0  0    0 mission-control 
[11686.043607] [ 2662] 999 2662  5431  346 1  0    0 gdu-notificatio 
[11686.043612] [ 2664]  0 2664  3716  2392 0  0    0 mount.ntfs 
[11686.043617] [ 2679] 999 2679 12453  197 1  0    0 zeitgeist-datah 
[11686.043621] [ 2685] 999 2685  5196  1581 1  0    0 zeitgeist-daemo 
[11686.043626] [ 2934] 999 2934 16305  710 0  0    0 gnome-terminal 
[11686.043631] [ 2938] 999 2938  553  0 0  0    0 gnome-pty-helpe 
[11686.043636] [ 2939] 999 2939  1814  406 0  0    0 bash 
[11686.043641] Out of memory: Kill process 2603 (flasherav) score 761 or sacrifice child 
[11686.043647] Killed process 2603 (flasherav) total-vm:1498536kB, anon-rss:721784kB, file-rss:4228kB 
+5

수퍼 유저 또는 유닉스에 더 적합하다고 생각합니다. 아마도 심지어 ServerFault. – 0xC0000022L

답변

20

메모리 관리는 이해하기가 조금 까다 롭습니다, 나는 내가 아직 완전히 이해 말할 수는 없지만 내 경험과 지식의 약간을 공유하려고합니다.

질문에 대한 간단한 답변 : 예 목록에있는 것보다 다른 내용이 있습니다.

목록에 표시되는 내용은 사용자 공간에서 실행되는 응용 프로그램입니다. 커널은 자신과 모듈을 위해 메모리를 사용하는데, 그 밑에는 사용할 수없는 여유 메모리의 한계가 있습니다. 이 수준에 도달하면 리소스를 확보하려고 시도하고 더 이상 수행 할 수 없으면 OOM 문제가 발생합니다.

목록의 마지막 줄에서 커널이 total-vm usage : 1498536kB (1,5GB)를보고한다는 것을 읽을 수 있습니다. total-vm은 실제 RAM과 스왑 공간을 모두 포함합니다. 당신은 당신이 스왑을 가지고 있지 않다고 말했지만 커널은 스왑 공간이 가득 찼다 고보고 (총 스왑 = 524284kB, 자유 스왑 = 0kB)하고 1.5 메가 바이트의 총 메모리 크기를보고하기 때문에 그렇지 않다는 생각이 들었다.

또 다른 문제는 메모리 조각화입니다. 커널이 할당을 시도 할 때 OOM 킬러를 치면 4096kB의 연속 메모리를 사용할 수 있지만 사용 가능한 무료 메모리는 없습니다.

이제 혼자서는 실제 문제를 해결하는 데 도움이되지 않습니다. 프로그램에서 메모리 양을 요구하는 것이 정상적인 것인지 모르겠지만 cppcheck와 같은 정적 코드 분석기를 사용하여 메모리 누수 또는 파일 설명자 누출 여부를 확인하는 것이 좋습니다. Valgrind를 통해 메모리 사용량에 대한 정보를 조금 더 얻을 수도 있습니다.

5

This webpage 설명과 해결책이 있습니다.

솔루션은 다음과 같습니다

이 문제를 커널의 동작을 수정하려면 변경할 수있다, 그래서 더 이상 응용 프로그램 요청에 대한 메모리를 오버 커밋되지 않습니다. 마지막으로 나는으로 /etc/sysctl.conf 파일에 그 언급 한 값을 포함, 그래서 그들은 자동으로 시작 적용받을 :

vm.overcommit_memory = 2

VM.overcommit_ratio를 = 80

+2

vm.overcommit_ratio = 80을 설정하지 마십시오. 뭔가를 고칠 수 있기를 바랍니다. 자세한 내용은 http://serverfault.com/questions/362589/effects-of-configuring-vm-overcommit-memory를 참조하십시오. – Lukas

+0

감사합니다. @Lukas, 대답은 합리적인 것 같습니다. 그러나 100을 초과하여 overcommit_ratio를 설정할 위험이 없습니다. ! :) Thanks again – KiNG

11

total_vm의 합계가 OOM 킬러, 당신은 214,726 * 4kB의 = 858904kB 실제 사용했다 실행할 때 즉, 214726은,이 두 값은 4kB의 페이지에 집계되는 847,170 및 rss의 합이다 메모리와 스왑 공간.

실제 메모리가 1GB이고 ~ 200MB가 메모리 맵핑에 사용 되었기 때문에 858904kB가 사용될 때 oom-killer를 호출하는 것이 합리적입니다. 프로세스 2603에 대한

rss는 RSS = 726,012 181,503 * 킬로바이트가 anon-rssfile-rss과의 합과 동일 하였다 의미 181,503이다.

[11686.043647] 처치 과정 2,603 ​​(flasherav) 총-VM : 1498536kB, 아논-RSS : 721784kB, 파일 RSS : 4228kB

+0

설명해 주셔서 감사합니다. 이것이 의미하는 바를 설명해주십시오 : "이 두 값은 4kB 페이지로 계산됩니다"? 나는 4kB가있는 곳과 rss = 214726의 합으로 곱하는 이유를 이해하지 못합니다. 또한 "프로세스 2603의 rss"에 대해 181503의 값을 얻었으며이를 비교하기 위해 누적 된 anon-rss 및 file-rss는 무엇입니까? – user1747935

0

임 수백 개의 VM을 갖는. 프로세스가 죽은 VM의 모든 로그를 이해하는 것은 꽤 어렵습니다.

이런 종류의 상황에서는 this가 도움이 될 것입니다.