私が書いたサーバーで時折問題が発生しています。それは Clojure にありますが、それは問題ではないと思います。Java にあるふりをすることができます。とにかく、一度に何時間も正常に動作しますが、動作が非常に悪い場合に適合します。すべてのアクティビティが約 15 秒間停止し、その後数秒間正常に動作し、その後 15 秒間停止します...など(通常) 約 10 分間オンにしてから、通常の動作に戻ります。
私は YourKit を使って多くのプロファイリングを行い、いくつかのもっともらしい容疑者を除外しました:
これはガベージ コレクションの問題ではありません
-XX:+UseConcMarkSweepGC
。このガベージ コレクタの同時実行の性質により、マイナー コレクションとメジャー コレクションの両方でサーバーが正常に動作し続けることを確認しました。また、総メモリなどを使い果たしたときにスラッシングしているわけではありません。現在のヒープ サイズは最大値を大きく下回っています。ロック/同期の問題ではないと思いますが、100% 確実ではありません。YourKit プロファイラーは、時々スレッドが待機していることを示します。たとえば、ログ メッセージを生成するために System.out のロックをめぐって競合しますが、長時間待機するのは、何もすることがないときのスレッドプール内のワーカー スレッドだけです。そしてもちろん、YourKit はデッドロックを検出したことがないと言っています。
サーバーを起動して、プロファイラーを接続せずに放置しても発生するため、プロファイラーが接続されていることが原因ではありません。
すべての CPU 時間を占有しているシステム上の他のプロセスではあり
top
ません。私の Java プロセスの CPU 使用率は 100% であり、他のすべてのプロセスは基本的に 0% です。
私の最大の問題は、プロファイラーがサンプルの受信を停止するため、これらの奇妙なファンク中にサーバーが何をしているかを確認できないことです。CPU使用率チャートのグラフは次のとおりです。
グラフの左側は通常の動作で、約 1 秒ごとにプロファイラーのサンプルが取得されます。右側は「壊れて」おり、プロファイラーが 10 秒ごとにサンプルしか取得していないため、非常に尖っています。取得したサンプルでは、サーバーは通常の業務を行っているように見えます。つまり、リクエストへの応答などです。ログは、それが通常のことを行っていることを確認しますが、プロファイラーがサンプルを持っているときだけです: プロファイラーがサンプルを持っていない、グラフ上で上向きに傾斜している「直線」の間、サーバーはまったく何もしていません.
では、このグラフは誰にでも見覚えがあるでしょうか? 以前にこの問題があり、それを修正したことがありますか? または、YourKit ができないときにサーバーが何をしているかを把握できるツールの方向を教えてもらえますか? 重要な場合、サーバー マシンは Ubuntu 10.04 を実行しており、
$ java -version
java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.10) (rhel-1.28.1.10.10.el5_8-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)