天天看點

Linux 性能監控 : CPU 、Memory 、 IO 、Network

名額

工具

cpu

usr<=70%, sys<=35%, usr+sys<=70%

top

memory

si == so == 0 可用空間>=30%

vmstat 1;free; /proc/meminfo

io

iowait% < 20%

iostat -x;

network

udp:緩沖區不擠壓, 無丢包 tcp:重傳率

netstat -lunp; netstat -su; /proc/net/snmp

1.良好狀态名額

CPU使用率:User Time <= 70%,System Time <= 35%,User Time + System Time <= 70%

上下文切換:與CPU使用率相關聯,如果CPU使用率狀态良好,大量的上下文切換也是可以接受的

可運作隊列:每個處理器的可運作隊列<=3個線程

2.監控工具

top 最常用 略

vmstat

重要參數:

r,run queue,可運作隊列的線程數,這些線程都是可運作狀态,隻不過CPU暫時不可用; b,被blocked的程序數,正在等待IO請求; in,interrupts,被處理過的中斷數 cs,context switch,系統上正在做上下文切換的數目 us,使用者占用CPU的百分比 sys,核心和中斷占用CPU的百分比 id,CPU完全空閑的百分比

上例可得:

sy高us低,以及高頻度的上下文切換(cs),說明應用程式進行了大量的系統調用;

這台4核機器的r應該在12個以内,現在r在14個線程以上,此時CPU負荷很重。

檢視某個程序占用的CPU資源<code>$ while :; do ps -eo pid,ni,pri,pcpu,psr,comm | grep</code> <code>'db_server_login'; sleep</code> <code>1; done PID NI PRI %CPU PSR COMMAND 28577</code> <code>0</code> <code>23</code> <code>0.0</code> <code>0 db_server_login 28578</code> <code>0</code> <code>23</code> <code>0.0</code> <code>3 db_server_login 28579</code> <code>0</code> <code>23</code> <code>0.0</code> <code>2 db_server_login 28581</code> <code>0</code> <code>23</code> <code>0.0</code> <code>2 db_server_login 28582</code> <code>0</code> <code>23</code> <code>0.0</code> <code>3 db_server_login 28659</code> <code>0</code> <code>23</code> <code>0.0</code> <code>0 db_server_login ……</code>

swap in (si) == 0,swap out (so) == 0

應用程式可用記憶體/系統實體記憶體 &lt;= 70%

swpd,已使用的 SWAP 空間大小,KB 為機關 free,可用的實體記憶體大小,KB 為機關 buff,實體記憶體用來緩存讀寫操作的buffer大小,KB 為機關 cache,實體記憶體用來緩存程序位址空間的 cache 大小,KB 為機關 si,資料從 SWAP 讀取到 RAM(swap in)的大小,KB 為機關 so,資料從 RAM 寫到 SWAP(swap out)的大小,KB 為機關

實體可用記憶體 free 基本沒什麼顯著變化,swapd逐漸增加,說明最小可用的記憶體始終保持在 256MB(實體記憶體大小) * 10% = 2.56MB 左右,當髒頁達到10%的時候就開始大量使用swap。

free

機關KB。可以用 -m 選項要求輸出機關為MB。

我們使用total1、used1、free1、used2、free2 等名稱來代表上面統計資料的各值,1、2 分别代表第一行和第二行的資料。

total1:表示實體記憶體總量。 used1:表示總計配置設定給緩存(包含buffers 與cache )使用的數量,但其中可能部分緩存并未實際使用。 free1:未被配置設定的記憶體。 shared1:共享記憶體,一般系統不會用到,這裡也不讨論。 buffers1:系統配置設定但未被使用的buffers 數量。 cached1:系統配置設定但未被使用的cache 數量。buffer 與cache 的差別見後面。 used2:實際使用的buffers 與cache 總量,也是實際使用的記憶體總量。 free2:未被使用的buffers 與cache 和未被配置設定的記憶體之和,這就是系統目前實際可用記憶體。

cache 和 buffer的差別:

Cache:高速緩存,是位于CPU與主記憶體間的一種容量較小但速度很高的存儲器。

由于CPU的速度遠高于主記憶體,CPU直接從記憶體中存取資料要等待一定時間周期,Cache中儲存着CPU剛用過或循環使用的一部分資料,當CPU再次使用該部分資料時可從Cache中直接調用,這樣就減少了CPU的等待時間,提高了系統的效率。

Cache又分為一級Cache(L1 Cache)和二級Cache(L2 Cache),L1 Cache內建在CPU内部,L2 Cache早期一般是焊在主機闆上,現在也都內建在CPU内部,常見的容量有256KB或512KB L2 Cache。

Buffer:緩沖區,一個用于存儲速度不同步的裝置或優先級不同的裝置之間傳輸資料的區域。

通過緩沖區,可以使程序之間的互相等待變少,進而使從速度慢的裝置讀入資料時,速度快的裝置的操作程序不發生間斷。

Free中的buffer和cache:(它們都是占用記憶體)

buffer : 作為buffer cache的記憶體,是塊裝置的讀寫緩沖區

cache: 作為page cache的記憶體,檔案系統的cache

如果 cache 的值很大,說明cache住的檔案數很多。如果頻繁通路到的檔案都能被cache住,那麼磁盤的讀IO 必會非常小。

$ cat /proc/meminfo<code>MemTotal: 15728640 kB MemFree: 116196 kB Buffers: 0 kB Cached: 13448268 kB ……</code>

這台伺服器總共有 8GB 實體記憶體(MemTotal),3GB 左右可用記憶體(MemFree),343MB左右用來做磁盤緩存(Buffers),4GB左右用來做檔案緩存區(Cached)。

用free指令也可以查到這幾個值,注意機關是kB。

iowait % &lt; 20%

提高命中率的一個簡單方式就是增大檔案緩存區面積,緩存區越大預存的頁面就越多,命中率也越高。

Linux 核心希望能盡可能産生次缺頁中斷(從檔案緩存區讀),并且能盡可能避免主缺頁中斷(從硬碟讀),這樣随着次缺頁中斷的增多,檔案緩存區也逐漸增大,直到系統隻有少量可用實體記憶體的時候 Linux 才開始釋放一些不用的頁。

sar

await表示平均每次裝置I/O操作的等待時間(以毫秒為機關)。 svctm表示平均每次裝置I/O操作的服務時間(以毫秒為機關)。 %util表示一秒中有百分之幾的時間用于I/O操作。

如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,如果await的值遠高于svctm的值,則表示I/O隊列等待太長,系統上運作的應用程式将變慢。

如果%util接近100%,表示磁盤産生的I/O請求太多,I/O系統已經滿負荷的在工作,該磁盤可能存在瓶頸。

$ iostat -x(選項 -x 用于顯示和io相關的擴充資料)

檢視哪個程序占IO:iotop,效果和top看cpu一樣。

檢視某個程序打開的檔案:/proc/${pid}/fd

對于UDP

接收、發送緩沖區不長時間有等待處理的網絡包

netstat

對于UDP服務,檢視所有監聽的UDP端口的網絡情況

RecvQ、SendQ為0,或者不長時間有數值是比較正常的。

對于UDP服務,檢視丢包情況(網卡收到了,但是應用層沒有處理過來造成的丢包)

packet receive errors 這一項數值增長了,則表明在丢包。

對于TCP(來自davidshan單衛的經驗,thx~)

對于TCP而言,不會出現因為緩存不足而存在丢包的事,因為網絡等其他原因,導緻丢了包,協定層也會通過重傳機制來保證丢的包到達對方。

是以,tcp而言更多的專注重傳率。

2、監控工具

通過snmp可以檢視各層網絡協定的收發包的情況

重傳率 = RetransSegs / OutSegs

至于這個值在多少範圍内,算ok的,得看具體的業務了。

業務側更關注的是響應時間。