1. 程式人生 > >Java效能優化之作業系統層面優化

Java效能優化之作業系統層面優化

目前常用的作業系統分為:windows,Unix(Linux),我們會分別介紹在不同系統上的調優。

一,概念

效能監控:一種以非侵入方式收集或檢視應用執行效能資料的活動,通常是指在生產,質量評估, 開發環境中實施的帶有預防或主動性的活動。

效能分析:一種以侵入方式收集執行效能資料的活動,會影響應用的吞吐量或響應性。

效能調優:一種為改善應用響應性或吞吐量而更改引數,原始碼或屬性配置的活動。

CPU:中央處理器,從記憶體中獲取資料然後進行計算的處理單元,

CPU使用率:分為使用者態CPU使用率和系統態CPU使用率,使用者態CPU使用率是指執行應用程式程式碼的時間佔總CPU時間的百分比,系統態CPU指應用執行作業系統呼叫的時間佔用總CPU的時間的百分比。例如I/O裝置之間的互動教師使用系統態CPU,所以我們想要的結果是系統態的CPU的使用率為0%,即降低系統態CPU的使用率

CPI:(Cycle Per instruction):每條指令執行時所花費的平均時鐘週期數。(時鐘週期:也為震盪週期,定義為時鐘脈衝的倒數,是計算機中最基本,最小的時間單位,在一個時鐘週期內,CPU僅完成一個最基本的動作,例如1MHZ的時鐘頻率,則時鐘週期為1us,對計算機來說,時鐘頻率越高,計算機的工作速度就越快)(指令週期:執行一條指令所需的時間,指令不同,所需的週期數也不同)。

二,監控CPU的使用率:

WINDOWS:

工作管理員

上面有CPU的使用率,記憶體的使用率,程序數,執行緒,CPU的執行速度等

Performance Monitor(效能監視器)

不同版本的WINDOWS上的效能監視器是不同的,效能監視器使用了效能物件的概念,效能物件分為網路,記憶體,處理器,執行緒,程序,網路介面,邏輯磁碟等,每一類都含有特定的效能屬性或計數器。可以作為監控的效能統計資料。

紅線表示程序資訊,效能監視器的滑動串列埠預設顯示最近60秒的效能統計資料,可在圖形介面點選右鍵,設定一些屬性。

可以手動的新增各種效能物件,通過在影象區域點選右鍵-》選擇新增計數器-》選擇計數器Processor物件,選擇計數器%User time表示使用者態CPU使用率,選擇計數器%Privileged Time表示系統態CPU使用率,點選Add -》確定。

命令列工具:typeperf

typeperf可以在命令終端執行,也可以寫在指令碼語句中,寫法:

typeperf "\Processor(_Total)\%User Time" 

Linux:

監控命令:

gnome-system-monitor:

vmstat:

[[email protected] network-scripts]$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0  60936  81388     36 203572    1   11   211    13  116  123  0  1 96  2  0

vmstat顯示所有虛擬處理器的總CPU使用率,vmstat命令列可以設定報告的時間間隔,如果不指定vmstat的報告間隔,則輸出系統最近一次啟動以來的總CPU的使用率。us是使用者態CPU使用率,sy是系統態CPU使用率,id是空閒率或CPU可用率。

mpstat:

[[email protected] network-scripts]$ mpstat
Linux 3.10.0-862.el7.x86_64 (localhost.localdomain) 	12/12/2018 	_x86_64_	(4 CPU)

03:33:50 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:33:50 AM  all    0.42    0.00    0.86    2.06    0.00    0.04    0.00    0.00    0.00   96.62

top命令:

不僅包括CPU的使用率,也包括程序統計資料和記憶體使用率,

CPU的排程程式執行佇列

監控CPU排程程式執行佇列對於分辨系統是否滿負荷有很重要的意義,執行佇列中就是已經準備好執行,正在等待可用CPU的輕量級程序。如果準備執行的程序數量過多,就是導致排程佇列過長,則系統有可能已經飽和。

一般原則:如果在很長一段時間裡,執行佇列的長度一直都超過虛擬處理器個數的1倍,就需要注意,如果執行佇列的長度超多虛擬處理器個數的3-4倍或更高,則需要立刻採取行動。

解決佇列過長的兩種方法:⑴增加CPU以分擔負載或減少處理器的負載量⑵分析系統中執行的應用,改進CPU使用率,即減少應用執行所需CPU週期的方法,如減少垃圾收集器的頻率,或使用更少的CPU指令演算法來實現相同的功能。

WINDOWS:

通過在效能監視器圖中-》右鍵-》新增計數器-》system->Processor Queue Length-》確定。

當然也可以使用typeperf命令來監視執行佇列的長度。

Linux:

使用vmstat命令可以監控執行佇列的長度,vmstat輸出的第一列是執行佇列長度,值是執行佇列中輕量級程序的實際數量。

[[email protected] ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0  43528  61980     36 240280    0    9   271    21   96   91  0  1 96  2  0

監控鎖競爭:

Java5以上的鎖優化機制。執行緒通過忙迴圈自旋嘗試獲取鎖,如果若干次忙迴圈自旋後仍然沒有成功,則掛起該執行緒,等待被喚醒再次嘗試獲取該鎖。掛起和喚醒執行緒會導致作業系統的讓步式上下文切換,因此鎖競爭嚴重的應用程式會表現出大量的讓步式上下文切換,Solaris上可以通過mpstat的csw列監控上下文切換,它是上下文切換的總和。icsw列是搶佔式上下文切換,因此讓步式上下文切換的次數是csw-icsw.讓步式上下文切換耗時的時鐘週期代價非常高,通常高達80000個時鐘週期。

對於任何Java應用來說,如果讓步式上下文切換佔去它5%或者更過時鐘週期,說明可能遇到鎖競爭,估算讓步式上下文切換:mpstat間隔內的執行緒上下文csw減去搶佔式上下文(icsw),乘80000,除以間隔內總的時間週期。

監控網路I/O使用率:

WINDOWS:

在效能監視器中,通過新增效能計數器就可以,效能物件為Network Interface/Bytes Total/sec獲得,萬用字元*表示報告的是系統所有網路介面的總頻寬。也可以使用typeperf \Network Interface(*)\Bytes Total/sec檢視網路介面名。然後用想要打算監控的網路介面替換萬用字元*。

檢視網路頻寬可以新增Network Interface/Current Bandwidth物件,檢視網路的頻寬

硬碟I/O的使用率:

硬碟I/O可以看做是磁碟使用情況有用的監控資料,Linux和Solaris可以使用iostat來監控系統的磁碟使用情況。Linux可以使用iostat -xm監控磁碟I/O使用率和系統態CPU使用率。

[[email protected] ~]# iostat -xm 
Linux 3.10.0-862.el7.x86_64 (localhost.localdomain) 	12/12/2018 	_x86_64_(4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.36    0.00    0.80    2.08    0.00   96.76

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.87     9.86   20.22    0.64     1.06     0.05   109.22     0.53   25.25   25.48   18.06   3.41   7.12
scd0              0.00     0.00    0.02    0.00     0.00     0.00    72.41     0.00   49.83   49.83    0.00  40.90   0.07
dm-0              0.00     0.00   19.85    0.56     1.05     0.01   106.59     0.53   25.84   26.25   11.10   3.44   7.03
dm-1              0.00     0.00    1.04    9.94     0.01     0.04     8.21     0.58   52.69   11.14   57.03   0.27   0.30

[[email protected] ~]# 

sda磁碟的使用率為 7.12%,系統態CPU為0.8%,使用者態CPU0.36%。

 

參考《Java 效能優化權威指南》    Charlie Hunt  Binu John 著