ทำความเข้าใจกับบันทึกของ Linux oom-killer


88

แอพของฉันถูกฆ่าโดย oom-killer เป็น Ubuntu 11.10 ที่ทำงานบน USB สดโดยไม่มีการแลกเปลี่ยนและพีซีมี RAM 1 Gig แอปเดียวที่ทำงานอยู่ (นอกเหนือจากสิ่งที่สร้างขึ้นใน Ubuntu ทั้งหมด) คือโปรแกรม flasherav ของฉัน โปรดทราบว่า / tmp ถูกแมปหน่วยความจำและในขณะที่เกิดปัญหามีไฟล์อยู่ในนั้นประมาณ 200MB (ดังนั้นจึงใช้ RAM มากถึง 200MB)

ฉันพยายามที่จะเข้าใจวิธีวิเคราะห์บันทึก om-killer เพื่อที่ฉันจะเข้าใจว่าหน่วยความจำทั้งหมดถูกใช้ไปที่ใดนั่นคือชิ้นส่วนต่าง ๆ ที่จะรวมกันได้ถึง ~ 1 กิ๊กซึ่งส่งผลให้เกิดการเตะโอม - เพชฌฆาต ใน? เมื่อฉันเข้าใจแล้วฉันสามารถลดการใช้งานของผู้กระทำความผิดเพื่อให้แอปทำงานบนเครื่องที่มีหน่วยความจำ 1 GB คำถามเฉพาะของฉันคือ

เพื่อพยายามวิเคราะห์สถานการณ์ฉันสรุปคอลัมน์ "total_vm" และฉันได้รับเพียง 609342KB (ซึ่งเมื่อเพิ่มเข้าไปใน 200MB ใน / tmp ยังคงเป็นเพียง 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

7
ฉันคิดว่าเหมาะสำหรับ SuperUser หรือ Unix มากกว่า บางทีแม้แต่ ServerFault
0xC0000022L


ฉันได้ให้ตัวอย่างเล็กน้อยที่ทริกเกอร์ OOM ที่: stackoverflow.com/questions/7880784/…และสามารถใช้เพื่อศึกษาบันทึก OOM ซ้ำได้
Ciro Santilli 郝海东冠状病六四事件法轮功

คำตอบ:


39

การจัดการหน่วยความจำใน Linux เป็นเรื่องยากที่จะเข้าใจและฉันไม่สามารถพูดได้ว่าฉันเข้าใจมันทั้งหมด แต่ฉันจะพยายามแบ่งปันประสบการณ์และความรู้ของฉันเล็กน้อย

คำตอบสั้น ๆ สำหรับคำถามของคุณ: ใช่มีสิ่งอื่น ๆ รวมอยู่นอกเหนือจากสิ่งที่อยู่ในรายการ

สิ่งที่แสดงในรายการของคุณคือแอปพลิเคชันที่ทำงานใน userspace เคอร์เนลใช้หน่วยความจำสำหรับตัวมันเองและโมดูลนอกจากนั้นยังมีหน่วยความจำว่างที่คุณไม่สามารถทำได้ เมื่อคุณถึงระดับนั้นจะพยายามเพิ่มทรัพยากรและเมื่อไม่สามารถทำได้อีกต่อไปคุณจะพบปัญหา OOM

จากบรรทัดสุดท้ายของรายการคุณสามารถอ่านได้ว่าเคอร์เนลรายงานการใช้งาน total-vm ของ: 1498536kB (1,5GB) โดยที่ total-vm รวมทั้ง RAM จริงและพื้นที่สว็อปของคุณ คุณระบุว่าคุณไม่มี swap ใด ๆ แต่ดูเหมือนว่าเคอร์เนลจะคิดเป็นอย่างอื่นเนื่องจากพื้นที่ swap ของคุณได้รับรายงานว่าเต็ม (Total swap = 524284kB, Free swap = 0kB) และรายงานขนาด vmem ทั้งหมด 1,5GB

อีกสิ่งหนึ่งที่อาจทำให้สิ่งต่าง ๆ ซับซ้อนขึ้นคือการกระจายตัวของหน่วยความจำ คุณสามารถกด OOM killer ได้เมื่อเคอร์เนลพยายามจัดสรรให้บอกว่ามีหน่วยความจำต่อเนื่อง 4096kB แต่ไม่มีหน่วยความจำว่างให้ใช้งานได้

ตอนนี้เพียงอย่างเดียวอาจไม่สามารถช่วยคุณแก้ปัญหาที่แท้จริงได้ ฉันไม่รู้ว่าเป็นเรื่องปกติหรือไม่ที่โปรแกรมของคุณต้องการหน่วยความจำจำนวนนั้น แต่ฉันอยากแนะนำให้ลองใช้ตัววิเคราะห์โค้ดแบบคงที่เช่น cppcheck เพื่อตรวจสอบการรั่วไหลของหน่วยความจำหรือการรั่วไหลของไฟล์อธิบาย คุณสามารถลองเรียกใช้ผ่าน Valgrind เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้หน่วยความจำ


29

ผลรวมtotal_vmคือ 847170 และผลรวมเท่ากับrss214726 ค่าทั้งสองนี้จะถูกนับในหน้า 4kB ซึ่งหมายความว่าเมื่อ oom-killer กำลังทำงานคุณได้ใช้หน่วยความจำกายภาพ 214726 * 4kB = 858904kB และพื้นที่แลกเปลี่ยน

เนื่องจากหน่วยความจำฟิสิคัลของคุณคือ 1GB และใช้สำหรับการแมปหน่วยความจำประมาณ 200MB จึงเหมาะสมสำหรับการเรียกใช้ oom-killer เมื่อใช้ 858904kB

rssสำหรับกระบวนการ 2603 เป็น 181,503 ซึ่งหมายความ 181,503 * 4KB = 726012 RSS, เท่ากับผลรวมของและanon-rssfile-rss

[11686.043647] กระบวนการฆ่า 2603 (flasherav) total-vm: 1498536kB, anon-rss: 721784kB, file-rss: 4228kB


2
ขอบคุณสำหรับคำอธิบาย คุณช่วยอธิบายความหมาย: "ค่าทั้งสองนี้นับในหน้า 4kB" ได้ไหม ฉันไม่เข้าใจว่าคุณได้ 4kB มาจากไหนและทำไมคุณถึงคูณด้วยผลรวมของ rss = 214726 นอกจากนี้คุณได้ค่า 181503 สำหรับ "rss for process 2603" มาจากไหนและ anon-rss และ file-rss ที่คุณนำมาเปรียบเทียบกับอะไร
user1747935

5
เขาหมายความว่า 2 ค่านั้นคือจำนวนหน้าที่จัดสรรและ 4KB (4096 ไบต์) คือขนาดเพจมาตรฐานบน x86 หน่วยความจำถูกจัดสรรเป็นหน่วยของขนาดหน้าเว็บดังนั้นหากฉันขอการจัดสรร 4000 ไบต์เคอร์เนลจะจัดสรร 4096 จริง (6 ไบต์พิเศษจะถือว่าสูญเปล่า แต่ในทางปฏิบัติไม่ใช่เรื่องใหญ่) RSS ย่อมาจาก "Resident set size"; หมายถึงจำนวนหน่วยความจำหลักที่ใช้โดยกระบวนการ file-rss ถูกสลับหน่วยความจำ ไม่แน่ใจว่า anon-rss หมายถึงอะไร
Aquarelle

5

หน้าเว็บนี้มีคำอธิบายและวิธีแก้ไข

วิธีแก้ปัญหาคือ:

ในการแก้ไขปัญหานี้จำเป็นต้องเปลี่ยนลักษณะการทำงานของเคอร์เนลดังนั้นจึงไม่สามารถใช้หน่วยความจำสำหรับคำขอแอปพลิเคชันมากเกินไป ในที่สุดฉันก็ได้รวมค่าที่กล่าวถึงเหล่านั้นไว้ในไฟล์ /etc/sysctl.conf ดังนั้นค่าเหล่านี้จึงถูกนำไปใช้โดยอัตโนมัติเมื่อเริ่มต้นระบบ:

vm.overcommit_memory = 2

vm.overcommit_ratio = 80


5
อย่าเพิ่งตั้งค่า vm.overcommit_ratio = 80 หวังว่ามันจะแก้ไขอะไรบางอย่างให้คุณมันอาจจะไม่เคยชิน ดูรายละเอียดเพิ่มเติมได้ที่serverfault.com/questions/362589/…
Lukas

ขอบคุณ @Lukas คำตอบดูเหมือนจะสมเหตุสมผล แต่ฉันไม่เสี่ยงที่จะตั้งค่า overcommit_ratio มากกว่า 100! :) ขอบคุณอีกครั้ง
Shahab
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.