读书人

一次性能调优札记(线程池)

发布时间: 2012-12-25 16:18:28 作者: rapoo

一次性能调优笔记(线程池)

普通的性能调优主要从四个方面入手

网络,磁盘IO,内存,CPU四个方面入手,下面案例就是从这四个角度来看。

?

我们的页面每天PV在30W ,主要是分布在两个主要页面:个人主页,展示主页。假设每个页面各自承担50%的PV,假设访问时间集中在白天8小时,平均下来每秒的请求数是 5.2个,考虑到高峰情况,那么我们就乘以系数20, 就当100个处理,我们最大的一个请求会产生13个processor ,也就是说 最大产生的线程回事 13*100 = 1300。也就是说高峰时刻会有1300个线程需要被处理,我们将队列设置为1000,对于高峰情况就抛弃,因为若是为了满足高峰情况的需要,就会使得部分请求处在队列中,不能充分的利用CPU的资源。

?

在做压力测试时候,自身应用内部做了小的多线程处理的框架,内部采用的线程池是 SPRING的 ThreadPoolTaskExecutor 的类,通过自身的一个监控框架我们发现,所有的线程单元执行的很快,但是在最后组装processor的时候,花费了时间,在过程中观察CPU的利用率并不是很高。

所以预估是在等待所有线程执行完成时,也就是说有大量的processor在线程池的等待队列中,为了验证是否由于该原因造成的,所以做如下测试:

?

因为前面提到每秒的平均请求是5.2 考虑到一般的情况,就设置为压测的并发数为 3*5 = 15.

?

测试案例一:

?

15线程?

循环100次

线程池:

?corePoolSize : CPU = 4?

?maxPoolSize ?: 2 * corePoolSize = 8?

?queueCapacity : 1000?

?

压测页面: /xxx/22933?

?

---------------------------------------------- 这个是分割线 ----------------------------------------------

稳定情况下的线程数:

[root@host_77-69 ~]# ps -eLf | grep java ?| wc -l?

229

主要是观察,是否充分利用了CPU核数,达到我们预期的效果。现在的服务继承很多框架或是模块后,会启动很多你不知道的线程,在那跑着,时不时跳出来干扰你下,所以一定要等系统运行稳定后观察这个数值。

---------------------------------------------- 这个是分割线 ----------------------------------------------

CPU的一些信息:

[root@host_77-69 ~]# vmstat -ns 3  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 0  0   2056 723528 392024 1330728    0    0     0     1    1    2  0  0 100  0  0 0  0   2056 723404 392024 1330728    0    0     0     0  467  806  0  0 100  0  0 0  0   2056 723404 392028 1330728    0    0     0    17  462  807  0  0 100  0  0 0  0   2056 723404 392028 1330728    0    0     0     0  457  814  0  0 100  0  0
??

主要是关注 in , cs 这两个参数

in:每秒软中断次数

cs: 每秒上下文切换的次数

?

因为操作系统本身会有一些操作,在未压测前的数值基本在 460 .800 左右。

---------------------------------------------- 这个是分割线 ----------------------------------------------

?

[root@host_77-69 ~]#  mpstat -P ALL 5 Linux 2.6.32-71.el6.x86_64 (host_77-69) 09/12/2012 _x86_64_(4 CPU)02:04:21 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle02:04:26 PM  all    0.10    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.9002:04:26 PM    0    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.80
??

关注soft 这个参数 这个代表当前CPU在所有时间中,用于切换上下所化时间比,若是花费的越多,代表当前的线程切换过于频繁,没有充分利用CPU,建议减少线程数或是增加CPU。

user 、 nice、sys主要是观察系统中是否存在大量计算,或是死循环的情况,来消耗大量的CPU。

这个命令是对于vmstat的补充,更直观的观察CPU的上下文切换及软中断情况。

?

---------------------------------------------- 下面是内存的初始情况了 ----------------------------------------------

JVM自身的内存情况:

?

[root@host_77-69 ~]# jstat -gcutil `jps | grep -i main | awk '{print $1}'` 3000 1000   S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT     0.00   0.00  90.91  13.56  60.25     26    0.877     2    0.802    1.679  0.00   0.00  91.17  13.56  60.25     26    0.877     2    0.802    1.679  0.00   0.00  91.27  13.56  60.25     26    0.877     2    0.802    1.679  0.00   0.00  91.28  13.56  60.25     26    0.877     2    0.802    1.679
?

fugcc次数基本不变,而且各个代内存变化基本不大?

?

操作系统的内存情况:

?

[root@host_77-69 releases]# for i in {1..10};do  free;sleep 3  ; done;             total       used       free     shared    buffers     cachedMem:       3925596    3223996     701600          0     392352    1330896-/+ buffers/cache:    1500748    2424848Swap:      4194296       2056    4192240             total       used       free     shared    buffers     cachedMem:       3925596    3223996     701600          0     392352    1330896-/+ buffers/cache:    1500748    2424848Swap:      4194296       2056    4192240             total       used       free     shared    buffers     cachedMem:       3925596    3223996     701600          0     392352    1330896-/+ buffers/cache:    1500748    2424848Swap:      4194296       2056    4192240
??

数值也基本保持不变化

?

---------------------------------------------- 下面是磁盘IO的初始情况了 ----------------------------------------------?

?

[root@host_77-69 ~]# for i in {1..10};do  iostat ; sleep 3 ; done ;Linux 2.6.32-71.el6.x86_64 (host_77-69) 09/12/2012 _x86_64_(4 CPU)avg-cpu:  %user   %nice %system %iowait  %steal   %idle           0.10    0.00    0.02    0.00    0.00   99.88Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtnsda               0.31         0.33         5.93    1751462   31740872Linux 2.6.32-71.el6.x86_64 (host_77-69) 09/12/2012 _x86_64_(4 CPU)avg-cpu:  %user   %nice %system %iowait  %steal   %idle           0.10    0.00    0.02    0.00    0.00   99.88Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtnsda               0.31         0.33         5.93    1751462   31740960
??

主要观察?

Blk_read/s ? ?每秒中读取的块数

Blk_wrtn/s ? ?每秒中写的块数

%iowait ? ? ? 当前在等待磁盘IO的情况

?

---------------------------------------------- 说了这么多终于要开始了 ----------------------------------------------?

?

开始压测后,得到下面的数据:

?

[root@host_77-69 ~]# vmstat -ns 3  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----0  0   2056 698224 393212 1331344    0    0     0     3  536  867  0  0 100  0  0 3  0   2056 694796 393212 1332248    0    0     0    19 7170 7515 55  4 40  0  0 1  0   2056 694796 393212 1333132    0    0     0     4 7121 7627 50  5 45  0  0 4  0   2056 692936 393216 1334376    0    0     0    17 6478 8738 54  5 42  0  0 2  0   2056 691548 393232 1335620    0    0     0    25 6497 7663 48  4 48  0  0 5  0   2056 689936 393232 1337052    0    0     0     3 7597 7174 47  5 48  0  0 3  0   2056 688704 393232 1338496    0    0     0    12 7369 8774 49  5 45  0  0 3  0   2056 686348 393232 1341528    0    0     0   819 12298 16011 50  5 45  0  0 4  0   2056 684976 393236 1343020    0    0     0    12 6034 6951 48  4 48  0  0 3  0   2056 664268 393240 1344508    0    0     0     1 6731 9584 52  5 42  0  0 1  0   2056 659360 393240 1346284    0    0     0    12 7797 8431 54  5 41  0  0 2  0   2056 657624 393240 1347564    0    0     0  2684 6908 7656 50  5 45  0  0
??

在压测的这个过程中,CPU大量上下文切换动作明显增加了很多。

?

[root@host_77-69 ~]#  mpstat -P ALL 5  04:01:32 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle04:01:37 PM  all    0.15    0.00    0.10    0.00    0.00    0.05    0.00    0.00   99.7004:01:37 PM    0    0.20    0.00    0.00    0.00    0.00    0.20    0.00    0.00   99.6004:01:37 PM    1    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.8004:01:37 PM    2    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.8004:01:37 PM    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
?

这个数据上看出其中一个CPU花费在切换的时间比是0.2%,也不是很高。

?

 [root@host_77-69 ~]# ps -eLf | grep java  | wc -l 229[root@host_77-69 ~]# ps -eLf | grep java  | wc -l 236[root@host_77-69 ~]# ps -eLf | grep java  | wc -l 236[root@host_77-69 ~]# ps -eLf | grep java  | wc -l 235[root@host_77-69 ~]# ps -eLf | grep java  | wc -l 229[root@host_77-69 ~]# ps -eLf | grep java  | wc -l 229
??

java的线程数增加到了236,也就是说增加了7个,我们最初设置是4个,队列1000 ,在队列满了后,增加了3个,也就是说,这种情况,扩容到7个线程,就能满足我们的压测条件,那说明core为4,存在大量的队列积压情况,同时,上面的数据表明,用于上下文切换的比例也不是很高,如此我们就可以增加线程池的corePoolSize。那么下个案例就可以设置为8个试试看。

?

[root@host_77-69 ~]# jstat -gcutil `jps | grep -i main | awk '{print $1}'` 3000 1000   S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT    0.00  27.46  76.94  19.37  60.86     31    1.139     3    1.497    2.636  0.00  23.34  85.64  19.37  60.90     33    1.150     3    1.497    2.647  0.00  36.14  38.44  19.37  60.91     35    1.167     3    1.497    2.665  0.00  63.19  37.87  19.37  60.92     37    1.191     3    1.497    2.688 59.29   0.00   1.61  19.48  60.92     40    1.226     3    1.497    2.723  0.00  50.63  58.22  19.50  60.93     41    1.236     3    1.497    2.733  0.00  51.09  70.36  19.58  60.94     43    1.265     3    1.497    2.762 44.05   0.00   2.09  19.67  60.95     46    1.298     3    1.497    2.795  0.00  83.74  75.70  19.68  60.96     47    1.316     3    1.497    2.813  0.00  89.57  77.32  20.21  60.96     49    1.350     3    1.497    2.847 46.02   0.00  36.83  22.12  60.97     52    1.399     3    1.497    2.896 36.69   0.00  37.78  22.12  60.98     54    1.417     3    1.497    2.914 59.51   0.00  23.47  22.12  61.00     56    1.435     3    1.497    2.932 64.53   0.00  36.51  22.29  61.03     58    1.461     3    1.497    2.959 73.19   0.00  78.00  23.01  61.05     60    1.497     3    1.497    2.995 54.24   0.00  36.10  23.01  61.06     62    1.521     3    1.497    3.018 79.36   0.00  82.65  23.01  61.08     64    1.547     3    1.497    3.044  0.00  68.75  48.34  26.61  61.10     67    1.606     3    1.497    3.103 29.33   0.00  93.75  26.61  61.12     68    1.613     3    1.497    3.110  0.00  45.32  23.68  26.61  61.12     71    1.640     3    1.497    3.138 34.93   0.00  19.75  29.84  61.13     74    1.697     3    1.497    3.194 22.59   0.00  27.47  29.84  61.14     76    1.711     3    1.497    3.208 54.40   0.00  74.16  30.45  61.15     78    1.734     3    1.497    3.231 25.23   0.00  77.50  30.45  61.15     80    1.747     3    1.497    3.245 25.23   0.00  98.39  30.45  61.15     80    1.747     3    1.497    3.245 25.23   0.00  99.94  30.45  61.15     80    1.747     3    1.497    3.245  0.00  14.32   1.42  30.45  61.15     81    1.752     3    1.497    3.250  0.00  14.32   2.15  30.45  61.15     81    1.752     3    1.497    3.250  0.00  14.32   2.27  30.45  61.15     81    1.752     3    1.497    3.250  0.00  14.32   2.48  30.45  61.15     81    1.752     3    1.497    3.250

?

?

这个是查看JVM的GC情况的,数据表明,压测期间,ygc还是蛮频繁,但是每次ygc后进入old区的数据并不是很多,说明我们的应用大部分是朝生夕死,并不会发生频繁fgc的情况,之后就不用把重心放在JVM的GC上。

?

[root@host_77-69 releases]# for i in {1..10};do  free;sleep 3  ; done;             total       used       free     shared    buffers     cachedMem:       3925596    3370968     554628          0     395584    1369572-/+ buffers/cache:    1605812    2319784Swap:      4194296       2056    4192240
?

操作系统跟之心前相比,基本没有发生任何的改变。

?

avg-cpu:  %user   %nice %system %iowait  %steal   %idle           0.10    0.00    0.02    0.00    0.00   99.88Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtnsda               0.31         0.33         5.95    1751462   31823032Linux 2.6.32-71.el6.x86_64 (host_77-69) 09/12/2012 _x86_64_(4 CPU)avg-cpu:  %user   %nice %system %iowait  %steal   %idle           0.10    0.00    0.02    0.00    0.00   99.88Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtnsda               0.31         0.33         5.95    1751462   31823032

?

?

这个是当前应用对于磁盘的消耗情况,对比初始值,基本没什么变化,可以看出我们这个应用没有磁盘IO的消耗,这说明本应用并没有大量的操作本地磁盘IO情况。

这个也不是导致我们系统慢的原因,也可以排除。

?

?

xxxModuleProcessor33 最慢的processor是33毫秒

?

我们的processor最大的消耗是33毫秒,外部调用4.9ms ,但是最后看到的消耗时间是557ms,且上面的情况说明了,存在大量队列积压,我们的数据处理processor都在等待队列了

?

下面是我们通过

Avg(ms):

第一次: 662.5 毫秒

第二次: 680 ? 毫秒

第三次: 690 ? 毫秒

?

通过上面的分析,平均响应时间是:680ms,基本可以确定问题在于线程池corePoolSize过小,导致了一定的数据在队列中积压。

?

?

--------------------------------------------- ?这是一条伟大的分割线 ?---------------------------------------------

测试案例二:

?

改动:增加一倍的corePoolSize

?

15线程?

循环100次

线程池:

?corePoolSize ;2 * CPU = ?8?

?maxPoolSize ?:2 * corePoolSize = 16?

?queueCapacity : 1000?

?

压测页面: /member/22933?

?

--------------------------------------------- ?我又出现了 ?---------------------------------------------

?

再次启动稳定后:

[root@host_77-69 ~]# for i in {1..10000};do ? ?ps -eLf | grep java ?| wc -l; echo "-------" ; sleep 2 ; done;

215

-------

215

-------

215

-------

?

java的线程数维持在215个,跟上面有点不同,当然不管了,这个不是重点。

?

?

[root@host_77-69 ~]# vmstat -ns 3  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- 0  0   2056 933420 395768 1341376    0    0     0     8  579  875  0  0 100  0  0 0  0   2056 933420 395768 1341376    0    0     0     3  579  860  0  0 100  0  0 0  0   2056 933420 395776 1341372    0    0     0     9  568  867  0  0 100  0  0
?

?

初始情况CPU运行都很正常?

?

?

[root@host_77-69 ~]#  mpstat -P ALL 5 Linux 2.6.32-71.el6.x86_64 (host_77-69) 09/12/2012 _x86_64_(4 CPU)05:43:34 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle05:43:39 PM  all    0.40    0.00    0.10    0.00    0.00    0.00    0.00    0.00   99.5005:43:39 PM    0    0.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00   99.00

?

基本没有软中断

?

压测后得到如下数据:

[root@host_77-69 ~]# for i in {1..10000};do ? ?ps -eLf | grep java ?| wc -l; echo "-------" ; sleep 2 ; done;

214

-------

214

-------

214

-------

217

-------

219

-------

219

-------

。。。。。。

221

-------

219

-------

。。。。。。

218

-------

218

-------

214

-------

这个java线程数的变化情况,从 214-- 221 -- 214。 初始化了8个,然后增加了7个,也就是说线程池中总共启用了15个线程。

------------------------------------------------------ ?

?

[root@host_77-69 ~]#  mpstat -P ALL 5 05:59:00 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle05:59:05 PM  all   51.46    0.00    4.58    0.00    0.29    2.00    0.00    0.00   41.6705:59:05 PM    0   50.98    0.00    4.71    0.00    0.98    7.25    0.00    0.00   36.0805:59:05 PM    1   51.07    0.00    4.29    0.00    0.00    0.39    0.00    0.00   44.2505:59:05 PM    2   50.49    0.00    4.87    0.00    0.00    0.19    0.00    0.00   44.4405:59:05 PM    3   53.29    0.00    4.46    0.00    0.00    0.19    0.00    0.00   42.0505:59:05 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle05:59:10 PM  all   49.56    0.00    4.25    0.00    0.29    2.00    0.00    0.00   43.8905:59:10 PM    0   46.56    0.00    3.73    0.00    1.18    7.07    0.00    0.00   41.4505:59:10 PM    1   58.12    0.00    4.31    0.00    0.00    0.39    0.00    0.00   37.1805:59:10 PM    2   45.72    0.00    4.67    0.00    0.00    0.39    0.00    0.00   49.2205:59:10 PM    3   47.95    0.00    4.29    0.00    0.00    0.39    0.00    0.00   47.3705:59:10 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle05:59:15 PM  all   50.54    0.00    4.19    0.00    0.29    1.75    0.00    0.00   43.2305:59:15 PM    0   55.36    0.00    3.70    0.00    1.17    5.85    0.00    0.00   33.9205:59:15 PM    1   53.62    0.00    4.70    0.00    0.00    0.59    0.00    0.00   41.1005:59:15 PM    2   46.98    0.00    4.29    0.00    0.00    0.19    0.00    0.00   48.5405:59:15 PM    3   46.21    0.00    4.27    0.00    0.00    0.19    0.00    0.00   49.3205:59:15 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle05:59:20 PM  all   52.78    0.00    4.48    0.05    0.39    2.14    0.00    0.00   40.1705:59:20 PM    0   52.17    0.00    3.94    0.00    1.57    7.68    0.00    0.00   34.6505:59:20 PM    1   52.35    0.00    4.90    0.00    0.00    0.39    0.00    0.00   42.3505:59:20 PM    2   57.09    0.00    4.85    0.00    0.00    0.19    0.00    0.00   37.8605:59:20 PM    3   49.42    0.00    4.23    0.00    0.00    0.38    0.00    0.00   45.9605:59:20 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle05:59:25 PM  all   46.90    0.00    3.85    0.00    0.34    1.76    0.00    0.00   47.1505:59:25 PM    0   48.34    0.00    3.70    0.00    1.56    6.43    0.00    0.00   39.9605:59:25 PM    1   43.30    0.00    4.47    0.00    0.00    0.39    0.00    0.00   51.8405:59:25 PM    2   50.59    0.00    3.52    0.00    0.00    0.39    0.00    0.00   45.5105:59:25 PM    3   45.14    0.00    3.70    0.00    0.00    0.19    0.00    0.00   50.97
??

上面的数据表明,中断占CPU的比例确大大增加了。单核中断最高达到了7.25% 如此导致了什么结果呢?

?

Min(ms)Max(ms)Avg(ms)95Line(ms)Std(ms)TPS

161.2 ?8877.4731.7 ?1000.0 ? ?65.3 ?1.2

?

想比较corePoolSize:4 max:8 性能反而下降了。平均响应时间从662.5降到了731.7。

?

最慢的processor的消耗时间是:187.9

?

期间也猜测可能是其中一个服务被我们压坏了,就重启了那个服务,再次压测的结果是

Min(ms)Max(ms)Avg(ms)95Line(ms)Std(ms)TPS

102.9 ?9188.9762.5 ?1095.0 ? ?657.8 ?3.0

?

平均响应时间是:750毫秒左右。

?

也就是说,基本可以确认是由于我们增加了 coreSize和maxSize导致性能变慢了。慢了近80毫秒。说明过多的CPU并不会加快我们的处理速度。

如此就有了下面的方案。

?

测试方案三:

corePoolSize : cpu数量 + 1 ?= 5?

maxPoolSzie : 2 * corePoolSize  = 10?

?

我们看下具体情况吧:

?

?

[root@host_77-69 ~]#  mpstat -P ALL 5 06:57:36 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle06:57:41 PM  all   58.27    0.00    5.38    0.00    0.49    2.30    0.00    0.00   33.5606:57:41 PM    0   61.66    0.00    4.74    0.00    1.98    8.10    0.00    0.00   23.5206:57:41 PM    1   55.75    0.00    5.65    0.00    0.00    0.58    0.00    0.00   38.0106:57:41 PM    2   57.81    0.00    5.47    0.00    0.00    0.20    0.00    0.00   36.52
??

CPU的上下文切换还是很厉害。达到了8.10%

[root@host_77-69 ~]# for i in {1..10000};do ? ?ps -eLf | grep java ?| wc -l; echo "-------" ; sleep 2 ; done;

214

-------

214

-------

219

-------

219

-------

217

-------

215

-------

214

?

214--219?

原来线程池core是5,我们最大是10个,线程数确实增加到了10个,就是说10个线程对应到4个CPU上,两者的比例是1:2.25?

?

结果:

第一次压测是:648毫秒

第二次压测是:622毫秒

第三次压测是:603毫秒

?

就取中间值吧:622毫秒?

?

性能想比较 core:8 max:16的话,有0.060毫秒的提升。说明一定cpu和进程数保持在1:2.25的比例上,效率上还是有提高的,但是上下文切换的还是很厉害。

?

为了不让它切换的这么厉害,就将max设置的小点吧。

?

测试方案四

线程:15?

循环:100次

corePoolSize : cpu数量 + 1 ? ?= ?5?

maxPoolSzie : 2 * cpu ? ?= ?8

?

08:13:13 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle08:13:18 PM  all   52.45    0.00    4.60    0.00    0.10    1.27    0.00    0.00   41.5808:13:18 PM    0   60.00    0.00    3.96    0.00    0.59    3.96    0.00    0.00   31.4908:13:18 PM    1   50.29    0.00    5.48    0.00    0.00    0.20    0.00    0.00   44.0308:13:18 PM    2   50.78    0.00    4.86    0.00    0.00    0.58    0.00    0.00   43.7708:13:18 PM    3   48.83    0.00    4.28    0.00    0.00    0.19    0.00    0.00   46.6908:13:18 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle08:13:23 PM  all   50.05    0.00    4.29    0.00    0.10    1.22    0.00    0.00   44.3408:13:23 PM    0   57.54    0.00    4.56    0.00    0.20    3.97    0.00    0.00   33.7308:13:23 PM    1   49.81    0.00    4.28    0.00    0.00    0.39    0.00    0.00   45.5308:13:23 PM    2   48.16    0.00    3.88    0.00    0.00    0.39    0.00    0.00   47.5708:13:23 PM    3   45.07    0.00    4.45    0.00    0.00    0.19    0.00    0.00   50.2908:13:23 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle08:13:28 PM  all   51.34    0.00    4.69    0.00    0.10    1.27    0.00    0.00   42.6008:13:28 PM    0   60.08    0.00    4.15    0.00    0.40    3.95    0.00    0.00   31.4208:13:28 PM    1   47.75    0.00    6.07    0.00    0.00    0.39    0.00    0.00   45.7908:13:28 PM    2   47.48    0.00    4.26    0.00    0.00    0.39    0.00    0.00   47.8708:13:28 PM    3   50.19    0.00    4.28    0.00    0.00    0.39    0.00    0.00   45.14

中断时间确实从7%下降到了4%左右。

[root@host_77-69 ~]# for i in {1..10000};do ? ?ps -eLf | grep java ?| wc -l; echo "-------" ; sleep 2 ; done;

215

-------

217

-------

217

-------

219

-------

219

-------

218

-------

线程池基本处于饱和状态。

?

结果:

第一次压测结果:629毫秒

第二次压测结果:618毫秒

第三次压测结果:586毫秒

?

这次CPU:线程数为1:2

相比较CPU和线程数1.2.25的结果有稍微的提升,因为CPU中断时间比下降了。

?

最终的结论,JVM的垃圾回收,本地磁盘IO,操作系统内存都不会对本应用产生影响,唯一的元素就是线程池大小的设置。目前测试出来的最佳策略是:

corePoolSize = cpu + 1

maxPoolSize = 2 * cpu?? 

?

读书人网 >编程

热点推荐