目次

微妙に意訳なり、全く書いてないことを書いたり
してるので、適時原文を参照のこと。。。

1. Introduction

Java2 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 1] 並列効率のplot

[FIG 2] 並列効率/max値(=CPU数分)のplot

な〜んか、Y軸が全然違う(と思う)のですが、FIG 2の見た目は 被疑対象の図と似てますね。ホントのところ、どうなんでしょうね? ;-)

  • 凍結時の書き込みがどうなるかチェック -- 2006-10-23 (Mon) 17:30:48
  • fm。コメントはokね。 -- 2006-10-23 (Mon) 17:31:04

Last-modified: 2006-10-23 17:31:04