#author("2018-09-17T11:14:45+00:00","","")
* ExecutorServiceの最大プールサイズを考える(Java) [#lc69289b]
#setlinebreak(on);

#html(<style>.my_lines * { line-height:1.6}</style>)

#contents
-- 参考
--- https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/Executors.html
--- https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/ExecutorService.html

** 概要 [#sd11dbd6]
#html(<div style="padding-left:10px">)
#html(<div class="my_lines" style="padding-left:10px">)

newFixedThreadPool で固定数のスレッドプールを生成する。
「&color(red){N個のデータの塊を 何個のスレッドで処理するのが一番効率が良いのか};」を ''コア数との関係を考慮しながら'' 確認する。

今回、検証に使用したプログラムの概要は以下の通り。
- 言語はJava
- スレッド制御は java.util.concurrent.ExecutorService で行う。
- Executors.newFixedThreadPool 生成した固定数のスレッドで処理を行う。
- 各スレッドで行う処理は単純なMap生成のみ。
- コマンドライン引数の指定により、スレッドプール数などを動的に調整できるようにする。

#ref(image.png)

#html(</div>)

** 結論 [#le8eb3a0]
#html(<div style="padding-left:10px">)
先に結論を書いてしまうと、
newFixedThreadPool に設定する最大プール数はコア数以下に設定するのが望ましい。
※メインスレッドの事を考えると、コア数 - 1 ぐらいが良い。
** 結果 [#le8eb3a0]
#html(<div class="my_lines" style="padding-left:10px">)
先に結果を書いてしまう。

今回のような単純なMapインスタンスの生成を繰り返すようなプログラムの場合、
確保するスレッド数=コア数 - 1 の時がスループットが良く、ヒープ消費も一番効率が良い事が分かった。
ただ、スレッド内で行う処理がある程度のI/O待ちを伴うような処理の場合は、もう少し結果が変わってくると思われる。
今回のような単純なMapインスタンスの生成を繰り返すようなプログラムの場合は、
&color(red){''スレッド数=コア数 - 1'' の時が一番スループットが良く、ヒープ消費も効率が良い}; 事が分かった。
ただ、スレッド内で行う処理が、ある程度のI/O待ちを伴うような処理の場合は、もう少し結果が変わってくると思われる。

一番良くないのはコア数を大きく超えるプール数を確保した時で、スループットもヒープ効率も一番悪い結果となった。
&color(red){良くないのはスレッド数 ≧ コア数の時}; で、スループットもヒープ効率も''かなり悪い結果となった''。
※コア数以上のプールを確保した場合は、ヒープ消費がかなり増える模様。

恐らくコア数以上のプールを確保した場合、コンテキストスイッチが多数発生する事により
恐らく、コア数以上のプール(スレッド)数で処理した場合、コンテキストスイッチが多数発生する事になる為、
・スレッド辺りのスループットが落ちる
・スレッドで使用するメモリ開放のタイミングも遅れる
・スレッドで使用するメモリ開放のタイミングも遅れる(直近のGCで回収できない)
等の悪循環を生んでしまうので、パフォーマンス、メモリ効率共に悪くなったのではないかと思われる。
※今回は vmstat を取り忘れてしまったので推測でしかないが・・
※今回は vmstat を取り忘れてしまったので推測でしかないが、恐らくcsが多数発生している筈。

ただし、''ヒープの割り当て方によっては今回の結果も大きく変わる可能性がある事には注意したい''。
※ぶっちゃけ今回のヒープ割当はNew領域が全然足りていない。(フルGCが起きていないのにNew領域が足りずにOLDが消費されているケースがある)

#html(</div>)

** 結果(補足) [#le8eb3a0]
#html(<div class="my_lines" style="padding-left:10px">)
尚、Executors.newCachedThreadPool  及び Executors.newWorkStealingPool で同様の動作確認も行ってみたが、
newFixedThreadPool にコア数 - 1 のプール数を設定した時以上のパフォーマンスは得られなかった。
※キャッシュ系なので想定はしていたが、ヒープ効率がもの凄く悪い。
 (ただし、処理によっては有効なケースもあると思われる。)
※キャッシュ系なので想定はしていたが、ヒープ効率がもの凄く悪い。(ただし、処理によっては有効なケースもあると思われる)

またメインスレッドの起動時にスレッドプールを生成し、以降はそれを使い回す方式も確認してみたが、
都度、スレッドプールを確保する方式の方が、処理速度、ヒープ消費とも僅かに良い結果となった。

#html(</div>)

** プロジェクト作成 [#xcb428f1]
#html(<div style="padding-left:10px">)

確認用のプロジェクトは以下の通り作成した。

*** build.gradle [#r490ffba]
#html(<div style="padding-left:10px">)
#mycode2(){{
plugins {
    id 'java'
    id 'application'
}

// ヒープサイズは512M、New、OLD比率は1:1(256M:256M)、Edenとsurvivor比率は4:1(170M:42M)
applicationDefaultJvmArgs = ["-Xms512m", "-Xmx512m", "-XX:NewRatio=1", "-XX:SurvivorRatio=4"]

mainClassName = 'App'

dependencies {
    compile 'com.google.guava:guava:23.0'
    testCompile 'junit:junit:4.12'
}

repositories {
    jcenter()
}

run {
    // argsが指定された時はメインクラスに渡す
    if (project.hasProperty('args')) {
        args project.args.split('\\s+')
    }   
}
}}
#html(</div>)

*** src/main/java/App.java [#ib0cf2bc]
#html(<div style="padding-left:10px">)
#mycode2(){{

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import java.util.ArrayList;
import java.util.List;
import java.time.LocalDateTime;

public class App {

    ExecutorService executor = null;

    private static int     THREAD_GROUP_NUM     = 100;    // 繰り返し回数
    private static int     THREAD_NUM           = 10;     // 1グループ辺りで何個のスレッドを生成するか
    private static boolean POOL_SETUP_EACH_TIME = true;   // スレッドプールの生成を繰り返し毎に行う場合はtrue
    private static int     THREAD_POOL_MAX_NUM  = 5;      // 確保するスレッドプールの数

    public static void main(String[] args){
        for (String arg : args) {
            String[] argArray = arg.split("=");
            if (argArray.length < 2) {
                continue;
            }   
            if ("POOL_SETUP_EACH_TIME".equals(argArray[0])) {
                POOL_SETUP_EACH_TIME = "true".equals(argArray[1].toLowerCase());
            }   
            if ("THREAD_POOL_MAX_NUM".equals(argArray[0])) {
                THREAD_POOL_MAX_NUM = Integer.valueOf(argArray[1]);
            }   
            if ("THREAD_GROUP_NUM".equals(argArray[0])) {
                THREAD_GROUP_NUM = Integer.valueOf(argArray[1]);
            }   
            if ("THREAD_NUM".equals(argArray[0])) {
                THREAD_NUM = Integer.valueOf(argArray[1]);
            }   
        }   
        new App().main();
    }   

    public void main() {

        info("App.main", "START");
        long start = System.currentTimeMillis();

        info("App.main", "ENV POOL_SETUP_EACH_TIME : " + POOL_SETUP_EACH_TIME);
        info("App.main", "ENV THREAD_POOL_MAX_NUM  : " + THREAD_POOL_MAX_NUM);
        info("App.main", "ENV THREAD_GROUP_NUM     : " + THREAD_GROUP_NUM);
        info("App.main", "ENV THREAD_NUM           : " + THREAD_NUM);

        // スレッドプールのセットアップ
        if (!POOL_SETUP_EACH_TIME) {
            setupExecutor();
        }   

        // スレッドグループの実行
        executeThreadsGroup();

        // スレッドプールの後片付け
        if (!POOL_SETUP_EACH_TIME) {
            shutdownExecutor();
        }   

        long end = System.currentTimeMillis();
        info("App.main", "END", "("+(end-start)+"ms)");
    }   

    private void setupExecutor(){

        info("App.setupExecutor", "START");
        long start = System.currentTimeMillis();
        executor = Executors.newFixedThreadPool(THREAD_POOL_MAX_NUM);
        //executor = Executors.newCachedThreadPool();
        //executor = Executors.newWorkStealingPool();
        long end = System.currentTimeMillis();
        info("App.setupExecutor", "END", "("+(end-start)+"ms)");
    }

    private void executeThreadsGroup(){
        info("App.executeThreadsGroup", "START");
        long start = System.currentTimeMillis();
        for (int i = 0; i < THREAD_GROUP_NUM; i++) {
            executeThreads();
        }
        long end = System.currentTimeMillis();
        info("App.executeThreadsGroup", "END", "("+(end-start)+"ms)");
    }

    private void shutdownExecutor(){
        info("App.shutdownExecutor", "START");
        long start = System.currentTimeMillis();
        executor.shutdown();
        long end = System.currentTimeMillis();
        info("App.shutdownExecutor", "END", "("+(end-start)+"ms)");
    }

    public void executeThreads(){

        info("App.executeThreads", "START");
        long start = System.currentTimeMillis();

        if (POOL_SETUP_EACH_TIME) {
            setupExecutor();
        }

        // スレッドの起動
        List<Future<Boolean>> futureList = new ArrayList<Future<Boolean>>();
        for (int i = 0; i < THREAD_NUM; i++) {
            MyThread thread = new MyThread();
            thread.setParam("thread-"+i);
            futureList.add(executor.submit(thread));
        }

        // 各スレッドの結果確認
        for (Future<Boolean> future : futureList) {
            try {
                if (!future.get()){
                    System.err.println("thread error!");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        if (POOL_SETUP_EACH_TIME) {
            shutdownExecutor();
        }

        long end = System.currentTimeMillis();
        info("App.executeThreads", "END", "("+(end-start)+"ms)");
    }

    public static void info(String...messages){
        String delimiter = "";
        StringBuilder sb = new StringBuilder();
        for (String message : messages) {
            sb.append(delimiter);
            sb.append(message);
            delimiter = " ";
        }
        System.out.println(LocalDateTime.now() + " " + sb.toString());
    }
}
}}
#html(</div>)

*** src/main/java/MyThread.java [#me865180]
#html(<div style="padding-left:10px">)
#mycode2(){{
import java.util.Map;
import java.util.HashMap;
import java.util.concurrent.Callable;

public class MyThread implements Callable<Boolean> {

    Object param = null;

    public Boolean call(){

        String param = (String)getParam();

        App.info("MyThread.call", "START", param);

        // 適当にオブジェクト生成を繰り返す
        Map map = new HashMap();
        for (int i = 0; i < 1000; i++) {
            map.put("key-" + Math.random(), "val-" + Math.random());
            map.put("subMap", createSubMap());
        }

        App.info("MyThread.call", "END", param);

        return true;
    }

    public void setParam(Object param){
        this.param = param;
    }

    public Object getParam(){
        return this.param;
    }

    private Map createSubMap(){
        Map map = new HashMap();
        for (int i = 0; i < 100; i++) {
            map.put("key-" + Math.random(), "val-" + Math.random());
        }
        return map;
    }
}
}}
#html(</div>)

*** startup.sh [#c8c24e1d]
*** start.sh [#c8c24e1d]
#html(<div style="padding-left:10px">)
#mycode2(){{
#!/bin/bash

args=""
log_sufix=`date +%Y%m%d_%H%M%S`
if [ "$#" != "0" ]; then
    args="$*"
fi

echo gradle run -Pargs="$args"
gradle run -Pargs="$args">app_${log_sufix}.log 2>&1 &
./watch.sh | tee heap_${log_sufix}.log

cat app_${log_sufix}.log | grep "App.main ENV" | awk '{print $4" "$5" "$6}'
cat app_${log_sufix}.log | grep "App.executeThreadsGroup END" | awk '{print $4}' | sed -E "s/(\(|\))//g" | awk '{print "App.executeThreadsGroup "$1}'
cat app_${log_sufix}.log | grep "App.main END" | awk '{print $4}' | sed -E "s/(\(|\))//g" | awk '{print "App.main "$1}'
cat app_${log_sufix}.log | grep "App.setupExecutor END" | wc -l | awk '{print "executor setup count: "$1}'
cat app_${log_sufix}.log | grep "App.executeThreads END" | wc -l | awk '{print "threads count: "$1}'
cat app_${log_sufix}.log | grep "App.executeThreads END" | awk '{print $4}' | sed -E 's/[^0-9]//g' | awk 'BEGIN{sum=0}{sum=sum+$1}END{print "threads summary: "sum}'
}}
#html(</div>)

*** watch.sh [#m65a1f37]
#html(<div style="padding-left:10px">)
#mycode2(){{
#!/bin/bash

while [ true ]; do
    pid=`jps | grep App | awk '{print $1}'`
    if [ "$pid" != "" ]; then
        break
    fi  
done

jstat -gccapacity $pid
jstat -gcutil $pid 1000
}}
#html(</div>)

#html(</div>)


** 確認 [#p600967e]
#html(<div style="padding-left:10px">)

*** 事前にコア数の確認 [#i2e80ceb]
#html(<div style="padding-left:10px">)
Macの場合
#myterm2(){{
system_profiler SPHardwareDataType | grep Cores
      Total Number of Cores: 6
}}
※linuxの場合は、cat /proc/cpuinfo 等で確認する。
#html(</div>)


*** MAXスレッド数>コア数 [#c14ea0fc]
#html(<div style="padding-left:10px">)
#myterm2(){{
$ ./start.sh THREAD_POOL_MAX_NUM=10
gradle run -Pargs=THREAD_POOL_MAX_NUM=10
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
262144.0 262144.0 262144.0 43520.0 43520.0 175104.0   262144.0   262144.0   262144.0   262144.0      0.0 1056768.0   4864.0      0.0 1048576.0    512.0      1     0
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  5.96   0.00  67.65   0.01  74.07  75.14      3    0.003     0    0.000    0.003
 37.50   0.00  91.41   0.34  74.33  75.35      8    0.010     0    0.000    0.010
  0.00  44.64  74.91   0.54  74.56  75.35     13    0.014     0    0.000    0.014
 58.33   0.00  58.63   1.78  74.96  75.35     18    0.019     0    0.000    0.019
  0.00  51.04  54.05   4.19  75.54  75.35     23    0.026     0    0.000    0.026
 72.50   0.00  31.38   6.50  75.67  75.35     28    0.033     0    0.000    0.033
  0.00  60.00   7.41   8.92  75.85  75.35     33    0.039     0    0.000    0.039
  0.00  62.50  80.24  10.83  75.97  75.35     37    0.045     0    0.000    0.045
 68.75   0.00  41.94  13.18  76.35  75.44     42    0.051     0    0.000    0.051
  0.00  85.42   9.99  15.52  76.49  75.44     47    0.058     0    0.000    0.058
 68.75   0.00   3.43  17.58  76.78  75.44     52    0.064     0    0.000    0.064
 62.50   0.00  62.61  18.03  76.94  75.44     56    0.068     0    0.000    0.068
  0.00  73.75  23.27  20.36  76.96  75.44     61    0.075     0    0.000    0.075
  0.00  71.25  89.16  22.25  76.96  75.44     65    0.081     0    0.000    0.081
 61.25   0.00  50.58  24.68  76.97  75.44     70    0.088     0    0.000    0.088
  0.00  70.00  14.43  27.00  77.21  75.71     75    0.095     0    0.000    0.095
 81.25   0.00   5.43  29.42  77.58  75.71     80    0.102     0    0.000    0.102
 71.88   0.00  60.04  31.29  77.60  75.71     84    0.108     0    0.000    0.108
  0.00  67.50  46.93  33.08  77.60  75.71     89    0.113     0    0.000    0.113
 61.25   0.00  12.88  33.94  77.60  75.71     94    0.117     0    0.000    0.117
 71.25   0.00  75.99  35.74  77.60  75.71     98    0.122     0    0.000    0.122
  0.00  61.25  30.30  38.18  77.71  75.71    103    0.128     0    0.000    0.128
 70.00   0.00   9.30  40.50  77.79  75.71    108    0.134     0    0.000    0.134
 70.00   0.00  10.47  42.43  77.79  75.71    112    0.142     0    0.000    0.142
  0.00  61.25  57.95  43.89  77.79  75.71    115    0.147     0    0.000    0.147
 89.06   0.00  81.14  45.29  77.80  75.71    118    0.151     0    0.000    0.151
 87.50   0.00  35.72  47.20  77.80  75.71    122    0.157     0    0.000    0.157
 67.50   0.00   8.54  48.67  77.80  75.71    126    0.165     0    0.000    0.165
 62.50   0.00  17.73  49.20  77.80  75.71    130    0.169     0    0.000    0.169
  0.00  71.25  87.37  50.48  77.80  75.71    133    0.173     0    0.000    0.173
  0.00  71.25  19.96  52.38  77.80  75.71    137    0.179     0    0.000    0.179
 61.25   0.00  51.56  53.86  77.80  75.71    140    0.183     0    0.000    0.183
 62.50   0.00   9.79  55.75  77.80  75.71    144    0.189     0    0.000    0.189
 61.25   0.00  20.54  57.64  77.80  75.71    148    0.198     0    0.000    0.198
 65.00   0.00   0.00  59.54  77.80  75.71    152    0.204     0    0.000    0.204
  0.00  87.50  58.35  60.93  77.80  75.71    155    0.209     0    0.000    0.209
 78.12   0.00  95.57  62.38  77.80  75.71    158    0.216     0    0.000    0.216
  0.00  67.50  50.26  64.31  77.80  75.71    163    0.222     0    0.000    0.222
  0.00  62.50   0.00  65.27  77.82  75.71    167    0.226     0    0.000    0.226
 71.25   0.00  58.12  65.75  77.88  75.71    170    0.229     0    0.000    0.229
 71.25   0.00  48.27  67.66  77.88  75.71    174    0.235     0    0.000    0.235
 72.50   0.00  17.31  69.57  77.88  75.71    178    0.240     0    0.000    0.240
  0.00  62.50  49.19  71.06  77.88  75.71    181    0.244     0    0.000    0.244
 71.25   0.00  31.21  73.39  77.88  75.71    186    0.251     0    0.000    0.251
  0.00  63.75  73.59  74.86  77.88  75.71    189    0.255     0    0.000    0.255
  0.00  61.25  60.69  76.75  77.88  75.71    193    0.261     0    0.000    0.261
POOL_SETUP_EACH_TIME : true
THREAD_POOL_MAX_NUM : 10
THREAD_GROUP_NUM : 100
THREAD_NUM : 10
App.executeThreadsGroup 46504ms
App.main 46504ms
executor setup count: 100
threads count: 100
threads summary: 46496
}}
#html(</div>)

*** MAXスレッド数<コア数 [#ucb43ed9]
#html(<div style="padding-left:10px">)
#myterm2(){{
$ ./start.sh THREAD_POOL_MAX_NUM=3
gradle run -Pargs=THREAD_POOL_MAX_NUM=3
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
262144.0 262144.0 262144.0 43520.0 43520.0 175104.0   262144.0   262144.0   262144.0   262144.0      0.0 1056768.0   4480.0      0.0 1048576.0    384.0      0     0
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   2.43  78.00   0.00  73.96  75.14      1    0.001     0    0.000    0.001
  0.00  62.50  47.82   0.33  74.27  75.35      9    0.007     0    0.000    0.007
 47.92   0.00  32.67   0.41  74.65  75.35     16    0.012     0    0.000    0.012
  0.00  50.00  36.21   0.49  75.21  75.35     23    0.016     0    0.000    0.016
 37.50   0.00  98.14   0.57  75.38  75.35     30    0.020     0    0.000    0.020
 58.33   0.00   0.00   0.65  75.84  75.44     38    0.025     0    0.000    0.025
  0.00  78.12   0.00   0.74  76.11  75.44     45    0.029     0    0.000    0.029
 52.08   0.00   0.00   0.82  76.20  75.44     52    0.033     0    0.000    0.033
 34.38   0.00  30.79   0.87  76.21  75.44     58    0.037     0    0.000    0.037
  0.00  22.92  17.57   0.94  76.26  75.44     65    0.041     0    0.000    0.041
 81.25   0.00   0.00   1.00  76.35  75.44     72    0.045     0    0.000    0.045
  0.00  10.42   5.55   1.07  76.69  75.44     79    0.049     0    0.000    0.049
 71.88   0.00   0.00   1.14  76.73  75.44     86    0.053     0    0.000    0.053
  0.00  56.25   0.00   1.19  76.74  75.44     93    0.056     0    0.000    0.056
 71.88   0.00  17.13   1.27  76.75  75.44    100    0.060     0    0.000    0.060
 18.75   0.00  94.65   1.32  76.75  75.44    106    0.064     0    0.000    0.064
  0.00  78.12  52.86   1.40  76.76  75.44    113    0.068     0    0.000    0.068
  0.00  43.75  52.48   1.46  76.82  75.44    119    0.071     0    0.000    0.071
 40.62   0.00  27.65   1.54  76.83  75.44    126    0.075     0    0.000    0.075
 43.75   0.00  93.45   1.60  76.90  75.44    132    0.079     0    0.000    0.079
  0.00  31.25  30.08   1.67  76.98  75.44    139    0.083     0    0.000    0.083
 53.12   0.00   0.00   1.77  76.98  75.44    146    0.087     0    0.000    0.087
 81.25   0.00  13.57   1.84  77.00  75.44    152    0.090     0    0.000    0.090
 31.25   0.00  39.10   1.90  77.04  75.44    158    0.093     0    0.000    0.093
 50.00   0.00  52.23   1.96  77.32  75.44    164    0.096     0    0.000    0.096
  0.00  50.00  90.85   2.03  77.53  75.44    169    0.099     0    0.000    0.099
  0.00  47.92  57.15   2.11  77.53  75.44    175    0.102     0    0.000    0.102
 37.50   0.00  84.69   2.16  77.53  75.44    180    0.105     0    0.000    0.105
 78.12   0.00  21.86   2.23  77.54  75.44    186    0.108     0    0.000    0.108
  0.00  35.42  77.59   2.27  77.56  75.44    191    0.110     0    0.000    0.110
POOL_SETUP_EACH_TIME : true
THREAD_POOL_MAX_NUM : 3
THREAD_GROUP_NUM : 100
THREAD_NUM : 10
App.executeThreadsGroup 29948ms
App.main 29949ms
executor setup count: 100
threads count: 100
threads summary: 29940
}}
#html(</div>)

*** MAXスレッド数=コア数 [#t0720cc8]
#html(<div style="padding-left:10px">)
#myterm2(){{
$ ./start.sh THREAD_POOL_MAX_NUM=6
gradle run -Pargs=THREAD_POOL_MAX_NUM=6
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
262144.0 262144.0 262144.0 43520.0 43520.0 175104.0   262144.0   262144.0   262144.0   262144.0      0.0 1056768.0   4864.0      0.0 1048576.0    512.0      1     0
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   4.23  15.67   0.00  74.01  75.14      3    0.003     0    0.000    0.003
  0.00  57.50  28.24   0.39  74.39  75.35     11    0.010     0    0.000    0.010
 23.75   0.00  61.83   1.36  74.77  75.35     18    0.016     0    0.000    0.016
 45.31   0.00   2.99   1.49  75.53  75.35     26    0.021     0    0.000    0.021
  0.00  56.25  71.33   1.60  75.72  75.35     33    0.027     0    0.000    0.027
 68.75   0.00  85.08   1.69  75.85  75.35     40    0.033     0    0.000    0.033
 53.12   0.00   0.00   2.92  76.10  75.35     48    0.040     0    0.000    0.040
  0.00  37.50  13.11   3.34  76.43  75.44     55    0.045     0    0.000    0.045
 50.00   0.00  35.20   3.46  76.48  75.44     62    0.049     0    0.000    0.049
  0.00  83.33  32.56   3.54  76.51  75.44     69    0.055     0    0.000    0.055
 32.81   0.00  45.74   4.08  76.69  75.44     76    0.061     0    0.000    0.061
  0.00  20.31  67.75   5.10  77.10  75.44     83    0.066     0    0.000    0.066
  0.00  45.83   0.00   5.23  77.30  75.44     91    0.071     0    0.000    0.071
 81.25   0.00   0.00   5.32  77.34  75.44     98    0.076     0    0.000    0.076
  0.00  18.75   4.97   5.42  77.44  75.44    105    0.080     0    0.000    0.080
 26.56   0.00   0.00   6.98  77.44  75.44    112    0.087     0    0.000    0.087
  0.00  37.50  43.03   7.13  77.44  75.44    117    0.091     0    0.000    0.091
 41.67   0.00  64.72   7.22  77.48  75.44    122    0.094     0    0.000    0.094
  0.00  77.08  56.45   7.27  77.74  75.71    127    0.098     0    0.000    0.098
  0.00  91.67  16.10   7.36  77.79  75.71    133    0.105     0    0.000    0.105
  0.00  70.31  17.80   8.03  77.79  75.71    139    0.109     0    0.000    0.109
 34.38   0.00  43.40   8.97  77.79  75.71    144    0.113     0    0.000    0.113
  0.00  26.56  72.22   9.06  77.81  75.71    149    0.117     0    0.000    0.117
  0.00  47.92  54.32   9.15  77.81  75.71    155    0.121     0    0.000    0.121
  0.00  62.50  61.12   9.25  77.81  75.71    161    0.125     0    0.000    0.125
 68.75   0.00  61.09   9.31  77.83  75.71    166    0.131     0    0.000    0.131
 45.31   0.00  39.81  10.51  77.86  75.71    172    0.135     0    0.000    0.135
 26.56   0.00   0.00  10.84  77.86  75.71    178    0.139     0    0.000    0.139
  0.00  64.58   0.00  10.90  77.86  75.71    183    0.143     0    0.000    0.143
 62.50   0.00   0.00  11.02  77.86  75.71    190    0.147     0    0.000    0.147
  0.00  67.19  17.57  11.07  77.86  75.71    195    0.151     0    0.000    0.151
POOL_SETUP_EACH_TIME : true
THREAD_POOL_MAX_NUM : 6
THREAD_GROUP_NUM : 100
THREAD_NUM : 10
App.executeThreadsGroup 30566ms
App.main 30567ms
executor setup count: 100
threads count: 100
threads summary: 30555
}}
#html(</div>)

*** MAXスレッド数=(コア数-1) [#t0720cc8]
#html(<div style="padding-left:10px">)
#myterm2(){{
$ ./start.sh THREAD_POOL_MAX_NUM=5
gradle run -Pargs=THREAD_POOL_MAX_NUM=5
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
262144.0 262144.0 262144.0 43520.0 43520.0 175104.0   262144.0   262144.0   262144.0   262144.0      0.0 1056768.0   4480.0      0.0 1048576.0    384.0      0     0
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  3.38   4.85   0.00   0.00  74.01  75.14      3    0.003     0    0.000    0.003
 22.50   0.00  19.31   0.37  74.45  75.35     12    0.012     0    0.000    0.012
  0.00  39.06   0.00   0.52  75.35  75.35     21    0.018     0    0.000    0.018
  0.00  75.00  41.65   0.63  75.56  75.35     29    0.024     0    0.000    0.024
 23.44   0.00  37.88   0.75  75.91  75.35     38    0.030     0    0.000    0.030
  0.00  47.92   0.00   0.89  76.19  75.44     47    0.036     0    0.000    0.036
  0.00  64.58  31.21   1.00  76.34  75.44     55    0.042     0    0.000    0.042
 64.06   0.00   0.00   1.14  76.47  75.44     64    0.048     0    0.000    0.048
 21.88   0.00  65.90   1.22  76.54  75.44     72    0.052     0    0.000    0.052
  0.00  52.08   0.00   1.37  76.86  75.44     81    0.056     0    0.000    0.056
  0.00  70.83   9.66   1.49  76.88  75.44     89    0.061     0    0.000    0.061
  0.00  53.12  37.36   1.57  76.92  75.44     95    0.066     0    0.000    0.066
  0.00  23.44   8.96   1.64  77.21  75.44    101    0.069     0    0.000    0.069
 41.67   0.00  67.82   1.75  77.29  75.44    108    0.073     0    0.000    0.073
 60.42   0.00  52.98   1.84  77.34  75.44    114    0.078     0    0.000    0.078
 79.17   0.00  51.47   1.92  77.39  75.44    120    0.084     0    0.000    0.084
 20.31   0.00  26.53   1.99  77.43  75.44    126    0.089     0    0.000    0.089
 35.42   0.00  78.47   2.07  77.45  75.44    133    0.094     0    0.000    0.094
  0.00  54.17   4.56   2.19  77.45  75.44    139    0.098     0    0.000    0.098
  0.00  72.92   0.00   2.27  77.45  75.44    145    0.102     0    0.000    0.102
  0.00  54.69   0.00   2.35  77.67  75.71    151    0.108     0    0.000    0.108
  0.00  23.44  21.65   2.42  77.85  75.71    157    0.112     0    0.000    0.112
  0.00  43.75  21.83   2.50  77.85  75.71    163    0.116     0    0.000    0.116
  0.00  60.42  37.79   2.58  77.92  75.71    169    0.120     0    0.000    0.120
 79.17   0.00  14.04   2.70  77.92  75.71    176    0.125     0    0.000    0.125
  0.00  53.12  78.88   2.76  77.92  75.71    181    0.128     0    0.000    0.128
 23.44   0.00  78.34   2.84  77.92  75.71    188    0.132     0    0.000    0.132
  0.00  54.17   0.00   2.96  77.92  75.71    195    0.137     0    0.000    0.137
POOL_SETUP_EACH_TIME : true
THREAD_POOL_MAX_NUM : 5
THREAD_GROUP_NUM : 100
THREAD_NUM : 10
App.executeThreadsGroup 27507ms
App.main 27507ms
executor setup count: 100
threads count: 100
threads summary: 27500
}}
#html(</div>)

#html(</div>)

//** 結論 [#le8eb3a0]
//#html(<div style="padding-left:10px">)
//#html(</div>)



トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS