
私はいくつかのクエリを完了するのに長い時間がかかり、/var/log/messagesに次のエントリがたくさん表示されるMySQLの問題を解決しています。
Jan 28 05:52:15 64455-alpha01 kernel: [2529273.616327] INFO: task mysqld:4123 blocked for more than 120 seconds.
Jan 28 05:52:15 64455-alpha01 kernel: [2529273.616525] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Jan 28 05:52:15 64455-alpha01 kernel: [2529273.616813] mysqld D 000000000000000d 0 4123 3142 0x00000080
どういう意味ですか? MySQLスレッドにどのような影響がありますか(4123はスレッドIDですか?)
今確認したときの値は次のとおりです/proc/sys/kernel/hung_task_timeout_secs
。
$ cat /proc/sys/kernel/hung_task_timeout_secs
120
具体的には、プロセスにどのような影響があるのか疑問に思います。
私は、フォーラムでプロセスがあまりにも多くのメモリを占有しているときに発生することを読みました。
答え1
「ジョブの中断」は、カーネルがジョブを中断できない「D」状態にするバグです。この状態のジョブ/プロセスは終了できず、終了することもできませんkill -9
。
あなたの/var/log/messages
メッセージは4123
、ジョブ(明らかにmysqlデーモン)が120秒後にこの状態にあったことを意味します。これは、mysqlデーモンがリソースを待っていることを意味します。ほとんどの「D」状態はI / Oによって引き起こされます。
プロセスが開いたファイルハンドルに対して読み取りシステム呼び出しを要求すると、ファイルを読み取る必要があるたびに「D」状態に入ります。プロセスは「ブロック」されています。
この値は、/proc/sys/kernel/hung_task_timeout_secs
表示されるメッセージがログに表示される時期のみを定義します。メッセージに示すように、値をに設定するとメッセージを無効にできます0
。しかし、これは問題を解決しません。
次の2つの方法でのみ中断不可能な状態を解決できます。
- システムを再起動するか...
- プロセスにどのリソースが必要かを調べ、そのリソースが利用可能であることを確認してください。
答え2
echo 0 > /proc/sys/kernel/hung_task_timeout_secs
ただ警告を沈黙させるだけです。それ以外には影響はありません。 0より大きい値を使用すると、ジョブが一定期間ブロックされるたびにこのメッセージが表示されます。
警告は、システムに問題があることを示します。私の経験によると、これは通常、プロセスのディスクI / Oが不足しているため、プロセスがカーネルスペースで少なくとも120秒間ブロックされることを意味します。これは、メモリが多すぎるスワッピングが多いためです。たとえば、Webサーバーの負荷が多すぎて、システムがあまりにも多くのApacheサブプロセスで構成されているとします。あなたの場合、メモリとデータIOを配置して競合するmysqlプロセスが多すぎる可能性があります。
これは、SANが過負荷になったり、ディスクに多くの再試行を引き起こすソフトエラーがある場合など、プライマリストレージシステムのパフォーマンスが低下した場合にも発生する可能性があります。これらのアラートは、ジョブがIOコマンドを完了するのに長い時間待たなければならない場合に常に発生する可能性があります。