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 著