web-dev-qa-db-ja.com

パフォーマンスの低いJavaアプリケーションとパフォーマンスの低いサーバー

これは非常に一般的な質問ですが、私にとってはますます頻繁に出てきます。将来、私や他のシステム管理者に利益をもたらす可能性があると思うので、この一般的なケースに対する適切な行動方針を決定しようと思います。ただし、すべての場合の共通点はJavaです。スタックオーバーフローではなく、ここでこの質問をしている理由は、これがsysadminの質問だからです。ここはとても適切だと思います。

ユーザーが私のところに来て、「私のアプリケーションは非常に遅いです。あなたが私にくれたサーバーのパフォーマンスが悪いです」と言います。このサーバーは、ベアメタル、OpenVZ、またはKVMである可能性があります。いずれの場合も、OSはCentOS 6です。ユーザーがこれを言うと、ページの読み込み時間(JIRA)またはベンチマークの数値を参照しています。 (Seleniumまたは独自のアプリ)

今、私はサーバー自体は大丈夫だとこっそり疑っています。サーバーにsshすると、負荷が1未満であることがわかります。メモリ使用量も問題なく、RAMの空き容量は2〜20ギガです。最後に、iowaitvmstatでチェックすると、0であることがわかります。cpuidleは99です。

Java with topを見ると、そのプロセスのCPUパーセンテージは約200%であることがわかります。これは、4〜24コアのシステムで発生します。

もちろん、openvzはKVMまたはベアメタル)とは異なるプロセッサ割り当てを行います。これがopenvzまたはkvmゲストで発生する場合、私もホストに飛び乗って、同様のことを確認します。 CPUアイドルは99%です。 iowaitは0です。メモリは何百ものギグが空いている場合があります。

私はこれらのJavaプロセスとスレッドをstrace、およびstrace -f。たくさんのfutex、clock、およびepollがあります。それらをgrepを逆にすると、ほとんどioctl、stat、sendtoが残ります。

これが発生したアプリケーション:Selenium、JIRA、およびその他の独自仕様のJavaアプリケーション。ただし常にJava。

Javaプロセスの良さを調整することを検討しましたが、AFAIKの良さは、プロセスのスケジュール方法にのみ影響します。負荷が低い場合は、処理速度を上げるのに役立ちません。

アプリケーションがmysqlを使用することもありますが、上部のmysqlを見ると、CPU使用率がほとんどないことがわかります。それがボトルネックだったとしたら、CPU使用率が高くなると思います。

結論:サーバーが正常に機能していることをユーザーに証明するにはどうすればよいですか?理論的には、アプリケーションは、決して終了しないwhileループに遭遇したため、遅くなる可能性があります。これは、停止問題を解くのと同じように、このタスクは不可能であると私に信じさせます。 o_Oしかし、おそらく私はJavaを少し良く動作するように調整することができます。あるいは、実行中のアプリケーションのプロファイルを作成し、コードのチャンクをポイントして「問題があります」と言う方法があるかもしれません。

7
cat pants

シャーロック!

不可能を排除したら、どんなにありそうもないとしても、残っているものはすべて真実でなければなりません。 -アーサーコナンドイル

まず、パフォーマンスの問題の原因とその診断方法についてのディスカッションである this トークを確認することをお勧めします。 LinuxとSmartOSを比較します。これは、投稿のポイントとは別のものですが、パフォーマンスの問題がどこから来ているのかを解明するのにも役立ちます。

通常、ソフトウェアのパフォーマンスの問題をデバッグするときは、同じバージョンのJava、同じカーネル、同じユーザーランドなどを使用して、まったく同じソフトウェア構成を別の物理マシンに複製する必要があります。パフォーマンスの問題が存在しない場合、次に、物理ハードウェア、ハイパーバイザー/コンテナーレイヤー、またはボックスへのインストールの問題を調べ始めることができます。

ユーザーがこれまでこの特定のOS /バージョン構成でこのソフトウェアを実行したことがない場合、ユーザーはそれがサーバーであるとすぐに主張することはできません。私はむしろthemに立証責任を負わせて、CentOS 6を実行していることを示します(同じマイナーバージョン、同じハイパーバイザー、同じホストOSで実行されていない場合は、ベアメタル)、より良いパフォーマンスを得ることができます。

パフォーマンスが向上するのは、システムスペックがはるかに優れているためである場合(たとえば、インフラストラクチャのローエンドプロセッサで1 GB KVM、ただし独自の24コアで実行)ハードウェアRAID0に8つのPCIeSSDを搭載したIvyBridge E5システム(1000%高速)の場合、物理ハードウェアについて話し始めることができます。物理ハードウェアが同じまたは非常に類似している場合は、OS /ハイパーバイザー構成について話し始めることができます。

また、アプリケーションのパフォーマンス、ユーザー数、およびデータワークロードに基づいて、ユーザーに割り当てられたハードウェアがタスクに対して単に不十分である可能性を考慮することもできます。これが非常に重要な顧客であり、顧客を満足させることがビジネスにとって重要である場合は、仮想コンテナまたはVMインスタンス;たとえば、次のように、仮想コンテナに課す可能性のある制限の一部を取り消すことができます。一時的に追加のRAMまたはCPU時間、ネットワーク帯域幅などを提供し、それが役立つかどうかを確認します。役立つ場合は、より大きな金額を支払う必要があることをユーザーに伝える必要があります= VMそのワークロードで必要なパフォーマンスを得るには、.


火傷からの脱出(それがあなたの問題ではない場合)

何らかの理由で、ユーザーが別のハードウェアで同じソフトウェア構成を試すことを拒否した場合は、アプリケーションのパフォーマンスの問題のトラブルシューティングを支援する必要があります(Brendan Greggが説明しているように、Linuxでは困難または不可能な場合があります)。彼の話では、パフォーマンスコストを「身につける」必要がある場合もあれば、単にユーザーが間違っていると主張する場合もあります。これは、システムで開発者をサポートすることの不幸な副作用です。

この時点で、ユーザーとのビジネス関係(ある場合)を自問する必要がある場合があります。民間部門でアンマネージドホスティングを提供している場合は、ユーザーのコードのパフォーマンスを保証する責任がないことを主張する必要がある場合があります。

マネージドホスティングを提供している場合、または問題が彼らのせいであるかどうかに関係なく、ソフトウェアの人々が苦しんでいるのを助けることに同意している場合は、袖をまくり上げて取得する必要があります手を汚し、より洗練されたパフォーマンスプロファイリングツールの実行を開始して、実際の問題を見つけることができるかどうかを確認します。これは、ネットワークソケットでの本当におしゃべりなプロトコルブロッキングですか?それはメモリI/Oバウンドですか?または、BIOSでVT-xが有効になっていない可能性がありますか?リストすることすらできないほど多くの可能性があります。

このセクションを要約すると、この問題の解決に責任を負わないようにするビジネス上または政治上の理由を見つけることができれば、それが最も簡単で効率的な方法かもしれません。残念ながら、これはまた、ユーザーが自分の問題を修正できない可能性があり、代わりに他のビジネスパートナーを探すことに頼ることができることを意味します。


炎を煽る(それがあなたの問題であるとき)

共通のテーマはJavaであるように見えるので、少なくともJavaプロセス自体が非常に遅いコードを実行しているかどうかを判断することから始めることができます。このため、理想的には、開発者/ユーザー/お客様は、Javaプログラム(およびすべての依存ライブラリ)のソースコードを提供できるようになります。

良い profiler の下でプログラムを実行してみてください。無料と非無料のプロファイラーがあります。無料のものの例は、 NetBeans に付属しているものです。プロファイラーを正常に起動してアプリケーションをインストルメント化することは、そのアプリケーションが何であるかによっては難しい場合がありますが、ほとんどの場合、結果は何らかの形でわかります。

もちろん、htopおよび/またはiotopを使用して、Java VM(または関連するVM $ ===)かどうかを検出することもできます。 RDBMS)は、(ハードウェアとワークロードを考えると)「合理的」と思われる量を超えて、CPU、メモリI/O、またはディスクI/Oを大量に実行しています。これらは非常に幅広いストロークのツールであり、パフォーマンスの問題は、リソースとは関係のない他の何かを待っている間にプログラムが実行していないことに関するものである場合があるため、常に全体像を把握できるとは限りません。ボトルネック。これは、エンジンが正常に動作しているかどうかを判断するために車を始動しようとするのと同じくらい一般的なトラブルシューティング手順です。始動しない場合は、どうしますか?そのため、適切なJavaプロファイラーは、本当に深く掘り下げる必要がある場合に役立ちます。

最後に、ブレンダン・グレッグが彼の講演で言ったことをエコーし​​、DTraceについて言及します。 DTraceの全機能は、dtrace-on-Linuxの再実装によっても、SystemTapのような競合他社によっても、Linux上でまだ複製されていません。そうは言っても、これらのツールの1つを試行して、それが役立つかどうかを確認することができます。 いくつかの洞察はnoneよりも優れている可能性があります。

もちろん、これらの非常に「スイスアーミーナイフ」っぽいタイプのツールを使用するには、特定の専門知識が必要になります。あなたは多くの経験を通してその専門知識のほとんどを得るでしょう(読んでください:試行錯誤、そしてグーグル)。ツールを起動して問題を指摘するだけではありません。利用可能なデータに基づいて問題を解決する必要があります。 簡単ではありません。パフォーマンスはめったにありません。

7
allquixotic