Ubuntu 14.04.4 LTSでSupermicroサーバーを実行しています。ユーザー空間にほとんど触れずに、sy cpu時間を最大化するアプリがあります。 Ubuntu 12.04.4 LTSを使用して古いハードウェアで同じアプリを実行すると、CPUはユーザーとシステムの間ではるかにバランスが取れています。プロセスに関するパフォーマンス情報を取得するためにstraceを使用しましたが、epoll_waitがシステムCPU時間の98%を占めていることがわかりました。私はこの電話について多くの情報を見つけることができません。誰かがこれに光を当てることができますか?
「perf」を使用すると、CPUがどこで消費されているかをさらに詳細に確認できます。
Perfをインストールします。
Sudo apt-get install linux-tools-$(uname -r)
次に、すべてのCPUリソースを消費するプログラムを開始します
次に、perfを実行し、すべてのスケジューリングイベントを60秒間キャプチャします。
Sudo perf record -a sleep 60
それが完了すると、次を使用してすべてのパフォーマンスイベントのログを取得できます。
Sudo perf script > perf.log
そしてそれを見ることができます、またはもっと良いのは、以下を使用してCPUホットスポットをインタラクティブに見ることができます:
Sudo perf report
Epoll syscallをキャプチャするためだけに-e epoll_waitオプションを使用してプログラムのトレースから出力をキャプチャできる場合、それをこの質問に追加すると、何が起こっているのかがわかります。
Epoll_waitシステムコールは基本的にいくつかのepollイベントを待機しており、epoll_waitシステムコールのCPU消費が高い場合は、指定されたタイムアウトが小さすぎることを意味し、ループ内で何万ものepoll_waitコールが発生するか、実際、epoll_waitが待機しているコードが処理している多くのイベントが発生しています。または、プログラムのバグである可能性があり、何らかのエラーが発生している場合があります。典型的なエラー状態は、無効なパラメーターがシステムコールに渡されるEINVAL、または無効なファイル記述子が使用されているEBADF(おそらく失敗したオープンから)です。
そのため、プログラムを再度追跡します。
strace -f -e epoll_wait program-name >& strace.log
どんな種類のepoll_wait障害が発生しているかを確認します(-1の戻り値)。障害が発生していない場合は、タイムアウトが発生した(0)か、ファイル記述子がI/Oの準備ができた(return> 0)かを確認します。