緒方一則氏による論文発表会

 

以下の要領で論文発表会が行われます。


日  時:平成28年2月3日(水)10:30〜12:00
会  場:大岡山西8号館 W棟 W1008室
司会教員:増原英彦 教授

論文発表者
氏  名:緒方 一則(おがた かずのり)

研究論文の概要

論文題目「インタープリタ−動的コンパイラ併用型仮想マシンのシステム性能改善技術」

プログラミング言語の実行時環境として、プログラムを仮想マシン(VM)のバイトコードに変換し、それをVM上で実行する手法が広く用いられている。この手法は、プログラム言語仕様と実行時環境の実装を分離することで、移植性を担保しつつ、マシン依存の最適化を適用可能であるなどの利点がある。

VMを用いる実行時環境の中でも、動的コンパイラとインタープリタを組み合わせるmixed-mode VMは、定常状態の実行速度改善とプログラム起動時間の短縮を両立する手法として広く用いられている。例えば、OpenJDKやIBM J9 Java VMはmixed-mode VMである。

本研究は、企業の業務システムで用いられる製品品質VMの性能改善手法を提案する。本番環境で求められる性能改善には、プログラム起動時間や負荷パターン変動への応答時間の短縮、複数プログラムの同時実行による総合性能の改善、問題発生時のプログラム停止時間の短縮など、定常状態の実行速度以外の性能指標も含まれる。動的コンパイラの改善による定常状態の実行速度改善は既に多くの研究が行われているが、本研究はそれらの性能指標を改善により、総合的なシステム性能改善を目的とする。

プログラム起動時間や負荷パターン変動への応答時間の短縮のためには、インタープリタの実行速度改善が重要である。動的コンパイラは同一コードを複数回実行後にコンパイルするので、プログラム起動時や負荷パターン変動時などで新たに実行されるコードはインタープリタで実行される。そのため、インタープリタの実行速度改善により起動時間や応答時間を改善できる。

本研究では、インタープリタがバイトコード命令列を読み込むためのメモリアクセスの冗長性に着目した。この冗長性は、バイトコード命令セットの特徴である可変長フォーマットと短い平均命令長のために、ワード境界に整列されていないメモリアクセスを同一メモリ・ワードに対して繰り返すことが原因である。

この課題を解決するために、バイトコード命令の読み込みをワード境界に整列されたメモリアクセスで行い、読み込んだバイトコード列をレジスタにキャッシュした。キャッシュしたワード内における、実行中のバイトコード命令のバイト位置判定を避けるために、命令のバイト位置ごとにカスタマイズしたバイトコード・ハンドラを用意して、インタープリタを最大約30%高速化した。

複数プログラムを用いた総合性能の改善のためには、1台のマシンでより多くのプログラムを実行してCPU使用率を常に高い状態に維持し、単位時間あたりの処理量を増やすことが重要である。そのためには、個々のプログラムのメモリ使用量を削減し、多数のプログラムを実行してもメモリ不足に陥らないようにする必要がある。

本研究では、JavaVMのメモリ使用状況を詳細に解析し、メモリ使用量削減のためにはJavaヒープ以外のメモリ領域も無視できないほど多いことを示した。さらに、JITコンパイラ作業領域のメモリ割当パターンがJava VM内の他のコンポーネントのパターンと大きく違うために、解放された作業領域の大半がシステム・ライブラリ内のフリーリストに滞留し、物理メモリを無駄に消費していることを発見した。この無駄なメモリ消費を削減する手法として、JITコンパイラ内部のメモリ管理コンポーネントにmadviseシステムコール呼び出しを追加することで、無駄な物理メモリ消費の約78%を削減した。

問題発生時のプログラム停止時間の短縮のためには、デバッグにかかる時間を短縮する必要がある。しかし、本番環境ではデバッガ内でプログラムを実行する手法は使えず、本番稼働中に記録した情報やダンプファイルのみでデバッグする必要があり、プログラム開発中のデバッグより困難である。また、本番稼働中に記録するデバッグ情報はできる限り少なくし、プログラム実行速度の低下を避ける必要がある。

本研究では、特にデバッグが困難なJITコンパイラの動作を本番環境以外で再現しデバッグを補助する機能を、少ないオーバーヘッドで実現する方法を提案する。JITコンパイラのデバッグが難しいのは、コード最適化に使用可能な実行時情報の内容が、JITコンパイラが起動されるタイミングによって変化するために、プログラムを再実行するだけでは問題を再現できないためである。問題を確実に再現するには、本番稼働中にJITコンパイラが使用した実行時情報を記録しておく必要があるが、実行時情報を全て記録すると実行速度が大きく低下する。

この課題を解決するために、JITコンパイラがコード最適化に利用する実行時情報を、プログラム実行中に値が変化する可能性のあるものと変化しないものに分類し、前者のみを実行中に記録し、後者はJava VMのプロセス・ダンプを用いて保存することで、プログラム実行中の記録オーバーヘッドを本番稼働中でも有効化できる程度まで削減した。

これらの技術により、製品品質VMにおける定常状態の実行速度以外の性能の改善することで、本番環境の総合的なシステム性能を改善した。