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

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

本文重點講下vmstat的用法,其餘如top不作講解,基本上vmstat的報告能看到,top的也差很少。top報告若有不懂得地方,能夠man topios

1、vmstat用法
  vmstat命令主要用於查看虛擬內存的,可是也能夠查看系統其餘資源的使用狀況,如CPU緩存

vmstat [interval] [count]多線程

vmstat選項app

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

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

[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

2、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 任務當前使用的可用物理內存比例。

相關文章
相關標籤/搜索