私たちのサーバーのうちの1台で、アプリケーションに非常に高いCPU負荷が発生しています。私たちは様々な統計を見て、問題の原因を見つける問題を抱えています。CPUが多い、コンテキスト切り替えの可能性がありますか?
現在の理論の1つは、スレッドが多すぎることと同時に実行中のスレッドの数を減らそうとする必要があるということです。 3000スレッドのメインスレッドプールが1つあり、WorkManager(これはJava EE - Glassfish)で動作します。任意の瞬間に、並列で実行する必要がある約620の別個のネットワークIO操作があります(java.NIOの使用はオプションではありません)。さらに、IOが含まれておらず、パラレルに実行される操作は約100件あります。
この構造は効率的ではなく、実際に損傷を引き起こしているかどうか、あるいは単に悪い習慣であるかどうかを確認したいと考えています。理由は、このシステムでは(人時間の点で)変更が非常に高価であるため、問題の証拠が必要です。
これで、必要な並行操作よりもはるかに多くのスレッドが存在するため、スレッドのコンテキスト切り替えが原因であるのかどうか疑問に思っています。ログを見ると、平均して14個の異なるスレッドがある秒間に実行されていることがわかります。 2つのCPU(以下を参照)の存在を考慮すると、CPUあたり7つのスレッドになります。これはあまりにも多くのように聞こえることはありませんが、我々はこれを確認したかったのです。
だから、私たちは文脈の切り替えや多すぎるスレッドを問題として除外できますか?
一般詳細:
- のJava 1.5(はい、それは古いです)、CentOSの5、64ビット、Linuxカーネル上で動作する2.6.18-128.el5
- ただ1つのJavaプロセスがありますマシン上には何もありません。
- 2つのCPU、VMwareの下。
- 8GB RAM
- マシン上でプロファイラを実行するオプションはありません。
- JavaやOSをアップグレードするオプションはありません。
UPDATE 以下のアドバイスとして、私たちは様々な負荷での我々のテストサーバー上(のvmstat 1 120を使用して)負荷(稼働時間を使用して)平均値とCPUのキャプチャを行ってきました。我々は、システムが新たな負荷を中心に安定していることを確認するために、各負荷変動とその測定値の間の15分を待っていましたし、平均負荷番号が更新されていること:運用サーバーのワークロードの
50%:http://pastebin.com/GE2kGLkk
34本番サーバーのワークロードの%:本番サーバーのワークロードのhttp://pastebin.com/V2PWq8CG
25%:http://pastebin.com/0pxxK0Fu
CPU使用率が非常に大幅なレベル25から50までパーセントから(変化への負荷が軽減として減少するように見えますが、ではありません%は実際には50%ではありませんCPU使用率の削減)。負荷平均は作業負荷の量と無関係のようです。
私たちのテストサーバーもVMであるため、同じホスト上で実行されている他のVMがそのCPU測定値に影響を与える可能性があります(上の測定は役に立たない)?三つの部分(ペーストビン限界)
第1のスレッドのスナップショットを取り付け
UPDATE 2 :http://pastebin.com/DvNzkB5z
パート2:http://pastebin.com/72sC00rc
パート3:http://pastebin.com/YTG9hgF5
スレッドプール内のスレッド数を減らして、役立つかどうかを確認してください。 – Voo
CPU使用率が高いと、CPUリソースの使用率が最適であることを意味します。あなたのスレッドは、I/Oやロックを待つことなく何かを計算しています。あなたのCPUを不必要に消費するタイトなループを持たないかぎり、あなたが達成した並行性の高さについては満足しているはずです。 – dasblinkenlight
@dasblinkenlightこれは、(コンテキストの切り替えなどの)無駄がないことを証明できれば真です。これを行うことができれば、システムチームにCPUを追加して、それを正当化するように指示することができます。しかしまず、私たちは宿題をしなければなりません。 – Yon