web-dev-qa-db-ja.com

OOMキラーログを理解する

Dockerコンテナー内でいくつかのプロセスを実行し、このコンテナーにメモリ制限を使用します。 Dockerコンテナ内の一部のプロセスがOOMキラーによって強制終了されることがありました。私はそれをsyslogファイルで見ます:

_beam.smp invoked oom-killer: gfp_mask=0xd0, order=0, oom_score_adj=0
beam.smp cpuset=/ mems_allowed=0
CPU: 0 PID: 20908 Comm: beam.smp Not tainted 3.13.0-36-generic #63~precise1-Ubuntu
Hardware name: Xen HVM domU, BIOS 4.2.Amazon 05/23/2014
 ffff880192ca6c00 ffff880117ebfbe8 ffffffff817557fe 0000000000000007
 ffff8800ea1e9800 ffff880117ebfc38 ffffffff8174b5b9 ffff880100000000
 000000d08137dd08 ffff880117ebfc38 ffff88010c05e000 0000000000000000
Call Trace:
 [<ffffffff817557fe>] dump_stack+0x46/0x58
 [<ffffffff8174b5b9>] dump_header+0x7e/0xbd
 [<ffffffff8174b64f>] oom_kill_process.part.5+0x57/0x2d4
 [<ffffffff81075295>] ? has_ns_capability_noaudit+0x15/0x20
 [<ffffffff8115b709>] ? oom_badness.part.4+0xa9/0x140
 [<ffffffff8115ba27>] oom_kill_process+0x47/0x50
 [<ffffffff811bee4c>] mem_cgroup_out_of_memory+0x28c/0x2b0
 [<ffffffff811c122b>] mem_cgroup_oom_synchronize+0x23b/0x270
 [<ffffffff811c0ac0>] ? memcg_charge_kmem+0xf0/0xf0
 [<ffffffff8115be08>] pagefault_out_of_memory+0x18/0x90
 [<ffffffff81747e91>] mm_fault_error+0xb9/0xd3
 [<ffffffff81766267>] ? __do_page_fault+0x317/0x570
 [<ffffffff81766495>] __do_page_fault+0x545/0x570
 [<ffffffff8101361d>] ? __switch_to+0x16d/0x4d0
 [<ffffffff810a5d3d>] ? set_next_entity+0xad/0xd0
 [<ffffffff8175df1e>] ? __schedule+0x38e/0x700
 [<ffffffff817664da>] do_page_fault+0x1a/0x70
 [<ffffffff81762648>] page_fault+0x28/0x30
Task in /docker/a4d47fb7bbc8a2bbc172bd26085c4509364b1b7eec61439669e08e281b181a0b killed as a result of limit of /docker/a4d47fb7bbc8a2bbc172bd26085c4509364b1b7eec61439669e08e281b181a0b
memory: usage 229600kB, limit 262144kB, failcnt 5148
memory+swap: usage 524288kB, limit 524288kB, failcnt 19118
kmem: usage 0kB, limit 18014398509481983kB, failcnt 0
Memory cgroup stats for /docker/a4d47fb7bbc8a2bbc172bd26085c4509364b1b7eec61439669e08e281b181a0b: cache:0KB rss:229600KB rss_huge:8192KB mapped_file:0KB writeback:3336KB swap:294688KB inactive_anon:114980KB active_anon:114620KB inactive_file:0KB active_file:0KB unevictable:0KB
[ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name
[ 9537]     0  9537     8740      712      21     1041             0 my_init
[13097]     0 13097       48        3       3       16             0 runsvdir
[13098]     0 13098       42        4       3       19             0 runsv
[13100]     0 13100       42        4       3       38             0 runsv
[13101]     0 13101       42        4       3       17             0 runsv
[13102]     0 13102       42        4       3        4             0 runsv
[13103]     0 13103       42        4       3       39             0 runsv
[13104]     0 13104     4779      243      15       60             0 cron
[13105]     0 13105     8591      601      22     1129             0 Ruby
[13107]     0 13107    20478      756      43      560             0 syslog-ng
[13108]     0 13108    11991      642      28     1422             0 Ruby
[20826]     0 20826     4467      249      14       63             0 run
[20827]     0 20827     1101      144       8       29             0 huobi
[20878]     0 20878     3708      172      13       48             0 run_erl
[20879]     0 20879   249481    57945     321    72955             0 beam.smp
[20969]     0 20969     1846       83       9       27             0 inet_gethost
[20970]     0 20970     3431      173      12       33             0 inet_gethost
[20977]     0 20977     1101      127       8       25             0 sh
[20978]     0 20978     1074      125       8       23             0 memsup
[20979]     0 20979     1074       68       7       23             0 cpu_sup
[ 5446]     0  5446     8462      217      22       81             0 cron
[ 5451]     0  5451     1101      127       8       26             0 sh
[ 5453]     0  5453     1078       68       8       22             0 sleep
[10898]     0 10898     8462      217      22       81             0 cron
[10899]     0 10899     8462      216      22       80             0 cron
[10900]     0 10900     1101      127       7       26             0 sh
[10901]     0 10901     1101      127       8       25             0 sh
[10902]     0 10902     1078       68       7       22             0 sleep
[10903]     0 10903     1078       68       8       22             0 sleep
Memory cgroup out of memory: Kill process 20911 (beam.smp) score 1001 or sacrifice child
Killed process 20977 (sh) total-vm:4404kB, anon-rss:0kB, file-rss:508kB
_

_beam.smp_プロセスがメモリリソースを非常に積極的に消費することを私は知っています。したがって、ログ_beam.smp invoked oom-killer_の最初の行は意味があります。

しかし、ログの最後の2行について混乱しています。 Kill process 20911 (beam.smp)と書かれていますが、PID 20911のプロセスはこのcgroup内に存在しません(ログにダンプされたプロセスのリストもあります)。そして最後の行はKilled process 20977 (sh)と言っています(そしてこのPIDはcgroupに存在します)。 _beam.smp_を殺そうとしていましたが、ついにshを殺しました。どういう意味ですか?

1
sergeyz

OOMキラーは別のプロセスを強制終了することにしました。

メッセージは次のように述べています。

Kill process 20911 .... or sacrifice child

プロセスによって生成されたシェルスクリプトであるpid20977で子を殺すことに決めました。

Linuxでメモリ不足状態の原因となったタスクを常に強制終了する場合は、sysctl vm.oom_kill_allocating_taskを1に設定します。


カーネルドキュメント から:

これにより、メモリ不足の状況でOOMトリガータスクを強制終了できるか無効になります。

これがゼロに設定されている場合、OOMキラーはタスクリスト全体をスキャンし、ヒューリスティックに基づいてタスクを選択して強制終了します。これは通常、強制終了時に大量のメモリを解放する不正なメモリ占有タスクを選択します。

これがゼロ以外に設定されている場合、OOMキラーは、メモリ不足状態をトリガーしたタスクを単に強制終了します。これにより、コストのかかるタスクリストスキャンが回避されます。

Panic_on_oomが選択されている場合、oom_kill_allocating_taskで使用されている値よりも優先されます。

デフォルト値は0です。

9
Michael Hampton