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ではプロのコンサルタントが案件をお探しします

  関連記事

空の上でも仕事ができちゃう!航空機ITサービス事情~ANA・JAL編~

by abdallahh 皆さん旅行は好きですか? 毎日仕事を頑張ったご褒美に南の島へ・・なんて思っ

CSSで縦書きに挑戦!writing-modeを使ってみた

「CSS Writing Modes Level 3」がW3Cの勧告に至ったことで、CSSの縦書きが

これから必ず伸びる!最低限抑えておきたい技術トレンド3つ(2015年度版)

※この記事は2015年度版です。最新の技術トレンド情報は下記の記事をご覧ください。 『「AIって何?

【カテゴリ別】海外エンジニアたちに人気の英語Techメディア・Techブログ50選(2016年版)

    日々目まぐるしい速さで変化していくIT業界。特にエンジニアという職種にお

GolangをJavaと比べてみた~Java愛好家がGoの機能を見たときの第一印象~

GolangをJavaと比べてみた~Java愛好家がGoの機能を見たときの第一印象~

最初に断っておきたいのだが、私はGoのエキスパートではない。2~3週間前にGoを勉強し始めたばかりな

Criteoにおける大規模機械学習の仕組み

Criteoの事業の核を担うのは、機械学習です。当社は、広告を表示させたいときの選択や、個別の製品レ

PHPエンジニアのキャリアパスと年収の遷移モデル

PHPはWeb開発言語の中でも、1995年から人気が衰えない言語です。主に動的なWebページ制作等に

トリバゴがどうやってマテリアル・デザインアプリの堅実な基盤を作っているか

トリバゴがどうやってマテリアル・デザインアプリの堅実な基盤を作っているか

トリバゴのデザイナーたちは、会社のブランディングについて共通の認識を持っていますが、急成長を遂げるト

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

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

Node vs. Go : Roadomatic の実装における比較

目次 概要 サーバ運用 ラウンド1: リクエスト処理 UDPソケット リクエストの検証 ラウンド2: