停止し、SIGKILLを無視し、実行可能なプロセス(ゾンビでも割り込み不可能なスリープでもない)。どんな状態ですか?


17

数回は応答を停止し、完全にロックしているように見えるプロセスがあります。straceの試行やgdbのピークには応答しません(gdbはwait4()syscallでハングします)。プロセスは実行可能であり、syscall(/ proc / X / syscall:)runningまたは割り込み不可能なスリープ(/ proc / X / status :)で待機していませんState: R (running)

このプロセスはどのような状態ですか?これはおそらく何らかのタイプのカーネルバグですか?

プロセスはredisです、そして、これは今数回起こりました。プロセスを強制終了できるのは再起動だけだと思われます。OSはCent 7です。

編集:カーネルのバージョンは3.10.0-123.13.2.el7.x86_64です。3.10.0-229.11.1.el7へのアップデートを試して、違いが生じるかどうかを確認してください。


使用しているGDBのバージョンは何ですか?stackoverflow.com/questions/8978777/…によると、新しいバージョンの方がうまくいくかもしれません。
グレッグブレイ

現在、調査はハングする特別な方法のためにカーネル側にあるように見えますが、気にしないのであれば、いくつかのRedis固有の情報を追加できますか?ブロック中にプロセスが何をしているかなど。Nick CraverからTwitter経由でいくつかの情報を入手しましたが、Redisはこれが起こったときに大きなデータセットをロードしているようです。データセットはプロセスを再起動するなどの方法でロードされています(たとえば、DEBUG RELOAD、または大量のデータ)?ありがとう。

@antirezデータセットは、別のredisインスタンスからのrdbコピーによってロードされています。ロックアップは、redisが起動して巨大なrdbを読み込んだ後に発生します。特に、この間、常にロックアップするわけではありません。
エイリアン

1
IOエラーが発生した場合にのみ、この種の問題が発生しました。dmesg出力について教えてください。
Ho1

3
/proc/<pid>/stack(および/proc/<pid>/task/*/stack)何が含まれていますか?そのプロセスにはいくつかのスレッドがありますか?
ステファンシャゼル

回答:


2

wait4は、プロセスが子の終了を待っていることを示すsyscallです。これにより、信号処理に問題が生じる場合があります。

少し残忍ですが、アプリの階層を殺そうとする場合がありますkill -15 -$YourRedisPID。PIDの前の-は、「PIDとその子」を意味します。子の終了を待っているように見えるため、ロックを解除できます。

動作していない場合は、さらに詳しくチェックしてみましょう。 grep ^Sig /proc/$YourRedisPID/status

次のようなものが表示されます。

SigQ:   8/62777
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000080
SigCgt: 0000000180004023

カーネルソースの「fs / proc / array.c」で定義されているように、「SigQ」は保留中のシグナルの数/保留中のシグナルの制限です。

シグナルの数が多すぎる場合は、「SIGKILL」がまったく処理されていない可能性があります。これらの特別な信号の信号管理を理解するために、私はまだ「kernel / signal.c」ファイルをチェックしています。

出力を直接理解するには、このワンライナーを試してください: awk 'BEGIN{print "ibase=16;obase=2;"} /^Sig...:/{ print toupper($2)}' /proc/$YourRedisPID/status | BC_LINE_LENGTH=0 bc

これは私を出力します:

0
0
10000000
110000000000000000100000000100011

この出力を送信することから始めましょう。必要に応じて投稿を更新します。


プロセスはwait4()にありません。プロセスにアクセスしようとすると、gdbはwait4()でハングします。プロセス自体はどのsyscallにもありません。また、ハングしたプロセスには子がありません。残念ながら、ボックスを再起動する必要がありました。問題が再発したら、リクエストされたデータを収集します。
エイリアン

ここに出力:gist.githubusercontent.com/alienth/23685ad2ea46a7eade56/raw/… もう一度、procはSIGKILLを無視します。システムコールではありません。ProcはSIGTERMも無視します。
エイリアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.