web-dev-qa-db-ja.com

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

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

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

この問題がhttpdmysqld、または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`
42
ibedelovski

カーネルは、これが発生する前に大量のログを記録しますが、/var/log/messagesの構成方法によっては、ほとんどが(r)syslogdに含まれない可能性があります。試してください:

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

前者は多くの時間を示し、後者は1つまたは2つの場所でのみ表示されます。それはあなたが見たいファイルです。

total_vmも含むファイルの1つで、元の「メモリ不足」行を見つけます。その行の前に30秒から1分(長くなる場合もあれば短くなる場合もあります)は、次のようなものを見つけます。

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

また、その行と「メモリ不足」行の間のどこかに、次のようなヘッダーを持つテーブルを見つける必要があります。

[ 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が何か間違っていることを意味する必要はありません。テーブルを調べて、その時点で他に何か問題があったかどうかを確認できますが、明確な原因はない可能性があります。実行中のプロセスを誤って判断したり、構成を誤ったりしたために、システムがメモリ不足になる可能性があります。

58
goldilocks

これの鍵はメッセージ自体にあります-メモリ不足。 Linuxカーネルの仮想メモリが不足すると(物理RAM plus swap))プロセスが強制終了され、まさにここで何が起こったかです。mysqldが2GB以上を使用しているようです仮想メモリ。

RAMおよびスワップはシステムにどのくらいありますか?追加のRAMまたは、それが不可能な場合は、追加のスワップを追加することを検討します。クイックフィックスとして少なくともプロセスが終了しないようにするには、スワップファイルを追加します。

更新: RAMの量を確認すると、すぐに問題を確認できます。〜= 1.6GBのRAM 100MBのスワップでありながら、MySQLはそれよりもはるかに多くのRAM=を使用しています。そのため、プロセスが終了していることがわかります。

6
mjturner