1. 程式人生 > >Linux 檢視 cpu, mem, disk 和 network 資訊

Linux 檢視 cpu, mem, disk 和 network 資訊

對於一個 Linux 伺服器來說,cpu 的主頻以及佔用率,記憶體的大小以及佔用率,磁碟 I/O 速率和網絡卡 I/O 速率極大地影響著伺服器的效能。在 Linux 系統下,開發者提供了/proc 檔案系統來提供系統相關的程序資訊

1.檢視 cpu 主頻和佔用率

Linux 下 CPU 的主頻有兩種獲取方式,一種是通過讀取 /proc/cpuinfo 檔案,另外一種是利用 CPU 主頻的計算原理編寫程式獲取。此處只介紹前一種方式。即使用命令 cat /proc/cpuinfo 。從下方圖片可以看到,本人的電腦是雙核 CPU,主頻都為 2.60GHz。

Lance# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 23
model name      : Pentium(R) Dual-Core  CPU      E5300  @ 2.60GHz
stepping        : 10
microcode       : 0xa0b
cpu MHz         : 1200.000
cache size      : 2048 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl cpuid aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm xsave lahf_lm pti tpr_shadow vnmi flexpriority dtherm
bugs            : cpu_meltdown spectre_v1 spectre_v2
bogomips        : 5186.86
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 23
model name      : Pentium(R) Dual-Core  CPU      E5300  @ 2.60GHz
stepping        : 10
microcode       : 0xa0b
cpu MHz         : 1200.000
cache size      : 2048 KB
physical id     : 0
siblings        : 2
core id         : 1
cpu cores       : 2
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl cpuid aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm xsave lahf_lm pti tpr_shadow vnmi flexpriority dtherm
bugs            : cpu_meltdown spectre_v1 spectre_v2
bogomips        : 5186.86
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

Linux 下 CPU 的使用狀態可分為使用者態、系統態以及空閒態。CPU 佔用率可以用如下公式計算

                            CPU佔用率 = CPU執行非系統空閒程序時間/CPU執行總時間

/proc/stat 檔案對 CPU 的使用情況進行了實時的記錄,如下圖所示:

Lance# cat /proc/stat
cpu  525228 16439 390034 139932703 224352 0 2010 0 0 0
cpu0 265224 6822 197250 70017169 60063 0 74 0 0 0
cpu1 260004 9617 192784 69915534 164289 0 1936 0 0 0
intr 126884204 43 2 0 0 0 0 0 1 0 3 0 0 4 0 0 0 124 0 2 1404563 0 0 0 0 955106 514 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 193899569
btime 1536131324
processes 268172
procs_running 1
procs_blocked 0
softirq 101783843 10 36600014 116255 1002291 1058479 0 263 35993177 0 27013354

其中首行的 10 個引數含義如下:

user    nice    system  idle    iowait  irq softirq steal   guest   guest_nice
user:使用者態的CPU時間
nice:低優先順序程式所佔用的使用者態的cpu時間。
system:系統態的CPU時間
idle:CPU空閒的時間
iowait:等待IO響應的時間
irq:處理硬體中斷的時間
softirq:處理軟中斷的時間
steal: 處理其他所花的時間
guest:執行時間為客戶作業系統下的虛擬CPU控制
guest_nice:

訪客的低優先順序程式所佔用的使用者態的cpu時間

餘下的引數中:

intr: 第一個引數表示的是自系統啟動以來,發生的所有中斷的次數;其他的數對應一個特定中斷髮生的次數

ctxt: cpu自系統啟動以來發生的上下文交換次數

btime: 系統啟動到現在的時間 UTC 秒

processes: 表示系統啟動以來建立的程序個數

procs_running: 當前執行程序的個數

procs_blocked: 當前被阻塞的程序個數

softirq: 顯示軟中斷情況

要計算 CPU 在某段時間內的佔用率,可以分別記錄下 t1 和 t2 時刻的 CPU 總的狀態和空閒狀態,因此:

                            CPU佔用率 = 1 - ( idle2 - idle1 ) / (total2 - total1)

其中 total 表示 10 個引數之和。

2. 檢視記憶體大小及佔用率

/proc/meminfo 記錄了記憶體資訊。

Lance# cat /proc/meminfo
MemTotal:        4003752 kB
MemFree:          517464 kB
MemAvailable:    3144816 kB
Buffers:          257152 kB
Cached:          2289308 kB
SwapCached:            0 kB
Active:          1455916 kB
Inactive:        1487740 kB
Active(anon):     277376 kB
Inactive(anon):   174624 kB
Active(file):    1178540 kB
Inactive(file):  1313116 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       6253564 kB
SwapFree:        6253564 kB
Dirty:                 8 kB
Writeback:             0 kB
AnonPages:        395168 kB
Mapped:           207872 kB
Shmem:             54808 kB
Slab:             460364 kB
SReclaimable:     425200 kB
SUnreclaim:        35164 kB
KernelStack:        5376 kB
PageTables:        22064 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8255440 kB
Committed_AS:    2553704 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:      2048 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      113216 kB
DirectMap2M:     4044800 kB

其中:

MemTotal:表示系統可支配記憶體

MemAvailable:表示應用程式可用的記憶體

因此,記憶體佔用率可以用如下公式計算:

                                  MEMU sedPerc = (MemTotal - MemAvailable)/MemTotal

3.檢視磁碟 I/O佔用率

安裝 sysstat 工具,它的子工具 iostat 可以顯示 I/O 佔用率。%util 引數表示 1s內用於 I/O 請求所用時間的比例,%util 值越高,I/O 佔用率越高,可直接使用這個引數來代表 I/O 佔用率

Lance# iostat -x
Linux 4.13.0-32-generic (Lance)         2018年09月13日  _x86_64_        (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.37    0.01    0.28    0.16    0.00   99.17

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
loop0            0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00   21.41    0.00   0.00     2.44     0.00  20.89   0.00
loop1            0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00   44.62    0.00   0.00     1.69     0.00  11.38   0.00
loop2            0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00   19.93    0.00   0.00     9.65     0.00  12.31   0.00
loop3            0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00   41.81    0.00   0.00    14.23     0.00  18.88   0.00
loop4            0.01    0.00      0.01      0.00     0.00     0.00   0.00   0.00    6.61    0.00   0.00     1.12     0.00   0.50   0.00
loop5            0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     1.60     0.00   0.00   0.00
sda              0.24    0.52      3.45     14.18     0.17     0.56  41.05  51.90    3.56   31.99   0.02    14.40    27.51   4.51   0.34

4. 檢視網路頻寬使用率

/proc/net/dev 檔案中記錄了網路相關的使用情況,其中分別記錄了傳送和接收的資料包總數、收發的錯誤包數以及收發的丟失包數等。取單位時間內傳送和接 收 的 數 據 包 總 包 數 ( totalPackets ), 除 以 網 絡 的 基 本 帶 寬 ( bandWidth ),
                                  pnet = 100%*totalPackets/bandWidth

Lance# cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo: 2729345   46942    0    0    0     0          0         0  2729345   46942    0    0    0     0       0          0
enp2s0: 558026941  723202    0 11733    0     0          0    105753 23827630  275738    0    0    0     0       0          0

bytes: 介面傳送或接收的總位元組數

packets: 介面傳送或接收的總資料包數

errs: 有裝置驅動程式檢測到的傳送或者接收錯誤的總數

drop: 裝置驅動程式丟棄的資料包總數

fifo: FIFO 緩衝區錯誤的數量

frame: 分組幀錯誤的數量

colls: 介面上檢測到的衝突數

compressed: 裝置驅動程式傳送或接收的壓縮資料包數

carrier: 由裝置驅動程式檢測到的載波損耗的數量

multicast: 裝置驅動程式傳送或接收的多播幀數