/ var / log / messagesを使用してメモリ不足をデバッグする


42

次のレポートがメッセージログにスローされます。

kernel: Out of memory: Kill process 9163 (mysqld) score 511 or sacrifice child
kernel: Killed process 9163, UID 27, (mysqld) total-vm:2457368kB, anon-rss:816780kB, file-rss:4kB

この問題がのためのものhttpdであるmysqldかどうかは関係ありませんが、どうすれば問題のpostfixデバッグを続行できますか。

PID 9163がなぜ殺されたのか、そしてLinuxがどこかで終了したPIDの履歴を保持しているかどうかについての詳細情報を得るにはどうすればよいですか。

これがメッセージログファイルで発生した場合、この問題を段階的にトラブルシューティングする方法を教えてください。

# free -m

             total       used       free     shared    buffers     cached
Mem:          1655        934        721          0         10         52
-/+ buffers/cache:        871        784
Swap:          109          6        103`

問題に関するすべてのメッセージは何に表示されdmesgますか?
Stark07

OOMに関する有用な詳細- linux-mm.org/OOM_Killer
slm

回答:


57

カーネルは、これが起こる前に大量のものをログに記録し/var/log/messagesます(r)syslogdが、設定の方法によっては、そのほとんどはおそらくに含まれません。試してください:

grep oom /var/log/*
grep total_vm /var/log/*

前者は何回も表示され、後者は1つか2つの場所にのみ表示されます。それが見たいファイルです。

を含むファイルの1つで元の「メモリ不足」行を見つけますtotal_vm。その行の前に、次のようなものが見つかるでしょう。

kernel: foobar invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0

また、この行と「Out of memory」行の間のどこかに、次のようなヘッダーを持つテーブルがあります。

[ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name

これは、あなたが既に知っている以上のことを教えてくれないかもしれませんが、フィールドは次のとおりです。

  • pidプロセスID。
  • uidユーザーID。
  • tgidスレッドグループID。
  • total_vm仮想メモリの使用(4 kBページ)
  • rss常駐メモリの使用(4 kBページ)
  • nr_ptesページテーブルエントリ
  • swapentsは、エントリを交換します
  • oom_score_adj通常0。数字が小さいほど、OOMキラーが呼び出されたときにプロセスが停止する可能性が低くなります。

あなたはほとんど無視することができますが、これらは誰が殺されるかを決定する要因だnr_ptesswapents思いますが。これは、必ずしも最も多くのメモリを使用するプロセスではありませんが、可能性が高いです。選択プロセスの詳細については、こちらをご覧ください。基本的に、最高のoomスコアで終わるプロセスは強制終了されます。それは、「メモリー不足」行で報告される「スコア」です。残念ながら、他のスコアは報告されませんが、その表は要因の観点からいくつかの手がかりを提供します。

繰り返しますが、これはおそらく明らかなことを明らかにする以上のものではありません:システムがメモリを使い果たし、それを殺すとほとんどのリソースが解放されるためmysqld死ぬことを選択しました。これは必ずしもmysqld悪いことをしているという意味ではありません。表を見て、その時点で他に何かがうまく行かないかどうかを確認できますが、明確な原因はないかもしれません。実行中のプロセスを誤って判断したか、誤って設定したためにシステムがメモリ不足になる可能性があります。


5
dmesgこれが保証される場所です。/var/logsyslogデーモンが読み取りを行う場合のみになります/dev/kmsg(通常は読み取ります)。
パトリック

2
@Patrickそれはあなたがいつ見に行くかによる。それが通常のファイルログのいずれかに記録されている場合(または、ロガーで何か愚かなことをしているはずです)、それは長い間存在しますが、この時点で、OPが発生した問題を診断したい場合昨日、または前日など、dmesgシステムが稼働している場合でも、レコードはもう入っていない可能性があります。
ゴルディロックス

6

これの鍵は、メッセージ自体にあります- メモリ不足。Linuxカーネルの仮想メモリ(物理RAMとスワップ)が不足すると、プロセスの強制終了が開始されます。これがまさにここで発生したことです。mysqld2GB以上の仮想メモリを使用していたようです。

システムにはどのくらいのRAMとスワップがありますか?RAMを追加するか、それが不可能な場合は、スワップを追加することを検討します。少なくともプロセスの終了を防ぐための簡単な修正として、スワップファイルを追加できます。

更新:使用しているRAMの量を見ると、すぐに問題を確認できます。1.6GBのRAMと100MBのスワップがありますが、MySQLはそれ以上のRAMを使用しています。これが、プロセスが終了するのを見る理由です。


total used free shared buffers cached Mem: 1655 934 721 0 10 52 -/+ buffers/cache: 871 784 Swap: 109 6 103 これは、プロセスが殺されたと同時に、メモリ出力である
ibedelovski

おそらく、フォーマットを保持したまま、元のメッセージに貼り付けることができますか?読みやすくなります。
mjturner

私は書式設定では本当に良いではないよ...しかし、すでに元のメッセージに貼り付け
ibedelovski
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.