《Linux系統CPU的性能監控及調優》要點:
本文介紹了Linux系統CPU的性能監控及調優,希望對您有用。如果有疑問,可以聯系我們。
性能優化是一個老生常談的話題,典型的性能問題如頁面響應慢、接口超時,服務器負載高、并發數低,數據庫頻繁死鎖等.尤其是在“糙快猛”的互聯網開發模式大行其道的今天,隨著系統拜訪量的日益增加和代碼的臃腫,各種性能問題開始紛至沓來.在系統層面能夠影響應用性能的一般包括三個因素:CPU、內存和IO,今天,我們先談談CPU性能的監控以及調優.
當程序響應變慢的時候,首先使用top、vmstat、ps等命令查看系統的cpu使用率是否有異常,從而可以判斷出是否是cpu繁忙造成的性能問題.其中,主要通過us(用戶進程所占的%)這個數據來看異常的進程信息.當us接近100%甚至更高時,可以確定是cpu繁忙造成的響應緩慢.一般說來,cpu繁忙的原因有以下幾個:
線程中有無限空循環、無阻塞、正則匹配或者單純的計算
頻繁的gc
多線程頻繁的上下文切換
top命令
top命令
對于多個或多核cpu,上面的顯示則會是多個cpu所占用的百分比總合.如需查看每個核的消耗情況,可在進入top視圖后按1,就會按核來顯示cpu的使用情況,如上圖.
us 表示用戶進程處理所占的百分比
sy 表示為內核線程處理所占的百分比
ni 表示被nice命令改變優先級的任務所占的百分比
id 表示cpu的空閑時間所占的百分比
wa 表示為在執行過程中等待io所占的百分比
hi 表示為硬件中斷所占的百分比
si 表示為軟件中斷所占的百分比
st 表示虛擬cpu等待實際cpu的時間的百分比
vmstat
vmstat命令
in 每秒CPU的中斷次數,包含時間中斷
cs 每秒上下文切換次數,這個值要越小越好,太大了,要考慮調低線程或者進程的數目.每次調用系統函數,我們的代碼就會進入內核空間,導致上下文切換,這個是很耗資源,也要盡量避免頻繁調用系統函數.上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU干正經事的時間少了,CPU沒有充分利用,是不可取的.
us 用戶CPU時間.
sy 系統CPU時間,如果太高,表示系統調用時間長,例如是IO操作頻繁.
id 空閑 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閑CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率.
wt 等待IO CPU時間.
gstat -gcutil
如果發現是Java進程CPU占用過高,可以使用這個命令查看進程是不是正在頻繁GC,如下圖所示.
jstat命令
S0 — Heap上的 Survivor space 0 區已使用空間的百分比
S1 — Heap上的 Survivor space 1 區已使用空間的百分比
E — Heap上的 Eden space 區已使用空間的百分比
O — Heap上的 Old space 區已使用空間的百分比
P — Perm space 區已使用空間的百分比
YGC — 從應用程序啟動到采樣時發生 Young GC 的次數
YGCT– 從應用程序啟動到采樣時 Young GC 所用的時間(單位秒)
FGC — 從應用程序啟動到采樣時發生 Full GC 的次數
FGCT– 從應用程序啟動到采樣時 Full GC 所用的時間(單位秒)
GCT — 從應用程序啟動到采樣時用于垃圾回收的總時間(單位秒)
根據上面提供的幾個常用命令,定位到問題以后,就可以根據具體問題分析其產生的原因了.
CPU瓶頸表現在兩個方面:用戶態CPU瓶頸和系統態CPU瓶頸.運行操作系統內核以外的軟件時導致的瓶頸為用戶態CPU瓶頸,運行操作系統內核的時候導致的瓶頸為系統態CPU瓶頸.用戶態CPU和系統態CPU時間比率在3:1到4:1之間是正常的.如果在有瓶頸的系統中,用戶和系統時間比率高于這個區間,就應該分析用戶態CPU時間增加的原因.
us過高
當us值過高時,表示運行的應用消耗了大部分的cpu.在這種情況下,對于java應用而言,最重要的是找到具體消耗cpu的線程所執行的代碼,可以采用如下辦法.
1.使用gstat -gcutil查看JVM是否頻繁的進行GC.
2.如果根據gcutil查看,GC并不頻繁,請根據《當CPU飆高時,它在做什么》提供的方式,查看CPU在執行什么代碼,來定位問題.
sy過高
當sy值過高時,使用vmstat來查看線程切換次數.很可能是linux花費了更多的時間在進行線程切換.java應用造成這種現象的主要原因是啟動的線程比較多, 且這些線程多處于不斷的阻塞(例如鎖等待,io等待)和執行狀態的變化過程中,這就導致了操作系統要不斷的切換執行的線程, 產生大量的上下文切換.在這種情況下,對java應用而言,最重要的是找出不斷切換狀態的原因, 可采用的辦法為通過kill -3 pid 或jstack -l pid的辦法dump出java應用程序的線程信息,查看線程的狀態信息以及鎖信息, 找出等待狀態或鎖競爭過多的線程.
設置程序執行的優先級
可以使用nice和renice設置程序執行的優先級.
格式:nice [-n 數值] 命令nice 指令可以改變程序執行的優先權等級.指令讓使用者在執行程序時,指定一個優先等級,稱之為 nice 值. 這個數值從最高優先級的-20到最低優先級的19.負數值只有 root 才有權力使. 一般使用者,也可使用 nice 指令來做執行程序的優先級管理,但只能將nice值越調越高.
使用ulimit限制cpu占用時間
注意,ulimit 限制的是當前shell進程以及其派生的子進程.因此可以在腳本中調用ulimit來限制cpu使用時間. 例如,限制tar的cpu占用時間,單位秒.
ulimit -SHt 100 tar test.tar.gz test
如果tar占用時間超過了100秒,tar將會退出,這可能會導致打包不完全,因此不保舉使用ulimit對cpu占用時間進行限制. 另外,通過修改系統的/etc/security/limits配置文件,可以針對用戶進行限制.
使用程序自帶的對cpu使用調整的功能
某些程序自帶了對cpu使用調整的功能,比如nginx服務器,通過其配置文件,可以為工作進程指定cpu,如下:
worker_processes 4;
這里0001 0010 0100 1000是掩碼,分別代表第1、2、3、4顆cpu核心,這就使得cpu的使用比擬平均到每個核心上.
使用Nginx時,這種優化方式是比擬常見的.
《Linux系統CPU的性能監控及調優》是否對您有啟發,歡迎查看更多與《Linux系統CPU的性能監控及調優》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7847.html