Changes between Version 6 and Version 7 of css/memorytunig
- Timestamp:
- 07/04/14 20:13:52 (10 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
css/memorytunig
v6 v7 1 1 = CSSのDataBrowserのパフォーマンスチューニング = 2 2 3 CSSのDataBrowserで長期間のグラフあるいは多数のグラフを描かせようとしたときに 4 グラフを描き終わるまで非常に長時間掛かったりエラーになったりしてしまうことが良く起こる。 5 6 これはグラフを描くためのデータを格納するメモリが不足することが原因で起こるが、 7 メモリに関するパラメータをチューニングすることでどのようにパフォーマンスが改善されるか 8 ベンチマークテストにより確認する。 3 CSSのDataBrowserで長期間のグラフあるいは多数のグラフを描かせようとしたときにグラフを描き終わるまで非常に長時間掛かったりエラーになったりしてしまうことが良く起こる。 4 5 これはグラフを描くためのデータを格納するメモリが不足することが原因で起こるが、メモリに関するパラメータをチューニングすることでどのようにパフォーマンスが改善されるかベンチマークテストにより確認する。 9 6 10 7 == はじめに == 11 8 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]] 9 CSSでは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] 20 15 21 16 CSSの設定ファイルcss.ini内の'''{{{-vmargs}}}'''行以降でJavaで使用するメモリに関するパラメータが設定されている。 … … 26 21 }}} 27 22 28 このうち非ヒープであるPermanent領域の最大サイズを指定しているパラメータ'''{{{-XX:MaxPermSize=128M}}}''' 29 については今回は変更しない。 23 このうち非ヒープであるPermanent領域の最大サイズを指定しているパラメータ'''{{{-XX:MaxPermSize=128M}}}'''については今回は変更しない。 30 24 31 25 ベンチマークの条件 … … 47 41 Xmxパラメータはヒープの最大サイズを指定するパラメータである。 48 42 49 あくまでも最大サイズを指定するものであり、実際のヒープサイズはデータ量により変わり、 50 データ量に応じて最大サイズまで自動的に拡張される。[[BR]] 43 あくまでも最大サイズを指定するものであり、実際のヒープサイズはデータ量により変わり、データ量に応じて最大サイズまで自動的に拡張される。[[BR]] 51 44 初期設定ではヒープの最大サイズが1GB(1024MB)に指定されている。 52 45 53 46 まずXmxパラメータでヒープの最大サイズを初期設定の1GB、4GB、6GB、8GBと増やした。(図1) 54 47 55 ヒープサイズを増やせば処理可能な日数が増え、処理時間も データ量(日数)に比例する。(Xmx近似の点線)[[BR]]48 ヒープサイズを増やせば処理可能な日数が増え、処理時間も日数(データ量)に比例する。(Xmx近似の点線)[[BR]] 56 49 ヒープサイズはデータの読み込みが進むにつれ次第に最大サイズ近くまで拡張されていった。 57 50 … … 59 52 60 53 Xmsはヒープの初期サイズ指定で、Xmxと同じ値を指定すればヒープサイズは固定される。[[BR]] 61 ただしヒープサイズを大きなサイズに固定したからといって、 62 実際にデータ量が増えなければOSがメモリを割り当てることはないのでPCのメモリを無駄に占有するわけではない。 54 ただしヒープサイズを大きなサイズに固定したからといって、実際に使用するヒープ(データ量)が増えなければOSがメモリを割り当てることはないのでPCのメモリを無駄に占有するわけではない。 63 55 64 56 ヒープサイズを固定した場合にXmx近似より処理時間が短く完了する比例関係部分がある。(Xms近似の点線)[[BR]] 65 データ量がヒープのOld領域の不足が起こらないで済む場合はXms近似で処理が完了するが、 66 !Old領域が不足してFull GCが起こり始めるとXmx近似になっていく。 57 データ量がヒープのOld領域の不足が起こらないで済む場合はXms近似で処理が完了するが、!Old領域が不足してFull GCが起こり始めるとXmx近似になっていく。 67 58 68 59 ヒープサイズを固定しない場合はヒープの拡張とともにFull GCが行われていると思われる。 … … 71 62 [[Image(memorytuning_fig2.png, 40%)]] 72 63 73 処理時間については、ヒープサイズを固定した場合のほうが処理時間が短縮されることが多く、 74 Xms近似で処理が完了する場合はXmx近似に比較して約1.38倍の高速化となる。(図3、4、5)[[BR]] 64 処理時間については、ヒープサイズを固定した場合のほうが処理時間が短縮されることが多く、Xms近似で処理が完了する場合はXmx近似に比較して約1.38倍の高速化となる。(図3、4、5)[[BR]] 75 65 8GBの20日分の処理時間を比較すると215秒から156秒へと59秒短縮されている。 76 66 77 処理可能な日数については、ヒープサイズを固定した場合に改善したというよりも、 78 ヒープサイズが可変の場合、ヒープを拡張する際にメモリの断片化が起き、 79 GCを行っても断片化が完全には解消できずにメモリの利用効率が悪化しているのではないだろうか。 67 処理可能な日数については、ヒープサイズを固定した場合に改善したというよりも、ヒープサイズが可変の場合、ヒープを拡張する際にメモリの断片化が起き、GCを行っても断片化が完全には解消できずにメモリの利用効率が悪化しているのではないだろうか。 80 68 81 69 [[Image(memorytuning_fig3.png, 40%)]] … … 85 73 == ヒープのOld領域を大きくする == 86 74 87 ヒープのOld領域が不足してFull GCが起こると処理時間が掛かるようになることが分かったので、 88 Old領域を大きくするためにNewRatioパラメータを変更してみる。 75 ヒープのOld領域が不足してFull GCが起こると処理時間が掛かるようになることが分かったので、Old領域を大きくするためにNewRatioパラメータを変更してみる。 89 76 90 77 NewRatioパラメータはヒープのNew領域の大きさに対するOld領域の大きさの比率を指定する。[[BR]] … … 92 79 (似たパラメータとしてNew領域の大きさを指定する、!NewSize、MaxNewSizeというパラメータもある。) 93 80 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]] 100 84 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 マシンの検出] 107 92 * [http://d.hatena.ne.jp/ogin_s57/20120709/1341836704 JVMのチューニング - ITエンジニアとして生きる] 108 93 … … 110 95 !NewRatio指定なしとNewRatio=2の結果は同じであることが確認できた。(64bit Javaを使用) 111 96 112 NewRatioを増やすにつれてXms近似の範囲で処理完了する日数が増えていくが、 113 次第に改善幅が小さくなっていき、16と20では同じ結果になった。 114 115 これは、NewRatioが16の場合はOld領域の大きさがヒープの94.1%(16/17)、20の場合は95.2%(20/21)と、 116 Old領域の大きさが1%(45MB)しか変わらないからだろう。 97 NewRatioを増やすにつれてXms近似の範囲で処理完了する日数が増えていくが、次第に改善幅が小さくなっていき、16と20では同じ結果になった。 98 99 これは、NewRatioが16の場合はOld領域の大きさがヒープの94.1%(16/17)、20の場合は95.2%(20/21)と、Old領域の大きさが1.1%(45MB)しか変わらないからだろう。 117 100 118 101 [[Image(memorytuning_fig6.png, 40%)]] … … 121 104 NewRatioが16と20の場合の1%の違いは、6GBでは69MB、8GBでは91MBにすぎないが多少の改善が見られた。 122 105 123 4GBの場合でも1日分のデータ量の違いでは結果に差がなかったが、半日や1/4日分のデータ量の違いだとしたら 124 多少なりとも結果に差がでたことだろう。 106 4GBの場合でも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より小さくならないようにするのが良いだろう。 125 113 126 114 [[Image(memorytuning_fig7.png, 40%)]] 127 115 [[Image(memorytuning_fig8.png, 40%)]] 128 116 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) 136 120 137 121 処理時間についてはデータ量が多いためそれなりに掛かるがXms近似から外れてはいない。 … … 142 126 [[Image(memorytuning_fig12.png, 40%)]] 143 127 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 160 128 == 追加情報 == 161 129 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) 170 134 171 135 [[Image(GbE_fig13.png, 40%)]] … … 176 140 * データ転送が終了してグラフ描画が終了するまでの時間。 177 141 178 38日分ではFull GCが発生しているためグラフ描画時間が掛かっているが、 179 それを除けば3つとも日数に比例した時間が掛かっている。(図14) 142 38日分ではFull GCが発生しているためグラフ描画時間が掛かっているが、それを除けば3つとも日数(データ量)に比例した時間が掛かっている。(図14) 180 143 181 144 [[Image(GbE_fig14.png, 40%)]] 182 145 183 Full GCが発生していない36日分の処理時間の内訳を100Mbpsと1Gbpsを比較すると、クエリ処理とグラフ描画の時間に差はなく、 184 データ転送にかかる時間が233秒から85秒へと148秒短縮され、約2.74倍高速化となった。(図15-1、15-2 横軸は処理時間[秒]) 146 Full GCが発生していない36日分の処理時間の内訳を100Mbpsと1Gbpsを比較すると、クエリ処理とグラフ描画の時間に差はなく、データ転送にかかる時間が233秒から85秒へと148秒短縮され、約2.74倍高速化となった。(図15-1、15-2 横軸は処理時間[秒]) 185 147 186 148 [[Image(GbE_fig15-1.png, 40%)]] … … 189 151 この時ネットワーク帯域のうち25%~30%を使用していた。[[BR]] 190 152 このボトルネックがPC、データベース、ネットワークのどこにあるのかまでは検証していない。 153 154 == まとめ == 155 156 CSSのDataBrowserで長期間のグラフあるいは多数のグラフを描かせるためにはCSSに多くのヒープ(メモリ)を割り当てる必要がある。 157 158 データ量が増えるため必要なヒープも多くなるのは当然である。 159 160 しかし単にヒープの最大サイズを多くするだけでは不十分で、ヒープサイズを固定しOld領域の割合を大きくし、 161 Full GCをなるべく起こさないようにチューニングすることでパフォーマンス(グラフの日数や数、処理時間)はかなり改善される。 162 163 また、PCの利用可能メモリの制限からCSSに割り当てられるヒープサイズが制限される場合でも、Old領域の割合を大きくすることで同じヒープサイズであってもパフォーマンスを改善することができる。 164 165 == 設定の一例 == 166 167 CSSに多くのヒープ(メモリ)を割り当てる必要があることは分かったが、実際にどのくらいのヒープサイズにするのが良いのだろうか。 168 169 PCの利用可能メモリ量や使い方によって変わるだろうが目安として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 177 Windowsの場合、バージョンの違い(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 183 32bit 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 }}} 191 254 192 255 == 測定データ ==