經過shell獲取Linux服務器CPU、內存、網絡等基礎項監控

經過shell獲取Linux服務器CPU、內存、網絡等基礎監控node

一、獲取系統(CPU)負載shell

系統平均負載的定義:在特定時間間隔內運行隊列中的平均進程數。緩存

如何獲取系統(CPU)負載?bash

Linux系統中能夠經過/proc/loadavg文件獲取,其中各項參數含義解釋:服務器

   0.11 0.09 0.06 2/263 10982


  前三個數字分別表示:一、五、15分鐘的系統負載(或者叫平均進程數), 第四個相似分數形勢的分別表示正在運行的進程數和系統當前總的進程數,最後一個數字表示的最近一個運行進程的ID。網絡

  若是咱們想要獲取咱們當前系統的CPU負載使用狀況能夠經過下邊的shell命令獲取:ide

   cat /proc/loadavg | awk ‘{print $1,$2,$3}’

除了經過查看/proc/loadavg獲取系統的負載,還可使用Linux下的uptime、w、top等命令來獲取,當使用這些命令時,輸出結果中都會有load average字樣,那麼後邊跟的三個數字就是當前系統在一、五、15分鐘內的平均負載。性能

通常來講當每一個CPU的當前進程數(運行隊列長度)持續大於1,就須要開始調查引發問題的緣由了,若是每一個CPU的任務數持續大於3,就須要完全檢查解決這個問題了,由於這個時候任何一個進程運行時都不能立馬獲得CPU的響應。若是每一個CPU的任務數大於5,那麼就說明你的服務出現了嚴重問題,若是不及時處理,可能會致使宕機。spa

二、獲取CPU使用率接口

CPU使用率是指當前運行的程序(進程)佔用的CPU資源狀況,也就是說CPU利用率是一個程序佔用一個CPU處理器多少時間的百分比。在Linux/Unix下,CPU利用率又分爲用戶態、系統態和空閒態,分別用來表示CPU處於用戶態執行的時間、系統內核執行的時間和空閒系統進程的時間。在一般咱們所說的CPU利用是指:CPU執行非系統空閒進程的時間/CPU總的執行時間。

   不要與CPU負載混淆,CPU利用率和CPU負載在必定程度上都能用在衡量一個服務器的資源使用狀況,但CPU負載和CPU使用率之間沒有絕對的關聯關係,更不能混爲一談,關於CPU負載(系統負載)的概念在上節中已經說明。

如何獲取CPU使用率?

Linux系統中能夠經過/proc/stat文件來計算CPU的使用率。其中各項參數說明:

cpu  13020415 2752 14585234 1898039188 5345 0 46019 0 0 0
cpu0 3212795 820 3641656 474590184 756 0 9239 0 0 0
cpu1 3285261 628 3634202 474396971 3220 0 8799 0 0 0
cpu2 3388112 637 3695487 474389928 420 0 3115 0 0 0
cpu3 3134246 665 3613888 474662103 947 0 24864 0 0 0
intr 4669596224 155 10 0 0 0 0 2 0 1713 0 0 0 16 0 0 4715099 0 535144 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8955035 7121118 7194150 7163302 0 1739264 7 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 4454886169
btime 1524214872
processes 3187040
procs_running 1
procs_blocked 0
softirq 1113211729 0 591606805 1931306 31654758 2851576 0 4047 296149644 0 189013593


以個人機器爲例:

就拿第一行來講:

   cpu  13020415 2752 14585234 1898039188 5345 0 46019 0 0 0


第一個字段(cpu)是cpu標識。

第二個字段(13020415)表示是從系統啓動開始一直到當前時刻,進程在用戶態(user)下執行的時間積累。

第三個字段(2752)表示是從系統啓動開始一直到當前時刻,nice值爲負的進程所佔用的CPU時間。

第四個字段(14585234)表示是從系統啓動開始一直到當前時刻,進程在系統內核(system)的執行時間積累。

第五個字段(1898039188)表示是從系統啓動開始一直到當前時刻,處硬盤IO等待之外其餘的空閒時間(idle)積累。

第六個字段(5345)表示是從系統啓動開始一直到當前時刻,IO等待(iowait)的時間積累。

第七個字段(0)表示是從系統啓動開始一直到當前時刻,硬中斷的時間(irq)。

第八個字段(46019)表示是從系統啓動開始一直到當前時刻,軟中斷的時間(softirq)。

剩下的幾行:

intr: 給出的是中斷信息,第一個數爲自系統啓動以來,發生的全部中斷的次數;後面的每一個數對應一個特定的中斷,表示該中斷自系統啓動以來發生的次數。

ctxt: 表示系統CPU發生的上下文交換次數。

btime: 表示自系統啓動到如今的時間,單位爲秒。

processes: 表示自系統啓動以來所建立的任務的數目。

procs_running: 當前運行隊列的任務數目。

procs_blocked: 當前被阻塞的任務數目,等待I/O完成次數。

CPU的使用率能夠經過以下方式計算:

cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100

cpu_usage=[(user2+sys2+nice2)-(user1+sys1+nice1)]/(total2-total)*100

獲取CPU使用率的相關腳本以下:

#!/bin/sh
#
#腳本功能描述:依據/proc/stat文件獲取並計算CPU使用率
#
#CPU時間計算公式:CPU_TIME=user+system+nice+idle+iowait+irq+softirq
#CPU使用率計算公式:cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100
#默認時間間隔
TIME_INTERVAL=5
 
LAST_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
LAST_SYS_IDLE=$(echo $LAST_CPU_INFO | awk '{print $4}')
LAST_TOTAL_CPU_T=$(echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')
sleep ${TIME_INTERVAL}
NEXT_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
NEXT_SYS_IDLE=$(echo $NEXT_CPU_INFO | awk '{print $4}')
NEXT_TOTAL_CPU_T=$(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')
 
#系統空閒時間
SYSTEM_IDLE=`echo ${NEXT_SYS_IDLE} ${LAST_SYS_IDLE} | awk '{print $1-$2}'`
#CPU總時間
TOTAL_TIME=`echo ${NEXT_TOTAL_CPU_T} ${LAST_TOTAL_CPU_T} | awk '{print $1-$2}'`
CPU_USAGE=`echo ${SYSTEM_IDLE} ${TOTAL_TIME} | awk '{printf "%.2f", 100-$1/$2*100}'`
 
echo "CPU Usage:${CPU_USAGE}%"


除了利用/proc/stat文件獲取CPU使用率,還能夠經過top等命令獲取CPU的使用率,如

 

# top -n 1 | grep Cpu
 %Cpu(s):  1.5 us,  1.5 sy,  0.0 ni, 96.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st


 

三、獲取內存使用狀況

1)在Linux下要查看內存的使用狀況通常使用free命令:

# free
total       used       free     shared    buffers     cached
Mem:       3922048    3416120     505928       1396     137396    2836636
-/+ buffers/cache:     442088    3479960
Swap:      8241148       3500    8237648


其中的各項字段解釋說明:

total: 物理內存的總大小

used: 已經使用的內存大小

free:空閒的內存大小

shared:應用程序共享的內存

buffers: 緩存,主要用於目錄方面,inode值等

cached: 緩存,主要用於已打開的文件

經過上邊的解釋說明咱們能夠獲得:

total = used + free

used = shared + buffers + cached

因此在計算系統內存使用率是時候,從系統的層面考慮,能夠直接經過mem usage = used / total 計算內存使用率。

 

而第三行(-/+buffers/cache)中主要是針對應用程序的內存使用來講的:

-buffers/cache:應用程序使用的內存大小,即used減去緩存值

+buffers/cache:全部可供應用程序使用的內存大小,free加上緩存值

從應用程序角度看,對於應用程序來講buffers/cache也等同於可用的,由於buffers/cache自己是爲了提升文件的讀取性能,因此當內存緊張的時候,buffers/cache會被回收,從新分配給申請內存的應用程序。

 所以從應用程序的角度來講,可用內存 = 系統free + buffers + cached

 

2)除了經過free命令獲取Linux內存的使用狀況,咱們還能夠經過/proc/meminfo文件來獲取內存的使用率:

#cat /proc/meminfo
MemTotal:        1883388 kB
MemFree:           81952 kB
MemAvailable:     995960 kB
Buffers:            2072 kB
Cached:           747400 kB
SwapCached:            4 kB
Active:           520372 kB
Inactive:         599848 kB
Active(anon):     173680 kB
Inactive(anon):   296344 kB
Active(file):     346692 kB
Inactive(file):   303504 kB
...

相關字段解釋說明:

MemTotal:全部物理可用RAM內存

MemFree:當前空閒內存

MemAvailable: 預計可以使用的內存

Buffers: 用來給文件作緩衝的內存

Cached: 高速緩衝存儲器所用內存

SwapCached: 交換空間

Active: 活躍使用的Buffer或Cache的內存大小

Inactive:不常用的Buffer或Cache的內存大小


###利用/proc/meminfo獲取內存使用狀況的腳本以下:

#!/bin/sh
mem_use_info=(`awk '/MemTotal/{memtotal=$2}/MemAvailable/{memavailable=$2}END{printf "%.2f %.2f %.2f",memtotal/1024/1024," "(memtotal-memavailable)/1024/1024," "(memtotal-memavailable)/memtotal*100}' /proc/meminfo`)
 
echo total:${mem_use_info[0]}G  used:${mem_use_info[1]}G  Usage:${mem_use_info[2]}%


 

四、獲取實時網卡流量信息

   Linux下若是須要查看實時流量通常都採用iftop命令來查看不一樣網卡的實時流量信息。

    可是若是想分析網卡的網絡包、流量、錯包、丟包等信息通常都是經過/proc/net/dev文件來分析。

 針對/proc/net/dev文件,一般文件內容以下:

#cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
ens192: 110400390 1840002    0  904    0     0          0         0      900      14    0    0    0     0       0          0
    lo:  923561   14578    0    0    0     0          0         0   923561   14578    0    0    0     0       0          0
ens160: 1375841938 17880629    0  909    0     0          0         0 1331915939 15766579    0    0    0     0       0          0

相關字段解釋說明:

從第一行中能夠看出這個文件大體分爲三部分,分別是:

第一個字段表示接口名稱

第二個字段Recevice表示收包

第三個字段Transmit表示發包。

下邊幾行內容相同:

第一個字段(face):表示接口名稱

第二個字段和第十個字段(byte):分別表示收到、發送的字節數

第三個字段和第十一個字段(packets):分別表示收到、發送的正確數據包的數量

第四個字段和第十二個字段(errs):分別表示收到、發送的錯誤數據包量

第五個字段和第十三個字段(drop):分別表示收到、發送丟棄的數據包量

 

下邊是獲取服務器網卡實時流量的腳本:

#!/bin/sh
#
#經過/proc/net/dev獲取執行網卡的信息
if [ $# -lt 2 ];then
  echo "Useage : `basename $0` eth0 1"
  exit 1
fi
#網卡名
eth=$1
#時間間隔(頻率)
interval=$2
 
in_last=$(cat /proc/net/dev | grep ${eth} | sed -e "s/\(.*\)\:\(.*\)/\2/g" | awk '{print $1 }')
out_last=$(cat /proc/net/dev | grep ${eth} | sed -e "s/\(.*\)\:\(.*\)/\2/g" | awk '{print $9 }')
 
while true
    do
        sleep ${interval}
        in=$(cat /proc/net/dev | grep $eth | sed -e "s/\(.*\)\:\(.*\)/\2/g" | awk '{print $1 }')
        out=$(cat /proc/net/dev | grep $eth | sed -e "s/\(.*\)\:\(.*\)/\2/g" | awk '{print $9 }')
 
        traffic_in=`echo ${in} ${in_last} | awk '{printf "%.2f", ($1-$2)/1024}'`
        traffic_out=`echo ${out} ${out_last} | awk '{printf "%.2f", ($1-$2)/1024}'`
        current_time=$(date +"%F %H:%M:%S")
 
        echo "${current_time} -- IN: ${traffic_in} KByte/s     OUT: ${traffic_out} KByte/s"
 
        in_old=${in}
        out_old=${out}
   done
相關文章
相關標籤/搜索