目次
微妙に意訳なり、全く書いてないことを書いたり してるので、適時原文を参照のこと。。。
1. IntroductionJava2 Platform Standard Edition(J2SE platform)は、デスクトップ上の小さなアプレットから、大規模サーバ上のWebサービスまで、広くさまざまなアプリケーションで利用されている。J2SE plaftorm バージョン1.4.2においては、4種類のgarbage collectorが存在したが、ユーザの明示的な指定が無い場合、シリアルgarbage collectorが常に選択されていた。バージョン5.0に於いては、アプリケーションが実行されるマシンクラスに基づいて、collectorが選択される。このgarbage collectorの「smarter choice」は大体の場合はよいが、常に最もよい選択になる訳ではない。garbage collectorを自分で選択したいユーザのために、本文書は選択の根拠になる情報を記載する。本文書はまず最初に記すのは、garbage collectorの一般的な特徴と、これらの最もよい利点を利用するためのチューニングオプションである。資料中にある例は、シリアルの全停止するcollectorを利用している。その他のcollectorの特徴的な例は、他のcollectorを選択する際に考慮すべき要因に併せて議論する。 garbage collectorの選択がユーザの問題になるのはいつか?多くのアプリケーションの場合は問題にならない。つまり、多くのアプリケーションはその仕様通りに動くことができていて、この際garbage collectorは小さい頻度で動作している。(シリアルcollectorを使っていて)、garbage collectorの動作が問題なる場合の例は、多くのスレッド、プロセッサ、ソケットやメモリを使った場合、スケールするような巨大なアプリケーションの場合であろう。 Amdahlは多くの処理は完全に並列化することはできず、逐次処理せざるを得ない場所は常に存在して、この部分は並列化の恩恵を受けないと提唱した。(Amdahl's law 1967)。これはJ2SEでも同様である。特にバージョン1.3.1までのJavaプラットフォームのVMは並列化されたGC処理を持たなかったので、マルチプロセッサシステム上でのGCの影響は、並列化されたアプリケーションに比べて大きいものであった。 下のグラフはgarbage collectionの影響を除いた、完全にスケールする理想的なシステムをモデル化したものである。赤線は1CPUのシステム上で、garbage collectionの時間がアプリケーションの稼働時間の1%となる場合の線である。これが32CPUのシステムでは、20%以上のスループットのロスになっている。garbage collectionの時間が10%を占める(1CPUのシステムにおけるgarbage collectionの時間の乱暴な合算では無い)場合、32CPUのシステムでは75%以上のスループットのロスになっている。 この下に続くグラフに関しては、後述
Appendix グラフのなぞthroughputが所謂単位時間当たりの処理能力だとして、 グラフの数値の算出方法がよくわからないので、何を言いたいのか、 このintroのなんの論拠になっているのかよくわかりません。。。orz ということで、アムダールの法則を。並列効果(α)= 1 / (( 1 - p) + p / Np) p : 並列化率(0〜1.0) Np : プロセッサ数アムダールの法則に関する詳細に関してはWikipediaのここでも 参照してください。
さてさて、久しぶりに考え直したときにミスって、この式を 並列効果(α)= 1 / (( 1 - p) + p * Np) p : 並列化率(0〜1.0) Np : プロセッサ数でplotしてみました。下記の通り、 set xrange [0:32] set yrange [0:1] set xtics 0,5,32 set ytics 0,0.2,1 set xlabel "Processors" set ylabel "Throughput" plot 1/((1-0.01)+(0.01*x)) title "1% GC", \ 1/((1-0.02)+(0.02*x)) title "2% GC", \ 1/((1-0.03)+(0.03*x)) title "3% GC", \ 1/((1-0.1)+(0.1*x)) title "10% GC", \ 1/((1-0.2)+(0.2*x)) title "20% GC", \ 1/((1-0.3)+(0.3*x)) title "30% GC"gnuplotで叩いてみると・・・ はてさて、真偽のほどは如何な辺りにあるんでしょう? ;-)
とりあえずちゃんと計算し直してみましょう。 p=0.99(GC1%) p=0.98(GC2%) p=0.97(GC3%) Np α α/Np(%) Np α α/Np(%) Np α α/Np(%) ---------------------------------------------------------- 1 1.00 100.00 1 1.00 100.00 1 1.00 100.00 2 1.98 99.01 2 1.96 98.04 2 1.94 97.09 3 2.94 98.04 3 2.88 96.15 3 2.83 94.34 4 3.88 97.09 4 3.77 94.34 4 3.67 91.74 5 4.81 96.15 5 4.63 92.59 5 4.46 89.29 6 5.71 95.24 6 5.45 90.91 6 5.22 86.96 7 6.60 94.34 7 6.25 89.29 7 5.93 84.75 8 7.48 93.46 8 7.02 87.72 8 6.61 82.64 9 8.33 92.59 9 7.76 86.21 9 7.26 80.65 10 9.17 91.74 10 8.47 84.75 10 7.87 78.74 11 10.00 90.91 11 9.17 83.33 11 8.46 76.92 12 10.81 90.09 12 9.84 81.97 12 9.02 75.19 13 11.61 89.29 13 10.48 80.65 13 9.56 73.53 14 12.39 88.50 14 11.11 79.37 14 10.07 71.94 15 13.16 87.72 15 11.72 78.13 15 10.56 70.42 16 13.91 86.96 16 12.31 76.92 16 11.03 68.97 17 14.66 86.21 17 12.88 75.76 17 11.49 67.57 18 15.38 85.47 18 13.43 74.63 18 11.92 66.23 19 16.10 84.75 19 13.97 73.53 19 12.34 64.94 20 16.81 84.03 20 14.49 72.46 20 12.74 63.69 21 17.50 83.33 21 15.00 71.43 21 13.13 62.50 22 18.18 82.64 22 15.49 70.42 22 13.50 61.35 23 18.85 81.97 23 15.97 69.44 23 13.86 60.24 24 19.51 81.30 24 16.44 68.49 24 14.20 59.17 25 20.16 80.65 25 16.89 67.57 25 14.53 58.14 26 20.80 80.00 26 17.33 66.67 26 14.86 57.14 27 21.43 79.37 27 17.76 65.79 27 15.17 56.18 28 22.05 78.74 28 18.18 64.94 28 15.47 55.25 29 22.66 78.13 29 18.59 64.10 29 15.76 54.35 30 23.26 77.52 30 18.99 63.29 30 16.04 53.48 31 23.85 76.92 31 19.38 62.50 31 16.32 52.63 32 24.43 76.34 32 19.75 61.73 32 16.58 51.81 p=0.9(GC10%) p=0.8(GC20%) p=0.7(GC30%) Np α α/Np(%) Np α α/Np(%) Np α α/Np(%) ---------------------------------------------------------- 1 1.00 100.00 1 1.00 100.00 1 1.00 100.00 2 1.82 90.91 2 1.67 83.33 2 1.54 76.92 3 2.50 83.33 3 2.14 71.43 3 1.87 62.50 4 3.08 76.92 4 2.50 62.50 4 2.11 52.63 5 3.57 71.43 5 2.78 55.56 5 2.27 45.45 6 4.00 66.67 6 3.00 50.00 6 2.40 40.00 7 4.37 62.50 7 3.18 45.45 7 2.50 35.71 8 4.71 58.82 8 3.33 41.67 8 2.58 32.26 9 5.00 55.56 9 3.46 38.46 9 2.65 29.41 10 5.26 52.63 10 3.57 35.71 10 2.70 27.03 11 5.50 50.00 11 3.67 33.33 11 2.75 25.00 12 5.71 47.62 12 3.75 31.25 12 2.79 23.26 13 5.91 45.45 13 3.82 29.41 13 2.83 21.74 14 6.09 43.48 14 3.89 27.78 14 2.86 20.41 15 6.25 41.67 15 3.95 26.32 15 2.88 19.23 16 6.40 40.00 16 4.00 25.00 16 2.91 18.18 17 6.54 38.46 17 4.05 23.81 17 2.93 17.24 18 6.67 37.04 18 4.09 22.73 18 2.95 16.39 19 6.79 35.71 19 4.13 21.74 19 2.97 15.62 20 6.90 34.48 20 4.17 20.83 20 2.99 14.93 21 7.00 33.33 21 4.20 20.00 21 3.00 14.29 22 7.10 32.26 22 4.23 19.23 22 3.01 13.70 23 7.19 31.25 23 4.26 18.52 23 3.03 13.16 24 7.27 30.30 24 4.29 17.86 24 3.04 12.66 25 7.35 29.41 25 4.31 17.24 25 3.05 12.20 26 7.43 28.57 26 4.33 16.67 26 3.06 11.76 27 7.50 27.78 27 4.35 16.13 27 3.07 11.36 28 7.57 27.03 28 4.38 15.63 28 3.08 10.99 29 7.63 26.32 29 4.39 15.15 29 3.09 10.64 30 7.69 25.64 30 4.41 14.71 30 3.09 10.31 31 7.75 25.00 31 4.43 14.29 31 3.10 10.00 32 7.80 24.39 32 4.44 13.89 32 3.11 9.71と言うことで、計算してみると、GC 30%の場合は32CPUの場合で 並列効果が3.11、期待値(32倍)の9.71%と75%以上のロスどころか、 90%以上のロスとなっています。 理論値でこの結果なので、費用対効果を考えるにGCのtuningは とても重要で、GCの時間(=Stop The World)がJavaベースのアプリの性能に 多大なimpactを与える・・気がしてきますね。w 数値だけ出すのもなんなので、plotもしてみました。
[FIG 2] 並列効率/max値(=CPU数分)のplot な〜んか、Y軸が全然違う(と思う)のですが、FIG 2の見た目は 被疑対象の図と似てますね。ホントのところ、どうなんでしょうね? ;-)
|