現在、何度も応答を停止し、完全にロックされているように見えるプロセスがあります。 strace試行やgdbを介したビューには応答しません(gdbはwait4()システムコールで中断されます)。プロセスは実行可能であり、システムコール(/proc/X/syscall:)running
または中断のないスリープモード(/proc/X/status:)を待ちませんState: R (running)
。
このプロセスの状態はどうですか?これは一種のカーネルバグかもしれませんか?
プロセスはredisで、これが何度も起こりました。プロセスを終了する唯一の方法は再起動のみです。オペレーティングシステムはCent7です。
編集:カーネルバージョンは3.10.0-123.13.2.el7.x86_64です。 3.10.0-229.11.1.el7にアップデートして、違いがあるかどうかを確認してください。
ベストアンサー1
wait4 は、プロセスが子のいずれかが終了するのを待っていることを示すシステムコールです。これは、信号処理にいくつかの問題があることを示すことができる。
少し残酷ですが、誰かを殺そうとするかもしれません。階層アプリケーション: kill -15 -$YourRedisPID
.this-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
この出力を送信することから始めましょう。必要に応じて投稿を更新します。