#author("2018-09-17T11:14:45+00:00","","") * ExecutorServiceの最大プールサイズを考える(Java) [#lc69289b] #setlinebreak(on); #contents ** 概要 [#sd11dbd6] #html(<div style="padding-left:10px">) newFixedThreadPool で固定数のスレッドプールを生成する。 #html(</div>) ** 結論 [#le8eb3a0] #html(<div style="padding-left:10px">) 先に結論を書いてしまうと、 newFixedThreadPool に設定する最大プール数はコア数以下に設定するのが望ましい。 ※メインスレッドの事を考えると、コア数 - 1 ぐらいが良い。 今回のような単純なMapインスタンスの生成を繰り返すようなプログラムの場合、 確保するスレッド数=コア数 - 1 の時がスループットが良く、ヒープ消費も一番効率が良い事が分かった。 ただ、スレッド内で行う処理がある程度のI/O待ちを伴うような処理の場合は、もう少し結果が変わってくると思われる。 一番良くないのはコア数を大きく超えるプール数を確保した時で、スループットもヒープ効率も一番悪い結果となった。 ※コア数以上のプールを確保した場合は、ヒープ消費がかなり増える模様。 恐らくコア数以上のプールを確保した場合、コンテキストスイッチが多数発生する事により ・スレッド辺りのスループットが落ちる ・スレッドで使用するメモリ開放のタイミングも遅れる 等の悪循環を生んでしまうので、パフォーマンス、メモリ効率共に悪くなったのではないかと思われる。 ※今回は vmstat を取り忘れてしまったので推測でしかないが・・ 尚、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] #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>)