Changes between Version 6 and Version 7 of css/memorytunig


Ignore:
Timestamp:
07/04/14 20:13:52 (11 years ago)
Author:
Takashi Nogami
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • css/memorytunig

    v6 v7  
    11= CSSのDataBrowserのパフォーマンスチューニング =
    22
    3 CSSのDataBrowserで長期間のグラフあるいは多数のグラフを描かせようとしたときに
    4 グラフを描き終わるまで非常に長時間掛かったりエラーになったりしてしまうことが良く起こる。
    5 
    6 これはグラフを描くためのデータを格納するメモリが不足することが原因で起こるが、
    7 メモリに関するパラメータをチューニングすることでどのようにパフォーマンスが改善されるか
    8 ベンチマークテストにより確認する。
     3CSSのDataBrowserで長期間のグラフあるいは多数のグラフを描かせようとしたときにグラフを描き終わるまで非常に長時間掛かったりエラーになったりしてしまうことが良く起こる。
     4
     5これはグラフを描くためのデータを格納するメモリが不足することが原因で起こるが、メモリに関するパラメータをチューニングすることでどのようにパフォーマンスが改善されるかベンチマークテストにより確認する。
    96
    107== はじめに ==
    118
    12 CSSではJavaが使用されている。
    13 Javaで使用するメモリにはヒープ(Javaヒープ)と非ヒープがあり、
    14 CSSのDataBrowserでグラフを描くためのデータはヒープに格納される。
    15 
    16  参考[[BR]]
    17  * [http://d.hatena.ne.jp/ogin_s57/20120623/1340463194 JVMとGCのしくみ - ITエンジニアとして生きる][[BR]]
    18  * [http://www.atmarkit.co.jp/ait/articles/0504/02/news005.html Javaパフォーマンスチューニング(3):Javaのヒープ・メモリ管理の仕組み (1/2) - @IT][[BR]]
    19  * [http://www.atmarkit.co.jp/ait/articles/0508/31/news091_2.html Javaパフォーマンスチューニング(6):HotSpot VMの特性を知る (2/2) - @IT][[BR]]
     9CSSではJavaが使用されている。Javaで使用するメモリにはヒープ(Javaヒープ)と非ヒープがあり、CSSのDataBrowserでグラフを描くためのデータはヒープに格納される。
     10
     11 参考
     12 * [http://d.hatena.ne.jp/ogin_s57/20120623/1340463194 JVMとGCのしくみ - ITエンジニアとして生きる]
     13 * [http://www.atmarkit.co.jp/ait/articles/0504/02/news005.html Javaパフォーマンスチューニング(3):Javaのヒープ・メモリ管理の仕組み (1/2) - @IT]
     14 * [http://www.atmarkit.co.jp/ait/articles/0508/31/news091_2.html Javaパフォーマンスチューニング(6):HotSpot VMの特性を知る (2/2) - @IT]
    2015
    2116CSSの設定ファイルcss.ini内の'''{{{-vmargs}}}'''行以降でJavaで使用するメモリに関するパラメータが設定されている。
     
    2621}}}
    2722
    28 このうち非ヒープであるPermanent領域の最大サイズを指定しているパラメータ'''{{{-XX:MaxPermSize=128M}}}'''
    29 については今回は変更しない。
     23このうち非ヒープであるPermanent領域の最大サイズを指定しているパラメータ'''{{{-XX:MaxPermSize=128M}}}'''については今回は変更しない。
    3024
    3125ベンチマークの条件
     
    4741Xmxパラメータはヒープの最大サイズを指定するパラメータである。
    4842
    49 あくまでも最大サイズを指定するものであり、実際のヒープサイズはデータ量により変わり、
    50 データ量に応じて最大サイズまで自動的に拡張される。[[BR]]
     43あくまでも最大サイズを指定するものであり、実際のヒープサイズはデータ量により変わり、データ量に応じて最大サイズまで自動的に拡張される。[[BR]]
    5144初期設定ではヒープの最大サイズが1GB(1024MB)に指定されている。
    5245
    5346まずXmxパラメータでヒープの最大サイズを初期設定の1GB、4GB、6GB、8GBと増やした。(図1)
    5447
    55 ヒープサイズを増やせば処理可能な日数が増え、処理時間もデータ量(日数)に比例する。(Xmx近似の点線)[[BR]]
     48ヒープサイズを増やせば処理可能な日数が増え、処理時間も日数(データ量)に比例する。(Xmx近似の点線)[[BR]]
    5649ヒープサイズはデータの読み込みが進むにつれ次第に最大サイズ近くまで拡張されていった。
    5750
     
    5952
    6053Xmsはヒープの初期サイズ指定で、Xmxと同じ値を指定すればヒープサイズは固定される。[[BR]]
    61 ただしヒープサイズを大きなサイズに固定したからといって、
    62 実際にデータ量が増えなければOSがメモリを割り当てることはないのでPCのメモリを無駄に占有するわけではない。
     54ただしヒープサイズを大きなサイズに固定したからといって、実際に使用するヒープ(データ量)が増えなければOSがメモリを割り当てることはないのでPCのメモリを無駄に占有するわけではない。
    6355
    6456ヒープサイズを固定した場合にXmx近似より処理時間が短く完了する比例関係部分がある。(Xms近似の点線)[[BR]]
    65 データ量がヒープのOld領域の不足が起こらないで済む場合はXms近似で処理が完了するが、
    66 !Old領域が不足してFull GCが起こり始めるとXmx近似になっていく。
     57データ量がヒープのOld領域の不足が起こらないで済む場合はXms近似で処理が完了するが、!Old領域が不足してFull GCが起こり始めるとXmx近似になっていく。
    6758
    6859ヒープサイズを固定しない場合はヒープの拡張とともにFull GCが行われていると思われる。
     
    7162[[Image(memorytuning_fig2.png, 40%)]]
    7263
    73 処理時間については、ヒープサイズを固定した場合のほうが処理時間が短縮されることが多く、
    74 Xms近似で処理が完了する場合はXmx近似に比較して約1.38倍の高速化となる。(図3、4、5)[[BR]]
     64処理時間については、ヒープサイズを固定した場合のほうが処理時間が短縮されることが多く、Xms近似で処理が完了する場合はXmx近似に比較して約1.38倍の高速化となる。(図3、4、5)[[BR]]
    75658GBの20日分の処理時間を比較すると215秒から156秒へと59秒短縮されている。
    7666
    77 処理可能な日数については、ヒープサイズを固定した場合に改善したというよりも、
    78 ヒープサイズが可変の場合、ヒープを拡張する際にメモリの断片化が起き、
    79 GCを行っても断片化が完全には解消できずにメモリの利用効率が悪化しているのではないだろうか。
     67処理可能な日数については、ヒープサイズを固定した場合に改善したというよりも、ヒープサイズが可変の場合、ヒープを拡張する際にメモリの断片化が起き、GCを行っても断片化が完全には解消できずにメモリの利用効率が悪化しているのではないだろうか。
    8068
    8169[[Image(memorytuning_fig3.png, 40%)]]
     
    8573== ヒープのOld領域を大きくする ==
    8674
    87 ヒープのOld領域が不足してFull GCが起こると処理時間が掛かるようになることが分かったので、
    88 Old領域を大きくするためにNewRatioパラメータを変更してみる。
     75ヒープのOld領域が不足してFull GCが起こると処理時間が掛かるようになることが分かったので、Old領域を大きくするためにNewRatioパラメータを変更してみる。
    8976
    9077NewRatioパラメータはヒープのNew領域の大きさに対するOld領域の大きさの比率を指定する。[[BR]]
     
    9279(似たパラメータとしてNew領域の大きさを指定する、!NewSize、MaxNewSizeというパラメータもある。)
    9380
    94  Java !HotSpot VMにはクライアントVMとサーバVMのチューニングの異なる2種類のVMがあり、
    95  NewRatioパラメータの初期値はクライアントVMが8、サーバVMが2となっている。
    96 
    97  PCの構成によってどちらのVMを使用するか決定される。自分のPCでどちらのVMが使用されるかは
    98  '''{{{java -version}}}'''コマンドの出力で確認できる。[[BR]]
    99  オプション指定によりどちらのVMを使用するか指定することも可能。
     81 Java !HotSpot VMにはクライアントVMとサーバVMのチューニングの異なる2種類のVMがあり、NewRatioパラメータの初期値はクライアントVMが8、サーバVMが2となっている。
     82
     83 PCの構成によってどちらのVMを使用するか決定される。オプション指定によりどちらのVMを使用するか指定することも可能。[[BR]]
    10084 Windowsの32bit Javaでオプション指定なしの場合クライアントVMが使用される。[[BR]]
    101  64bit JavaにはクライアントVMが用意されていないため常にサーバVMが使用される。
    102 
    103  参考[[BR]]
    104  * [http://docs.oracle.com/javase/jp/6/technotes/guides/vm/index.html Java 仮想マシンテクノロジ][[BR]]
    105  * [http://docs.oracle.com/javase/jp/7/technotes/guides/vm/index.html Java SE 7 仮想マシン (VM) 関連 API & 開発者ガイド][[BR]]
    106  * [http://docs.oracle.com/javase/jp/7/technotes/guides/vm/server-class.html Server-Class マシンの検出][[BR]]
     85 64bit JavaにはクライアントVMが用意されていないため常にサーバVMが使用される。[[BR]]
     86 自分のPCでどちらのVMが使用されるかは '''{{{java -version}}}'''コマンドの出力で確認できる。
     87
     88 参考
     89 * [http://docs.oracle.com/javase/jp/6/technotes/guides/vm/index.html Java 仮想マシンテクノロジ]
     90 * [http://docs.oracle.com/javase/jp/7/technotes/guides/vm/index.html Java SE 7 仮想マシン (VM) 関連 API & 開発者ガイド]
     91 * [http://docs.oracle.com/javase/jp/7/technotes/guides/vm/server-class.html Server-Class マシンの検出]
    10792 * [http://d.hatena.ne.jp/ogin_s57/20120709/1341836704 JVMのチューニング - ITエンジニアとして生きる]
    10893
     
    11095!NewRatio指定なしとNewRatio=2の結果は同じであることが確認できた。(64bit Javaを使用)
    11196
    112 NewRatioを増やすにつれてXms近似の範囲で処理完了する日数が増えていくが、
    113 次第に改善幅が小さくなっていき、16と20では同じ結果になった。
    114 
    115 これは、NewRatioが16の場合はOld領域の大きさがヒープの94.1%(16/17)、20の場合は95.2%(20/21)と、
    116 Old領域の大きさが1%(45MB)しか変わらないからだろう。
     97NewRatioを増やすにつれてXms近似の範囲で処理完了する日数が増えていくが、次第に改善幅が小さくなっていき、16と20では同じ結果になった。
     98
     99これは、NewRatioが16の場合はOld領域の大きさがヒープの94.1%(16/17)、20の場合は95.2%(20/21)と、Old領域の大きさが1.1%(45MB)しか変わらないからだろう。
    117100
    118101[[Image(memorytuning_fig6.png, 40%)]]
     
    121104NewRatioが16と20の場合の1%の違いは、6GBでは69MB、8GBでは91MBにすぎないが多少の改善が見られた。
    122105
    123 4GBの場合でも1日分のデータ量の違いでは結果に差がなかったが、半日や1/4日分のデータ量の違いだとしたら
    124 多少なりとも結果に差がでたことだろう。
     1064GBの場合でも1日分のデータ量の違いでは結果に差がなかったが、半日や1/4日分のデータ量の違いだとしたら多少なりとも結果に差がでたことだろう。
     107
     108 今回のベンチマークテストでは確認していないが、ヒープサイズが6GBや8GB(あるいは16GBなどもっと大きなヒープサイズ)の場合、NewRatioの指定を大きくすればもう少し改善するだろう。[[BR]]
     109 たとえばヒープサイズ8GBでNewRatioが16と20では1.1%の違いで91MBだが、16と32では2.8%の違いで233MBになる。さらに16GBでNewRatioが16と32では2.8%の違いは467MBになる。
     110
     111 ただしヒープサイズが小さい場合にNewRatioの指定を大きくすると、反対にNew領域が小さくなりすぎる可能性があるため注意が必要だ。[[BR]]
     112 たとえば32bit OSでメモリチューニングを行わない場合、ヒープサイズ1GB(CSSの初期値)でNewRatio=8(32bit Java、クライアントVMの初期値)となり、New領域の大きさが113MBであるので、目安としてNew領域の大きさが128MBより小さくならないようにするのが良いだろう。
    125113
    126114[[Image(memorytuning_fig7.png, 40%)]]
    127115[[Image(memorytuning_fig8.png, 40%)]]
    128116
    129 以上の結果から同じヒープサイズで、最大ヒープサイズを指定しただけの場合(Xmx)と、
    130 ヒープサイズを固定かつOld領域を大きくした場合(Xms NR16)とを比較すると、
    131 処理時間と日数(データ量)がかなり改善され、
    132 Xmx8GとXms8G NR16の場合では同等の処理時間で10日分多いデータが表示できるようになった。(図9、10、11)
    133 
    134 さらに、少しズルい比較になるが、Xmx4GとXms8G NR16を比較すると
    135 22日分多いデータが表示できるようになり、2.5倍に改善された。(図12)
     117以上の結果から同じヒープサイズで、最大ヒープサイズを指定しただけの場合(Xmx)と、ヒープサイズを固定かつOld領域を大きくした場合(Xms NR16)とを比較すると、処理時間と日数(データ量)がかなり改善され、Xmx8GとXms8G NR16の場合では同等の処理時間で10日分多いデータが表示できるようになった。(図9、10、11)
     118
     119さらに、少しズルい比較になるが、Xmx4GとXms8G NR16を比較すると22日分多いデータが表示できるようになり、2.5倍に改善された。(図12)
    136120
    137121処理時間についてはデータ量が多いためそれなりに掛かるがXms近似から外れてはいない。
     
    142126[[Image(memorytuning_fig12.png, 40%)]]
    143127
    144 
    145 == まとめ ==
    146 
    147 CSSのDataBrowserで長期間のグラフあるいは多数のグラフを描かせるためには
    148 CSSに多くのヒープ(メモリ)を割り当てる必要がある。
    149 
    150 データ量が増えるため必要なヒープも多くなるのは当然である。
    151 
    152 しかし単にヒープの最大サイズを多くするだけでは不十分で、
    153 ヒープサイズを固定しOld領域の割合を大きくし、
    154 Full GCをなるべく起こさないようにチューニングすることで
    155 パフォーマンス(グラフの日数や数、処理時間)はかなり改善される。
    156 
    157 また、PCの利用可能メモリの制限からCSSに割り当てられるヒープサイズが制限される場合でも、
    158 Old領域の割合を大きくすることで同じヒープサイズであってもパフォーマンスを改善することができる。
    159 
    160128== 追加情報 ==
    161129
    162 今回このベンチマークテストを行っているときに、処理時間のうちそのほとんどが
    163 ネットワーク経由でのデータ転送に掛かっていることが分かった。[[BR]]
    164 ベンチマークで使用したPCは100MbpsのHUBに繋がっていたが、
    165 データ転送中は100Mbpsのうち98%近い帯域を使用しており、
    166 ネットワークの速度がボトルネックになっていることが明らかだった。
    167 
    168 そこでHUBを1Gbps(GbE)のものに交換してXms8G NR16時のベンチマークを行ってみたところ、
    169 処理時間はほぼ半分になった。(図13)
     130今回このベンチマークテストを行っているときに、処理時間のうちそのほとんどがネットワーク経由でのデータ転送に掛かっていることが分かった。[[BR]]
     131ベンチマークで使用したPCは100MbpsのHUBに繋がっていたが、データ転送中は100Mbpsのうち98%近い帯域を使用しており、ネットワークの速度がボトルネックになっていることが明らかだった。
     132
     133そこでHUBを1Gbps(GbE)のものに交換してXms8G NR16時のベンチマークを行ってみたところ、処理時間はほぼ半分になった。(図13)
    170134
    171135[[Image(GbE_fig13.png, 40%)]]
     
    176140 * データ転送が終了してグラフ描画が終了するまでの時間。
    177141
    178 38日分ではFull GCが発生しているためグラフ描画時間が掛かっているが、
    179 それを除けば3つとも日数に比例した時間が掛かっている。(図14)
     14238日分ではFull GCが発生しているためグラフ描画時間が掛かっているが、それを除けば3つとも日数(データ量)に比例した時間が掛かっている。(図14)
    180143
    181144[[Image(GbE_fig14.png, 40%)]]
    182145
    183 Full GCが発生していない36日分の処理時間の内訳を100Mbpsと1Gbpsを比較すると、クエリ処理とグラフ描画の時間に差はなく、
    184 データ転送にかかる時間が233秒から85秒へと148秒短縮され、約2.74倍高速化となった。(図15-1、15-2 横軸は処理時間[秒])
     146Full GCが発生していない36日分の処理時間の内訳を100Mbpsと1Gbpsを比較すると、クエリ処理とグラフ描画の時間に差はなく、データ転送にかかる時間が233秒から85秒へと148秒短縮され、約2.74倍高速化となった。(図15-1、15-2 横軸は処理時間[秒])
    185147
    186148[[Image(GbE_fig15-1.png, 40%)]]
     
    189151この時ネットワーク帯域のうち25%~30%を使用していた。[[BR]]
    190152このボトルネックがPC、データベース、ネットワークのどこにあるのかまでは検証していない。
     153
     154== まとめ ==
     155
     156CSSのDataBrowserで長期間のグラフあるいは多数のグラフを描かせるためにはCSSに多くのヒープ(メモリ)を割り当てる必要がある。
     157
     158データ量が増えるため必要なヒープも多くなるのは当然である。
     159
     160しかし単にヒープの最大サイズを多くするだけでは不十分で、ヒープサイズを固定しOld領域の割合を大きくし、
     161Full GCをなるべく起こさないようにチューニングすることでパフォーマンス(グラフの日数や数、処理時間)はかなり改善される。
     162
     163また、PCの利用可能メモリの制限からCSSに割り当てられるヒープサイズが制限される場合でも、Old領域の割合を大きくすることで同じヒープサイズであってもパフォーマンスを改善することができる。
     164
     165== 設定の一例 ==
     166
     167CSSに多くのヒープ(メモリ)を割り当てる必要があることは分かったが、実際にどのくらいのヒープサイズにするのが良いのだろうか。
     168
     169PCの利用可能メモリ量や使い方によって変わるだろうが目安としてPCの利用可能メモリ量からOSが使用する分として1GB程度を除いた量を指定するのが良いだろう。
     170
     171 CSSに割り当てるヒープサイズを大きくしたからといって、実際に使用するヒープ(データ量)が増えなければOSがメモリを割り当てることはないのでPCのメモリを無駄に占有するわけではない。
     172
     173 それでも、使用しないのにそんなに大きなヒープを割り当てるのが気持ちが悪いのであれば、利用可能メモリの1/2~2/3程度に減らしても良いだろう。
     174
     175 ベンチマークテストで使用したPCは実装メモリ8GB、利用可能メモリ7.9GBであるが、CSSに割り当てるヒープサイズを8GBに指定して38日分のデータを読み込み、ヒープのほとんどを使用した際の空きメモリ量は300MB程になり、PCのレスポンス低下を感じた。
     176
     177Windowsの場合、バージョンの違い(Vista、7、8など)とエディションの違い(Home Premium、Professionalなど)によって物理メモリサイズの制限がある。
     178
     179参考
     180 * [http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778%28v=vs.85%29.aspx Memory Limits for Windows and Windows Server Releases (Windows)]
     181 * [http://www.atmarkit.co.jp/ait/articles/0903/06/news136.html Windows TIPS:Windows OSでサポートされている最大物理メモリ・サイズは? - @IT]
     182
     18332bit OSおよび32bit Javaの場合、OSとJavaそれぞれにメモリサイズの制限がある。
     184
     185参考
     186 * [http://docs.oracle.com/cd/E19528-01/820-1613/abeii/index.html Java ヒープのチューニング (Sun Java System Application Server Enterprise Edition 8.2 パフォーマンスチューニングガイド)]
     187 * [http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit Why can't I get a larger heap with the 32-bit JVM?]
     188
     189=== 設定の一例 ===
     190
     191 * 32bit Windowsの場合、利用可能メモリ量にかかわらずヒープサイズの制限があるので1GB。また、ヒープサイズ1GBでNewRaito=16だとNew領域が小さすぎる可能性があるのでNewRatio=8。
     192{{{
     193-Xmx1G
     194-Xms1G
     195-XX:NewRatio=8
     196-XX:MaxPermSize=128M
     197}}}
     198
     199 * 利用可能メモリ量が2.5GB程度の場合。
     200{{{
     201-Xmx1280M
     202-Xms1280M
     203-XX:NewRatio=10
     204-XX:MaxPermSize=128M
     205}}}
     206
     207 * 利用可能メモリ量が3GB程度の場合。
     208{{{
     209-Xmx2G
     210-Xms2G
     211-XX:NewRatio=14
     212-XX:MaxPermSize=128M
     213}}}
     214
     215 * 利用可能メモリ量が3.5GB程度の場合。
     216{{{
     217-Xmx2560M
     218-Xms2560M
     219-XX:NewRatio=16
     220-XX:MaxPermSize=128M
     221}}}
     222
     223 * 利用可能メモリ量が4GB程度の場合。
     224{{{
     225-Xmx3G
     226-Xms3G
     227-XX:NewRatio=20
     228-XX:MaxPermSize=128M
     229}}}
     230
     231 * 利用可能メモリ量が6GB程度の場合。
     232{{{
     233-Xmx5G
     234-Xms5G
     235-XX:NewRatio=28
     236-XX:MaxPermSize=128M
     237}}}
     238
     239 * 利用可能メモリ量が8GB程度の場合。
     240{{{
     241-Xmx7G
     242-Xms7G
     243-XX:NewRatio=32
     244-XX:MaxPermSize=128M
     245}}}
     246
     247 * 利用可能メモリ量が16GB程度の場合。
     248{{{
     249-Xmx15G
     250-Xms15G
     251-XX:NewRatio=32
     252-XX:MaxPermSize=128M
     253}}}
    191254
    192255== 測定データ ==