3

私はかなり人気のあるブラウザベースの Web ゲームを実行しており、Apache (ワーカー) と mod_perl で実行しています。サーバーが 1 分間に約 4200 のリクエストを処理しているピーク時には、3 ~ 15 分に 1 回程度、Apache プロセスがハングします。

これらのプロセスが「FUTEX_WAIT」状態でスタックし、何もしていないように見えることを確認しました。CPU を消費したり、RAM を大きくしたりしません。しかし、RAM を占有するだけなので、これは深刻な問題です。

私の現在の解決策は、futex_wait_queue_me でスタックしている Apache プロセスを選別する cron ジョブです。しかし、ハングした Apache プロセスからの応答をたまたま待っているユーザーがエラー (500: データを送り返さずにサーバーが接続を閉じた) を受け取るため、これは素晴らしいことではありません。

開発マシンで問題を再現できず、トラブルシューティングの進め方がわかりません。知りたいのですが、これをさらに診断するにはどうすればよいですか?

編集:トラフィックのバーストに続いて問題が発生することがわかりました.Apacheがさらにいくつかのワーカープロセスを生成し、その後それらを選別しようとします。これは、子供の視点から見た、正常に動作するときの様子です。

$ sudo strace -p 21764
Process 21764 attached - interrupt to quit
read(5, "!", 1)                         = 1
tgkill(21764, 21791, SIGHUP)            = 0
tgkill(21764, 21791, SIG_0)             = 0
select(0, NULL, NULL, NULL, {0, 500000}) = ? ERESTARTNOHAND (To be restarted)
--- SIGTERM (Terminated) @ 0 (0) ---
rt_sigreturn(0xf)                       = -1 EINTR (Interrupted system call)
munmap(0x7f9905750000, 8392704)         = 0
munmap(0x7f98f8736000, 8392704)         = 0
[...]
madvise(0x7f98e4021000, 73728, MADV_DONTNEED) = 0
exit_group(0)                           = ?
Process 21764 detached

...しかし、時折、次のようになります。

$ sudo strace -p 24133
Process 24133 attached - interrupt to quit
read(5, "!", 1)                         = 1
tgkill(24133, 24164, SIGHUP)            = 0
tgkill(24133, 24164, SIG_0)             = 0
--- SIGTERM (Terminated) @ 0 (0) ---
rt_sigreturn(0xf)                       = 0
select(0, NULL, NULL, NULL, {0, 500000}) = 0 (Timeout)
tgkill(24133, 24140, SIGUSR1)           = 0
futex(0x7f9904f4e9d0, FUTEX_WAIT, 24140, NULL

...そしてそれ以上進みません。

これ以上デバッグする方法がわかりません。

4

2 に答える 2

2

これは mod-perl のバグによるもので、修正されたため、次のドキュメントに記載されています。

http://www.gossamer-threads.com/lists/modperl/dev/104026

于 2014-01-10T02:21:57.210 に答える
1

トラフィックが最も少ない時間を選択し、稼働中のマシンで strace を使用して apache を起動すると、エラーの原因を突き止めることができます。あるインターネット ブロガーのソリューションは、

rm /dev/random 
mknod -m 644 /dev/random c 1 9 

500: server closed connection without sending data backリバース プロキシ セットアップを使用することで回避できるため、Apache がデータなしでタイムアウトを検出すると、クライアントは要求を別の mod_perl 子に転送します。

そうすれば、クライアントが 500 を取得する代わりに、彼のリクエストにさらに 5 秒かかります (方法について私に聞かないでください。mod_perl/apache ガイドを参照してください:)

于 2011-10-15T11:22:29.690 に答える