Javaアプリケーションのパフォーマンスを(ほぼ)自動的に上げる方法

  • このエントリーをはてなブックマークに追加

   

7a5f72f8ce2703f96ac0ce5a2b6f2bd5_s

コードを書き換えずに簡単な手順をいくつか踏むだけで、複雑なJavaアプリケーションを10%以上スピードアップすることは可能なのだろうか?そう、JavaのVMを正しく設定すれば可能だ。

JavaのVMで、最も膨大なリソースを必要とするコンポーネントの一つが、ガベージコレクタ(GC)である。ガベージコレクタは、参照されていないオブジェクトを自動で回収し、メモリを確保する。無数のオブジェクトが一度に回収されることで、アプリケーションが滞ってしまったり、ヒープのクリーンアップのために2、3秒止まってしまったりする恐れもある。この問題にどう対処すればいいのだろうか?

ガベージコレクタ5つに、280のパラメータ

HotSpot VMには、様々な作業負荷に備えて複数のガベージコレクタが搭載されている。ガベージコレクタはそれぞれ、アプリケーションのメモリプロファイルを自身に適応させるため、様々な方法で微調整をすることができる何百ものパラメータを有している。しかし、こうしたパラメータの本来の意味を誰が理解しているのだろうか?ほとんどの場合、パラメータはVM内部を参照するが、ユーザがそこから得られる情報はほぼ何もない。したがって、大勢のシステムアドミニストレータは試行錯誤の末、必死に最適な設定を見つけようとする(そして多くは無駄に終わる)。

 

memory-groups-600x243
Java 8のGC関連のパラメータの数は圧倒的に多い。

オーストリア・リンツにあるヨハネス・ケプラー大学(JKU)との共同研究プロジェクトで、Dynatrace社は、ある特定の作業負荷用に、ほぼ最適なガベージコレクタの設定を自動的に決定する方法を見つけた。その考え方は単純だ。特定のGCパラメータ設定を用いたアプリケーションを実行し、そのGCタイムを計測する。それから、1つ以上のパラメータをわずかに変更し、再度計測する。もしGCタイムが改善されていたら、その設定は残され、そうでなければ破棄される。このようにして任意に選ばれた変更を試していくことで、最適なGC設定を学習することができる。当然、手動で変更する必要がないよう、このプロセスは自動化される必要がある。Java 8では、GC関連のパラメータが圧倒的に多いのだ。

山登り法

このテクニックは「山登り法」と言われ、AIのコミュニティではよく知られている。これは多次元パラメータ空間を歩き回り、可能な限り「上に向かって」進むことで、最適条件(すなわち「丘の頂上」)を見つけようとするものである。局所最適に引っかからないよう、他の場所で改善可能かどうかを確認するため、アルゴリズムは随時、より大きなパラメータ変更を適用する。私たちは、Hutter氏らによるParamILSと呼ばれる山登り法の特別な実装を用いた。

Dynatrace社は、とある事例研究で、例外的にたくさんのリクエストを処理させることで限界まで作業負荷をかけた自社サーバの一つに、このテクニックを応用した。スループット(すなわち処理可能な最大リクエスト数)の計測後、最適なスループットを得られるまで、山登り技法を使ってGCパラメータが自動的に修正される。このケースでは、スループットは14%改善された!

SPECjbbに適用されたGarbage First GC

 

g1-600x122

SPECjbb ベンチマーク Garbage First GC比較(赤: 初期設定、緑:最適化設定)

SPECjbb ベンチマークをGarbage First GCで実行すると、計測からは、多くのオブジェクトが早死にする一方で平均的なオブジェクトの没年齢はxalanなどの他のベンチマークよりかなり高いことがわかる。この数字は、GCタイムと世代ごとの頻度、ヒープ空間の使われ方を示している。初期パラメータ設定は、若い世代のオブジェクトをほぼ全て保持していたことがわかった。しかしながら、在任している長生きのオブジェクトは先立って、高年齢層を犠牲にして若い世代のGCタイムを減らしていたのだ。最適化設定は、世代間のオブジェクト分布のスイートスポット、または少なくともその近似値を発見した。

 

g1-parameter-table-600x394
Java 8のGC関連のパラメータの数は圧倒的に多い。

この表は、最適化されたパラメータ値と、SPECjbbベンチマークの初期値とを比較したものだ。この結果の完全な詳細については、ヨハネス・ケプラー大学のフィリップ・レンガウアー氏とハンス・ペーター・メッセンベック氏によるThe Taming of the Shrew: Increasing Performance by Automatic Parameter Tuning for Java Garbage Collectorsを参照して頂きたい。

その有用性は?

顧客アプリケーションのGCパラメータを最適化することもできるのだろうか?そう、可能だ!必要なのは、Dynatrace社が提供する最適化ツールと、使用可能なパラメータと値が書かれた小さい設定ファイルをダウンロードするだけだ。こうした設定ファイルは、すでにHotSpot VMのほとんどのガベージコレクタに用意されている。最適化ツールやユーザーガイドも無料でダウンロードすることができる。

Dynatrace社は研究革新にかなり力を入れている。モニタリングと大規模ソフトウェアシステムの進化に力を注ぐ、ヨハネス・ケプラー大学のクリスティアン・ドップラー研究室と協力し、Dynatrace社はJavaアプリケーションのメモリ挙動(オブジェクト割り当てやGCの動きなど)をVMでモニターできるツールと技術を開発した。このようにして、私たちはJavaアプリケーションにおけるパフォーマンスのボトルネックやメモリーリークを発見するためのサポートを受けているのだ。

Javaのガベージコレクタ最適化についてのより詳しい情報は、次回のブログ投稿で説明するつもりだ。

原文:http://apmblog.dynatrace.com/2015/12/09/boost-java-performance-automatically/(2016-6-1)
※元記事の筆者には直接翻訳の許可を頂いて、翻訳・公開しております。

 -Tech, ,

FAworksではプロのコンサルタントが案件をお探しします

  関連記事

コスパ最強ラップトップ

エンジニア的コスパ最強laptop3選

どうもどうも。 「3度の飯より価格コム」で同じみの私です。 PC買う時ってすごい迷うよね。 CPUの

Linux OSのジッタを体系的に削減する黒魔術

Linux OSのジッタを体系的に削減する黒魔術

低遅延性の求められるトレードシステムにおいて、ジッタの原因をどのように体系的に発見してひとつずつ削除

エンジニアの作業効率を一気に上げてくれる、無料Google Chrome拡張機能おすすめ20選

ちょっとした時短の積み重ねが作業時間を減らしてくれる 情報収集やブラウザチェック、ルーティーンワーク

Lispをあなたの言語にも取り入れる方法

僕はプログラミング言語Lispのファンだ。だが、多くの不慣れなプログラマにとって、その素晴らしいまで

待ち遠しい次の祝日がコマンドラインでわかる!‐cal‐ 端末にカレンダーを表示しよう

待ち遠しい次の祝日がコマンドラインでわかる!‐cal‐ 端末にカレンダーを表示しよう

これは“コマンドライン・マンデー”シリーズの最初の投稿です。このシリーズでは、毎週月曜日に使えるコマ

NGINXのスレッドプールがパフォーマンスを9倍にする!

NGINXのパフォーマンスをスレッドプールで9倍にする

はじめに NGINXが接続処理に非同期かつイベント駆動のアプローチを用いていることは、よく知られてい

node.js における stream の歴史とそれぞれの問題点

node.js における stream の歴史とそれぞれの問題点

内容 前史(stream API以前のstream) stream1 stream全盛期、ユーザラン

Dockerコンテナのためのテスト戦略

Dockerコンテナのためのテスト戦略

おめでとう!あなたはDockerイメージの作り方を知っていて、わかりやすいアプリケーションで複数のコ

広告あるある 〜第一弾〜

by Klearchos Kapoutsis こんにちは、今回はネット広告について、あるあるを書きま

エンジニアなら絶対ワクワクしちゃうコンピュータ映画7選

こんにちは!皆さん、映画観てますか?今回は人よりちょっぴり多く映画を観ていると勝手に自負している僕が