Tìm hiểu nhật ký của Oom-killer Linux


87

Ứng dụng của tôi đã bị giết bởi kẻ giết người. Đó là Ubuntu 11.10 chạy trên USB trực tiếp không cần trao đổi và PC có RAM 1 Gig. Ứng dụng duy nhất đang chạy (ngoài tất cả những thứ được tích hợp sẵn trong Ubuntu) là chương trình của tôi. Lưu ý rằng / tmp là bộ nhớ được ánh xạ và tại thời điểm xảy ra sự cố có khoảng 200 MB tệp trong đó (chiếm ~ 200 MB RAM).

Tôi đang cố gắng hiểu cách phân tích nhật ký om-killer để có thể hiểu chính xác tất cả bộ nhớ đang được sử dụng ở đâu - tức là những phần khác nhau sẽ cộng lại lên đến ~ 1 buổi biểu diễn dẫn đến cú đá oom-killer trong? Khi tôi hiểu điều đó, tôi có thể làm việc để giảm mức sử dụng của người vi phạm để ứng dụng sẽ chạy trên máy có 1 GB ram. Câu hỏi cụ thể của tôi là.

Để cố gắng phân tích tình hình, tôi đã tổng hợp cột "total_vm" và tôi chỉ nhận được 609342KB (khi thêm vào 200MB trong / tmp vẫn chỉ là 809MB). Có lẽ tôi sai về cột "total_vm" là gì- nó bao gồm bộ nhớ được cấp phát nhưng không được sử dụng cộng với bộ nhớ được chia sẻ. Nếu có, thì nó không nên phóng đại quá mức thực sự đã sử dụng bộ nhớ (và do đó tôi không nên hết bộ nhớ), phải không? Có những phần bộ nhớ khác đang được sử dụng mà không được tính đến trong danh sách dưới đây không?

[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
Tôi nghĩ phù hợp hơn với SuperUser hoặc Unix. Có lẽ cả ServerFault.
0xC0000022L


Tôi đã cung cấp một ví dụ tối thiểu kích hoạt OOM tại: stackoverflow.com/questions/7880784/… và nó có thể được sử dụng để nghiên cứu lại các bản ghi OOM.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Câu trả lời:


39

Quản lý bộ nhớ trong Linux hơi khó hiểu và tôi không thể nói là tôi đã hiểu hết về nó, nhưng tôi sẽ cố gắng chia sẻ một chút kinh nghiệm và kiến ​​thức của mình.

Câu trả lời ngắn gọn cho câu hỏi của bạn: Có, có những thứ khác được bao gồm ngoài những gì trong danh sách.

Những gì được hiển thị trong danh sách của bạn là các ứng dụng chạy trong không gian người dùng. Kernel sử dụng bộ nhớ cho chính nó và các mô-đun, trên hết nó cũng có giới hạn bộ nhớ trống thấp hơn mà bạn không thể sử dụng. Khi bạn đạt đến cấp độ đó, nó sẽ cố gắng giải phóng tài nguyên và khi nó không thể làm như vậy nữa, bạn sẽ gặp sự cố OOM.

Từ dòng cuối cùng của danh sách, bạn có thể đọc rằng hạt nhân báo cáo mức sử dụng tổng vm là: 1498536kB (1,5GB), trong đó tổng vm bao gồm cả RAM vật lý và không gian hoán đổi của bạn. Bạn đã nói rằng bạn không có bất kỳ hoán đổi nào nhưng hạt nhân dường như nghĩ khác vì không gian hoán đổi của bạn được báo cáo là đầy (Tổng số hoán đổi = 524284kB, Trao đổi miễn phí = 0kB) và nó báo cáo tổng kích thước vmem là 1,5GB.

Một điều khác có thể làm phức tạp thêm mọi thứ là sự phân mảnh bộ nhớ. Bạn có thể gặp phải kẻ giết người OOM khi hạt nhân cố gắng cấp phát 4096kB bộ nhớ liên tục, nhưng không có bộ nhớ miễn phí nào khả dụng.

Bây giờ điều đó một mình có lẽ sẽ không giúp bạn giải quyết vấn đề thực tế. Tôi không biết liệu chương trình của bạn có yêu cầu lượng bộ nhớ đó bình thường hay không, nhưng tôi khuyên bạn nên thử một trình phân tích mã tĩnh như cppcheck để kiểm tra rò rỉ bộ nhớ hoặc rò rỉ bộ mô tả tệp. Bạn cũng có thể thử chạy nó qua Valgrind để biết thêm một chút thông tin về việc sử dụng bộ nhớ.


27

Tổng total_vmlà 847170 và tổng rsslà 214726, hai giá trị này được tính trong các trang 4kB, có nghĩa là khi oom-killer đang chạy, bạn đã sử dụng bộ nhớ vật lý 214726 * 4kB = 858904kB và không gian hoán đổi.

Vì bộ nhớ vật lý của bạn là 1GB và ~ 200MB đã được sử dụng để lập bản đồ bộ nhớ, nên việc gọi oom-killer là hợp lý khi 858904kB được sử dụng.

rssđối với quy trình 2603 là 181503, có nghĩa là 181503 * 4KB = 726012 rss, bằng tổng của anon-rssfile-rss.

[11686.043647] Quá trình bị giết 2603 (flashherav) total-vm: 1498536kB, anon-rss: 721784kB, file-rss: 4228kB


2
Cám ơn vì sự giải thích. Bạn có thể vui lòng giúp giải thích điều này có nghĩa là gì: "hai giá trị này được tính trong các trang 4kB"? Tôi không hiểu bạn lấy 4kB từ đâu và tại sao bạn lại nhân nó với tổng rss = 214726. Ngoài ra, bạn lấy giá trị 181503 ở đâu cho "rss cho quá trình 2603" và anon-rss và file-rss mà bạn đang lấy tổng để so sánh với nó là gì?
dùng1747935

5
Ý của anh ấy là 2 giá trị đó là số trang được phân bổ và 4KB (4096 byte) là kích thước trang tiêu chuẩn trên x86. Bộ nhớ được cấp phát theo đơn vị của bất kỳ kích thước trang nào, vì vậy nếu tôi yêu cầu cấp phát 4000 byte, hạt nhân sẽ thực sự cấp phát 4096 (6 byte thừa sẽ bị coi là lãng phí, nhưng trên thực tế thì đó không phải là vấn đề lớn). RSS là viết tắt của "kích thước tập hợp thường trú"; nó có nghĩa là dung lượng bộ nhớ lõi được sử dụng bởi một quá trình. file-rss là bộ nhớ được hoán đổi; không chắc anon-rss có nghĩa là gì.
Aquarelle,

5

Trang web này có một lời giải thích và một giải pháp.

Giải pháp là:

Để khắc phục sự cố này, hành vi của hạt nhân phải được thay đổi, do đó nó sẽ không còn cấp quá bộ nhớ cho các yêu cầu ứng dụng. Cuối cùng, tôi đã đưa các giá trị được đề cập đó vào tệp /etc/sysctl.conf, vì vậy chúng được tự động áp dụng khi khởi động:

vm.overcommit_memory = 2

vm.overcommit_ratio = 80


5
Đừng chỉ đặt vm.overcommit_ratio = 80, hy vọng nó sẽ sửa chữa một cái gì đó cho bạn, nó có thể sẽ không. Xem serverfault.com/questions/362589/… để biết thêm chi tiết
Lukas

Cảm ơn @Lukas, câu trả lời có vẻ hợp lý, Nhưng tôi không mạo hiểm đặt overcommit_ratio trên 100! :) Cảm ơn một lần nữa
Shahab
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.