普通的性能調優主要從四個方面入手

網絡,磁盤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   %idle
02:04:26 PM  all    0.10    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.90
02: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     cached
Mem:       3925596    3223996     701600          0     392352    1330896
-/+ buffers/cache:    1500748    2424848
Swap:      4194296       2056    4192240
             total       used       free     shared    buffers     cached
Mem:       3925596    3223996     701600          0     392352    1330896
-/+ buffers/cache:    1500748    2424848
Swap:      4194296       2056    4192240
             total       used       free     shared    buffers     cached
Mem:       3925596    3223996     701600          0     392352    1330896
-/+ buffers/cache:    1500748    2424848
Swap:      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.88

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.31         0.33         5.93    1751462   31740872

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.88

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               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   %idle
04:01:37 PM  all    0.15    0.00    0.10    0.00    0.00    0.05    0.00    0.00   99.70
04:01:37 PM    0    0.20    0.00    0.00    0.00    0.00    0.20    0.00    0.00   99.60
04:01:37 PM    1    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.80
04:01:37 PM    2    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.80
04: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     cached
Mem:       3925596    3370968     554628          0     395584    1369572
-/+ buffers/cache:    1605812    2319784
Swap:      4194296       2056    4192240
?

操作系統跟之心前相比,基本沒有發生任何的改變。

?

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.10    0.00    0.02    0.00    0.00   99.88

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.31         0.33         5.95    1751462   31823032

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.88

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.31         0.33         5.95    1751462   31823032

?

?

這個是當前應用對于磁盤的消耗情況,對比初始值,基本沒什么變化,可以看出我們這個應用沒有磁盤IO的消耗,這說明本應用并沒有大量的操作本地磁盤IO情況。

這個也不是導致我們系統慢的原因,也可以排除。

?

?

xxxModuleProcessor 33 最慢的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   %idle
05:43:39 PM  all    0.40    0.00    0.10    0.00    0.00    0.00    0.00    0.00   99.50
05: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   %idle
05:59:05 PM  all   51.46    0.00    4.58    0.00    0.29    2.00    0.00    0.00   41.67
05:59:05 PM    0   50.98    0.00    4.71    0.00    0.98    7.25    0.00    0.00   36.08
05:59:05 PM    1   51.07    0.00    4.29    0.00    0.00    0.39    0.00    0.00   44.25
05:59:05 PM    2   50.49    0.00    4.87    0.00    0.00    0.19    0.00    0.00   44.44
05:59:05 PM    3   53.29    0.00    4.46    0.00    0.00    0.19    0.00    0.00   42.05

05:59:05 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
05:59:10 PM  all   49.56    0.00    4.25    0.00    0.29    2.00    0.00    0.00   43.89
05:59:10 PM    0   46.56    0.00    3.73    0.00    1.18    7.07    0.00    0.00   41.45
05:59:10 PM    1   58.12    0.00    4.31    0.00    0.00    0.39    0.00    0.00   37.18
05:59:10 PM    2   45.72    0.00    4.67    0.00    0.00    0.39    0.00    0.00   49.22
05:59:10 PM    3   47.95    0.00    4.29    0.00    0.00    0.39    0.00    0.00   47.37

05:59:10 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
05:59:15 PM  all   50.54    0.00    4.19    0.00    0.29    1.75    0.00    0.00   43.23
05:59:15 PM    0   55.36    0.00    3.70    0.00    1.17    5.85    0.00    0.00   33.92
05:59:15 PM    1   53.62    0.00    4.70    0.00    0.00    0.59    0.00    0.00   41.10
05:59:15 PM    2   46.98    0.00    4.29    0.00    0.00    0.19    0.00    0.00   48.54
05:59:15 PM    3   46.21    0.00    4.27    0.00    0.00    0.19    0.00    0.00   49.32

05:59:15 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
05:59:20 PM  all   52.78    0.00    4.48    0.05    0.39    2.14    0.00    0.00   40.17
05:59:20 PM    0   52.17    0.00    3.94    0.00    1.57    7.68    0.00    0.00   34.65
05:59:20 PM    1   52.35    0.00    4.90    0.00    0.00    0.39    0.00    0.00   42.35
05:59:20 PM    2   57.09    0.00    4.85    0.00    0.00    0.19    0.00    0.00   37.86
05:59:20 PM    3   49.42    0.00    4.23    0.00    0.00    0.38    0.00    0.00   45.96

05:59:20 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
05:59:25 PM  all   46.90    0.00    3.85    0.00    0.34    1.76    0.00    0.00   47.15
05:59:25 PM    0   48.34    0.00    3.70    0.00    1.56    6.43    0.00    0.00   39.96
05:59:25 PM    1   43.30    0.00    4.47    0.00    0.00    0.39    0.00    0.00   51.84
05:59:25 PM    2   50.59    0.00    3.52    0.00    0.00    0.39    0.00    0.00   45.51
05: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.4 731.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.9 762.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   %idle
06:57:41 PM  all   58.27    0.00    5.38    0.00    0.49    2.30    0.00    0.00   33.56
06:57:41 PM    0   61.66    0.00    4.74    0.00    1.98    8.10    0.00    0.00   23.52
06:57:41 PM    1   55.75    0.00    5.65    0.00    0.00    0.58    0.00    0.00   38.01
06: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   %idle
08:13:18 PM  all   52.45    0.00    4.60    0.00    0.10    1.27    0.00    0.00   41.58
08:13:18 PM    0   60.00    0.00    3.96    0.00    0.59    3.96    0.00    0.00   31.49
08:13:18 PM    1   50.29    0.00    5.48    0.00    0.00    0.20    0.00    0.00   44.03
08:13:18 PM    2   50.78    0.00    4.86    0.00    0.00    0.58    0.00    0.00   43.77
08:13:18 PM    3   48.83    0.00    4.28    0.00    0.00    0.19    0.00    0.00   46.69

08:13:18 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
08:13:23 PM  all   50.05    0.00    4.29    0.00    0.10    1.22    0.00    0.00   44.34
08:13:23 PM    0   57.54    0.00    4.56    0.00    0.20    3.97    0.00    0.00   33.73
08:13:23 PM    1   49.81    0.00    4.28    0.00    0.00    0.39    0.00    0.00   45.53
08:13:23 PM    2   48.16    0.00    3.88    0.00    0.00    0.39    0.00    0.00   47.57
08:13:23 PM    3   45.07    0.00    4.45    0.00    0.00    0.19    0.00    0.00   50.29

08:13:23 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
08:13:28 PM  all   51.34    0.00    4.69    0.00    0.10    1.27    0.00    0.00   42.60
08:13:28 PM    0   60.08    0.00    4.15    0.00    0.40    3.95    0.00    0.00   31.42
08:13:28 PM    1   47.75    0.00    6.07    0.00    0.00    0.39    0.00    0.00   45.79
08:13:28 PM    2   47.48    0.00    4.26    0.00    0.00    0.39    0.00    0.00   47.87
08: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?? 

?



已有 0 人發表留言,猛擊->>這里<<-參與討論


ITeye推薦