操作系統性能監控之內存監控
服務端程序除了應用本身性能外,依賴與服務器本身的性能。服務器性能指標包括:CPU、內存、網絡IO和磁盤使用率。
今天學習了內存監控的部分。
為什麽要監測內存
當應用運行所需內存超過可用物理內存時,就會發生頁面交換。通常會在硬盤上分配一個swap空間。當應用耗盡可用內存時,就會把不常用的內容放到swap空間裏。 當訪問被置換到swap空間的內容時,就需要把swap空間的內容加載到物理內存中,這種置換操作會大大影響應用的吞吐量和響應性。
JVM垃圾收集器在進行置換操作時,性能也很差。垃圾收集器為了回收不可達對象,需要大量訪問內存。如果java堆的一部分被置換出去,就必須先置換進來,在掃描存活對象,這會增加GC的時間。GC會造成jvm停頓。
監測內存使用率
[root@Hwseeker-Adx02 ~]# vmstat
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 4030152 1427780 1159168 87874912 0 0 1 15 0 0 4 1 94 0 0
其中si、so可以看到swap操作,free代表可用內存數。如果si和so很大,就代表發生了內存置換。
監控鎖競爭
定義幾個概念
讓步試上下文切換:是指線程主動釋放CPU
搶占式上下文切換:線程因為分配的時間片用盡被迫放棄CPU或被優先級更高的線程搶占,而失去執行機會
Java HotSpot VM從1.5開始,增加了鎖機制優化。線程通過忙循環自旋嘗試獲得鎖,如果若幹次自旋後,沒有獲取成功,則掛起線程,等待喚醒後再次嘗試獲取。掛起和喚醒線程會導致讓步試上線文切換。
讓步試上下文切換耗費CPU時鐘非常嚴重,通常高達80000個時鐘周期
主頻為3GHz的處理器每秒鐘可用時鐘周期為3,000,000,000
搶占式上下文切換監控
[root@dmp002 ~]# pidstat -w -I -p 29064 Linux 2.6.32-573.el6.x86_64 (dmp002.tiger.local) 2018年01月25日 _x86_64_ (24 CPU) 18時34分45秒 PID cswch/s nvcswch/s Command 18時34分45秒 29064 3500 0.02 java
可以用top命令,獲取pid
pidstat -w顯示系統每秒發生3500個上下文切換。處理器為3Ghz雙核Intel CPU。因此虛擬處理器上下文切換為3500/2=1750,耗費的始終周期為1750*8000=140,000,000。3Ghz每秒鐘周期數為3,000,000,000。浪費的始終周期為140,000,000/3,000,000,000=4.7%。
讓步時鐘周期占用超過3%,表明Java應用正面臨鎖競爭
本博文內容為《Java性能優化權威指南》的讀書筆記整理而來
操作系統性能監控之內存監控