整機:top
查看整機信息:top命令+uptime命令
CPU:vmstat
查看CPU:vmstat
每2秒採樣一次 一共採樣3次
procs進程信息:
- r 是運行和等待CPU時間片的進程數,原則上1核CPU的運行隊列不要超過2,整個系統的運行隊列不能超過綜合書的2倍。否則系統壓力過大。
- b 是等待資源的進程數,比如正在等待的磁盤IO、網絡IO等。
cpu信息:
- us 是用戶進程消耗CPU時間百分比,us值高,用戶進程消耗CPU時間多,如果長期大於50%,需要優化程序
- sy 是內核進程消耗的CPU時間百分比。
- 如果us + sy > 80%說明CPU可能存在不足。
- id 是處於空閒的CPU百分比
- wa 是系統等待IO的CPU時間百分比
- st 是來自於一個虛擬機偷取的CPU時間的百分比
查看所有CPU核的信息:mpstat -P ALL 【多少秒採樣一次】
查看每個進程使用的CPU的用量信息:pidstat -u 【多少秒採樣一次】 -p 【進程號】
ps -ef|grep java 查看java進程的進程號
內存:free
查看系統的內存:free -g / free -m / free (-單位)
- 應用程序可用內存/系統物理內存 > 70 % 內存充足
- 應用程序可用內存/系統物理內存 < 20 % 內存不足需要增加內存
- 兩者之間,基本夠用
查看進程內存額外信息:pidstat -p 【進程號】 -r 【採樣間隔時間】
硬盤df
查看磁盤剩餘空間數:df / df -h(換算後的結果)
磁盤IO:iostat
磁盤性能評估:iostat -xdk 2 3 (2秒採樣一次 共採樣3次)
rkB/s 每秒讀取數據量kB
wkB/s 每秒寫入數據量kB
svctm:IO請求的平均服務時間 單位ms
await:IO請求的平均等待時間 單位ms 值越小性能越好
util:一秒鐘有百分之幾的時間用於IO操作,接近100%時,磁盤帶寬跑滿,需要優化程序或增加磁盤。
如果讀寫的數據量長期比較大,一定不正常,需要優化程序的讀取。svctm的值和await的值很接近,表示幾乎沒有IO等待,磁盤性能較好。如果await的值遠高於svctm,則表示IO隊列等待時間太長,需要優化程序或更換磁盤。
網絡IO:ifstat
默認本地沒有,下載ifstat
如何處理生產環境中CPU佔用過高的問題?
- 先用top命令找出CPU佔比最高的
- ps -ef或者jps進一步定位,找到進程編號
- 定位到具體的線程或者代碼
- 將需要的線程ID轉換爲16進制
- jstack 進程ID | grep tid(16進制英文小寫的線程ID) -A60
命令:ps -ef|grep java|grep -v grep找到進程
命令:ps -mp 進程編號 -o THREAD,tid,time
參數:
- -m:顯式所有的線程
- -p:pid進程使用cpu的時間
- -o:該參數後是用戶自定義的想要查詢的字段
找到進程5556中的線程5557,5557的十六進制15b5
命令:jstack 線程號 | grep tid(16進制線程號) -A60
-A60 打印出前60行
定位到Demo1.java程序中有問題的行號是6