Linux CPU性能分析與監控——vmstat、top


Linux性能監控工具匯總:
- iostat 磁盤性能監控
- vmstat 虛擬內存性能監控、CPU監控(進程上下文切換、CPU利用率)
- top 系統負載、CPU使用率、各個進程的詳細報告(CPU使用率、內存使用情況)等
- free 內存使用情況。
- ps ps命令不算是性能監控工具,但是可以使用ps配合上述命令,找到占有系統資源較高的進程

本文重點講下vmstat的用法,其他如top不做講解,基本上vmstat的報告能看到,top的也差不多。top報告如有不懂得地方,可以man top

一、vmstat用法
  vmstat命令主要用於查看虛擬內存的,但是也可以查看系統其他資源的使用情況,如CPU

vmstat [interval] [count]

vmstat選項

-a 顯示活躍內存(active)和非活躍內存(inact)
-f 顯示從系統啟動至今的fork數量
-m 顯示slabinfo
-s 靜態顯示內存相關信息

首先運行一個默認命令, 根據輸出結果,解釋下各個字段的含義,有助於下面的分析。

[root@master ~]# 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 0 431340 44840 211744 0 0 5 2 149 9 2 4 95 0 0

[root@minion ~]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
1 0 0 757496 64916 83772 0 0 85 7 56 42 1 3 96 0 0

各個字段對應的項含義如下
procs

- r 正在等待運行的進程數
- b 在uninterruptible 睡眠中的進程數

memory

- swpd 以使用的swap空間
- free 剩余的物理內存
- buff buffer
- cache cache
- inact 非活動的內數量(-a選項)
- active 活動的內存的數量(-a選項)

swap
- si 從磁盤交換的內存大小
- so 交換到磁盤的內存大小

io

- bi 從塊設備接收的塊(block/s)
- bo 發送給塊設備的塊(block/s).如果這個值長期不為0,說明內存可能有問題,因為沒有使用到緩存(當然,不排除直接I/O的情況,但是一般很少有直接I/O的)

system

- in 每秒的中斷次數,包括時鍾中斷
- cs 進程上下文切換次數

cpu

- us 用戶進程占用CPU時間比例
- sy 系統占用CPU時間比例
- id CPU空閑時間比
- wa IO等待時間比(IO等待高時,可能是磁盤性能有問題了)
- st steal time

二、CPU篇
2.1 監控指標
CPU利用率。根據經驗來看,用戶空間進程占用CPU比例在 65-70%之間,內核(系統)CPU比例在30%-35%之間,空閑比例在0%-5%之間。一般不能超過這個比例,超過這個比例,系統性能就會降低,平均負載升高,這點將會在下面的測試中看到。
進程上下文切換。上下文切換和CPU利用率應該聯系起來,如果CPU利用率低,那么上下文切換稍高點也能接受。上下文切換也是需要消耗CPU資源的,頻繁的切換必將使得CPU利用率升高。
運行隊列中等待運行的進程數。每個CPU核心中等待處理的進程數不應該超過3個線程/進程。如4核心的機器,那么隊列的最大值應該不超過12個。
平均負載。平均負載值是平均每核心CPU的負載應該控制在0.7。最好不要超過1.

  一般,我是使用top命令和vmstat命令一起看,top命令可以看到整體情況,也可以看到每個任務消耗資源的情況。使用vmstat命令查看隊列中的任務書、進程上下文切換。

下面是一個CPU密集型程序,采用多線程(20個線程)去循環將一個全局變量+1.
這個程序如下

#!/usr/bin/python

import threading

count = 0

class Test(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)

def run(self):
global count
for i in xrange(1,100000000): #100000000
count += 1
print count
if __name__ == '__main__':
threads = []
for i in range(10):
thread = Test()
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
print count

2.2 程序運行前
  我在程序運行前使用top命令和vmstat命令查看相關報告

vmstat報告
[root@master ~]# vmstat 2 10
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 0 432696 43672 211724 0 0 6 2 148 715 2 4 94 0 0
0 0 0 432688 43672 211724 0 0 0 0 20 17 0 0 100 0 0
0 0 0 432688 43672 211724 0 0 0 0 16 17 0 0 100 0 0
0 0 0 432432 43672 211724 0 0 0 0 54 43 0 1 99 0 0
0 0 0 432400 43672 211724 0 0 0 0 38 37 0 0 100 0 0
0 0 0 432376 43672 211724 0 0 0 0 88 65 0 1 99 0 0
0 0 0 432120 43672 211724 0 0 0 0 49 35 0 1 99 0 0
0 0 0 432152 43672 211724 0 0 0 0 31 28 0 0 99 0 0
0 0 0 432152 43672 211724 0 0 0 0 29 26 0 0 100 0 0
0 0 0 432152 43672 211724 0 0 0 0 15 16 0 0 100 0 0

top報告
[root@master ~]# top
top - 12:11:37 up 7:07, 3 users, load average: 0.00, 0.00, 0.02
Tasks: 114 total, 1 running, 113 sleeping, 0 stopped, 0 zombie
Cpu0 : 1.8%us, 3.3%sy, 0.0%ni, 94.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 1.3%us, 3.8%sy, 0.0%ni, 94.8%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 1004412k total, 573856k used, 430556k free, 45160k buffers
Swap: 2047992k total, 0k used, 2047992k free, 211748k cached

  根據top報告和vmstat報告,我們完全可以得出結論——系統性能良好。因為各個指標的值都不高

2.3 程序運行時
vmstat報告
[root@master ~]# vmstat 2 10
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
21 0 0 423072 43640 211724 0 0 6 2 142 506 2 4 95 0 0
20 0 0 423064 43640 211724 0 0 0 0 2085 78125 26 73 1 0 0
20 0 0 423064 43640 211724 0 0 0 0 2038 79752 24 74 1 0 0
20 0 0 423064 43640 211724 0 0 0 0 2057 78022 25 74 1 0 0
20 0 0 423064 43640 211724 0 0 0 0 2045 85145 25 73 2 0 0
20 0 0 423032 43640 211724 0 0 0 12 2002 68602 25 73 2 0 0
20 0 0 422908 43640 211724 0 0 0 0 2065 79101 25 73 1 0 0
20 0 0 422908 43640 211724 0 0 0 0 2048 78424 26 73 1 0 0
10 0 0 422940 43640 211724 0 0 0 0 2039 69779 22 76 2 0 0
21 0 0 422940 43640 211724 0 0 0 0 2050 81712 26 73 2 0 0

top報告
[root@master ~]# top
top - 10:55:10 up 5:51, 3 users, load average: 15.01, 11.58, 6.21
Tasks: 115 total, 1 running, 114 sleeping, 0 stopped, 0 zombie
Cpu0 : 27.8%us, 72.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 22.2%us, 77.8%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1004412k total, 581836k used, 422576k free, 43656k buffers
Swap: 2047992k total, 0k used, 2047992k free, 211724k cached

  運行時的情況看起來就十分不好了。我重點關注了這幾個值:
top報告分析
- load average: 15.01, 11.58, 6.21
- %sys: 都已經達到了70%以上
- id% 都是 0

vmstat報告分析
- r 運行隊列中等待的線程/進程基本上都是20左右
- cs 上下文切換每秒80000次左右

從上述分析中可以看出,系統系能已經很差了。這里我嘗試做一個分析,為什么系統占用CPU的利用率這么高?我認為是程序運行時的進程上下文頻繁切換所導致的,這是因為進程/線程的調度室通過內核子系統進程調度程序來調度的,頻繁的切換說明進程調度程序也是十分頻繁的的占用CPU,因此導致系統占用CPU的時間很高;此外,系統調用也是耗費了一部分時間的。因此系統占用CPU的比例很高,而用戶空間進程占有CPU的比例相對就低了很多。系統就是給用戶提供服務的,如果大部分資源都被系統給占用,那這個用戶還能做什么工作呢?

補充top 字段含義:

%hi , IRQ。如果這個值不均衡,則說明沒有設置中斷均衡。設置方法可參考我之前的文章多隊列網卡中斷均衡

- %si soft IRQ,即軟中斷
- PR 優先級
- NI nice值
- VIRT virtual image(kb)
- RES Resident size。已使用的非swap物理內存
- SHR 共享內存大小(kb)
- %CPU 占總CPU時間的百分比。這個值是和上次更新至現在的CPU使用率。如top命令3秒更新一次數據,那這個值就是這個3秒內的CPU使用率
- %MEM 任務當前使用的可用物理內存比例。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM