第10章 統計和查看Linux的系統狀態


寫在前面的話:本文是假設你已經有了進程、內存、cpu的理論基礎而寫的,文中涉及的各種狀態只給出了簡單說明而沒有解釋它們的意義,如果不懂這些理論性的東西,本文可能讓你看的直接想右上角叉叉。關於這些理論,可以閱讀我另一篇文章:http://www.cnblogs.com/f-ck-need-u/p/7058920.html

10.1 /proc的意義及說明

在Linux中查看各種狀態,其實質是查看內核中相關進程的數據結構中的項,通過工具將其格式化后輸出出來。但是內核的數據是絕對不能隨意查看或更改的,至少不能直接去修改。所以,在linux上出現了偽文件系統/proc,它是內核中各屬性或狀態向外提供訪問和修改的接口

在/proc下,記錄了內核自己的數據信息,各進程獨立的數據信息,統計信息等。絕大多數文件都是只讀不可改的,即使對root也一樣,但/proc/sys除外,為何如此稍后解釋。

其中數字命名的目錄對應的是各進程的pid號,其內的文件記錄的都是該進程當前的數據信息,且都是只讀的,例如記錄命令信息的cmdline文件,進程使用哪顆cpu信息cpuset,進程占用內存的信息mem文件,進程IO信息io文件等其他各種信息文件。

[root@xuexi ~]# ls /proc/6982 attr clear_refs cpuset fd loginuid mounts numa_maps pagemap schedstat stat task autogroup cmdline cwd fdinfo maps mountstats oom_adj personality sessionid statm wchan auxv comm environ io mem net oom_score root smaps status cgroup coredump_filter exe limits mountinfo ns oom_score_adj sched stack syscall

非數字命名的目錄各有用途,例如bus表示總線信息,driver表示驅動信息,fs表示文件系統特殊信息,net表示網絡信息,tty表示跟物理終端有關的信息,最特殊的兩個是/proc/self和/proc/sys。

先說/proc/self目錄,它表示的是當前正在訪問/proc目錄的進程,因為/proc目錄是內核數據向外記錄的接口,所以當前訪問/proc目錄的進程表示的就是當前cpu正在執行的進程。如果執行cat /proc/self/cmdline,會發現其結果總是該命令本身,因為cat是手動敲入的命令,它是重要性進程,cpu會立即執行該命令。

再說/proc/sys這個目錄,該目錄是為管理員提供用來修改內核運行參數的,所以該目錄中的文件對root都是可寫的,例如管理數據包轉發功能的/proc/sys/net/ipv4/ip_forward文件。使用sysctl命令修改內核運行參數,其本質也是修改/proc/sys目錄中的文件。

10.2 查看進程信息

10.2.1 pstree命令

pstree命令將以樹的形式顯示進程信息,默認樹的分支是收攏的,也不顯示pid,要顯示這些信息需要指定對應的選項。

pstree [-a] [-c] [-h] [-l] [-p] [pid]

選項說明:
-a:顯示進程的命令行
-c:展開分支
-h:高亮當前正在運行的進程及其父進程
-p:顯示進程pid,此選項也將展開分支
-l:允許顯示長格式進程。默認在顯示結果中超過132個字符時將截斷后面的字符。

例如:

10.2.2 ps命令

ps命令查看當前這一刻的進程信息,注意查看的是靜態進程信息,要查看隨時刷新的動態進程信息(如windows的進程管理器那樣,每秒刷新一次),使用top或htop命令。

這個命令的man文檔及其復雜,它同時支持3種類型的選項:GUN/BSD/UNIX,不同類型的選項其展示的信息格式不一樣。有些加了"-"的是SysV風格 的選項,不加"-"的是BSD選項,加不加"-"它們的意義是不一樣的,例如ps aux 和ps -aux是不同的。

其實只需掌握少數幾個選項即可,關鍵的是要了解ps顯示出的進程信息中每一列代表什么屬性。

對於BSD風格的選項,只需知道一個用法ps aux足以,選項"a"表示列出依賴於終端的進程,選項"x"表示列出不依賴於終端的進程,所以兩者結合就表示列出所有進程,選項"u"表示展現的進程信息是以用戶為導向的,不用管它什么是以用戶為導向,用ps aux就沒錯。

[root@server2 ~]# ps aux | tail USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1340  0.0  0.0  27176   588 ?        Ss   20:30   0:00 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid root 2266  0.0  0.1  93212  2140 ?        Ss   20:30   0:00 /usr/libexec/postfix/master -w postfix 2268  0.0  0.2  93384  3992 ?        S    20:30   0:00 qmgr -l -t unix -u postfix 2306  0.0  0.2  93316  3972 ?        S    20:31   0:00 pickup -l -t unix -u root 2307  0.0  0.2 145552  5528 ?        Ss   20:31   0:00 sshd: root@pts/0 root 2309  0.0  0.0      0     0 ?        S<   20:31   0:00 [kworker/3:1H] root 2310  0.0  0.1 116568  3184 pts/0    Ss   20:31   0:00 -bash root 2352  0.0  0.0      0     0 ?        S<   20:31   0:00 [kworker/1:2H] root 2355  0.0  0.0 139492  1632 pts/0    R+   20:34   0:00 ps aux root 2356  0.0  0.0 107928   676 pts/0    R+   20:34   0:00 tail

各列的意義:

  • %CPU:表示CPU占用百分比,注意,CPU的衡量方式是占用時間,所以百分比的計算方式是"進程占用cpu時間/cpu總時間",而不是cpu工作強度的狀態。
  • %MEM:表示各進程所占物理內存百分比。
  • VSZ:表示各進程占用的虛擬內存,也就是其在線性地址空間中實際占用的內存。單位為kb。
  • RSS:表示各進程占用的實際物理內存。單位為Kb。
  • TTY:表示屬於哪個終端的進程,"?"表示不依賴於終端的進程。
  • STAT:進程所處的狀態。
    •     D:不可中斷睡眠
    •     R:運行中或等待隊列中的進程(running/runnable)
    •     S:可中斷睡眠
    •     T:進程處於stopped狀態
    •     Z:僵屍進程

    對於BSD風格的ps選項,進程的狀態還會顯示下面幾個組合信息。

    •     <:高優先級進程
    •     N:低優先級進程
    •     L:該進程在內存中有被鎖定的頁
    •     s:表示該進程是session leader,即進程組的首進程。例如管道左邊的進程,shell腳本中的shell進程
    •     l:表示該進程是一個線程
    •     +:表示是前端進程。前端進程一般來說都是依賴於終端的
  • START:表示進程是何時被創建的
  • TIME:表示各進程占用的CPU時間
  • COMMAND:表示進程的命令行。如果是內核線程,則使用方括號"[]"包圍

注意到了沒,ps aux沒有顯示出ppid。

另外常用的ps選項是ps -elf。其中"-e"表示輸出全部進程信息,"-f"和"-l"分別表示全格式輸出和長格式輸出。全格式會輸出cmd的全部參數。

[root@server2 ~]# ps -lf F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD 4 S postfix    2306   2266  0  80   0 - 23329 ep_pol 20:31 ?        00:00:00 pickup -l -t unix -u 4 S root       2307   1141  0  80   0 - 36388 poll_s 20:31 ?        00:00:00 sshd: root@pts/0
1 S root       2309      2  0  60 -20 -     0 worker 20:31 ?        00:00:00 [kworker/3:1H] 4 S root       2310   2307  0  80   0 - 29142 wait   20:31 pts/0    00:00:00 -bash 1 S root       2433      2  0  60 -20 -     0 worker 21:21 ?        00:00:00 [kworker/1:1H] 1 S root       2479      2  0  80   0 -     0 worker 21:25 ?        00:00:00 [kworker/1:0] 1 S root       2503      2  0  60 -20 -     0 worker 21:28 ?        00:00:00 [kworker/1:2H] 1 S root       2532      2  0  80   0 -     0 worker 21:30 ?        00:00:00 [kworker/1:1] 0 R root       2539   2310  0  80   0 - 34873 -      21:33 pts/0    00:00:00 ps -elf 0 S root       2540   2310  0  80   0 - 26982 pipe_w 21:33 pts/0    00:00:00 tail

各列的意義:

  • F:程序的標志位。0表示該程序只有普通權限,4表示具有root超級管理員權限,1表示該進程被創建的時候只進行了fork,沒有進行exec
  • S:進程的狀態位,注意ps選項加了"-"的是非BSD風格選項,不會有"s""<""N""+"等的狀態標識位
  • C:CPU的百分比,注意衡量方式是時間
  • PRI:進程的優先級,值越小,優先級越高,越早被調度類選中運行
  • NI:進程的NICE值,值為-20到19,影響優先級的方式是PRI(new)=PRI(old)+NI,所以NI為負數的時候,越小將導致進程優先級越高。
  •     :但要注意,NICE值只能影響非實時進程。
  • ADDR:進程在物理內存中哪個地方。
  • SZ:進程占用的實際物理內存
  • WCHAN:若進程處於睡眠狀態,將顯示其對應內核線程的名稱,若進程為R狀態,則顯示"-"

10.2.3 ps后grep問題

在ps后加上grep篩選目標進程時,總會發現grep自身進程也被顯示出來。

[root@xuexi ~]# ps aux | grep "crond" root 1425  0.0  0.1 117332  1276 ?        Ss   Jun10   0:00 crond root 8275  0.0  0.0 103256   856 pts/2    S+   17:07   0:00 grep crond

先解釋下為何會如此。管道是bash創建的,bash創建管道后fork兩個子進程,然后兩子進程各自exec加載ps程序和grep程序,exec之后這兩個子進程就稱為ps進程和grep進程,所以ps和grep進程幾乎可以認為是同時出現的,盡管ps進程作為管道的首進程(進程組首進程)它是先出現的,但是在ps出現之前確實兩個進程都已經fork完成了。也就是說,管道左右兩端的進程是同時被創建的(不考慮父進程創建進程消耗的那點時間),但數據傳輸是有先后順序的,左邊先傳,右邊后收。

要將grep自身進程排除在結果之外,方法有二:

[root@xuexi ~]# ps aux | grep "crond" | grep -v "grep"   # 使用-v將grep自己篩選掉 root 1425  0.0  0.1 117332  1276 ?        Ss   Jun10   0:00 crond [root@xuexi ~]# ps aux | grep "cron[d]" root 1425  0.0  0.1 117332  1276 ?        Ss   Jun10   0:00 crond

第二種方法能成功是因為grep進程被ps捕獲時的結果是"grep cron[d]",而使用cron[d]匹配時,它將只能匹配crond,所以"grep cron[d]"被篩選掉了。其實加上其他字符將更容易理解。

[root@xuexi ~]# ps aux | grep "cron[dabc]" root 1425  0.0  0.1 117332  1276 ?        Ss   Jun10   0:00 crond

10.2.4 uptime命令

[root@xuexi ~]# uptime
 08:38:11 up 22:35,  2 users,  load average: 0.00, 0.01, 0.05

顯示當前時間,已開機運行多少時間,當前有多少用戶已登錄系統,以及3個平均負載值。

所謂負載率(load),即特定時間長度內,cpu運行隊列中的平均進程數(包括線程),一般平均每分鍾每核的進程數小於3都認為正常,大於5時負載已經非常高。在UNIX系統中,運行隊列包括cpu正在執行的進程和等待cpu的進程(即所謂的可運行runable)。在Linux系統中,還包括不可中斷睡眠態(IO等待)的進程。運行隊列中每出現一個進程,load就加1,進程每退出運行隊列,Load就減1。如果是多核cpu,則還要除以核數。

詳細信息見man uptime和https://en.wikipedia.org/wiki/Load_(computing)

例如,單核cpu上的負載值為"1.73 0.60 7.98"時,表示:

最近1分鍾:1.73表示平均可運行的進程數,這一分鍾要一直不斷地執行這1.73個進程。0.73個進程等待該核cpu。

最近5分鍾:平均進程數還不足1,表示該核cpu在過去5分鍾空閑了40%的時間。

最近15分鍾:7.98表示平均可運行的進程數,這15分鍾要一直不斷地執行這7.98個進程。

結合前5分鍾的結果,說明前15-前10分鍾時間間隔內,該核cpu的負載非常高。

如果是多核cpu,則還要將結果除以核數。例如4核時,某個最近一分鍾的負載值為3.73,則意味着有3.73個進程在運行隊列中,這些進程可被調度至4核中的任何一個核上運行。最近1分鍾的負載值為1.6,表示這一分鍾內每核cpu都空閑(1-1.6/4)=60%的時間。
所以,load的理想值是正好等於CPU的核數,小於核數的時候表示cpu有空閑,超出核數的時候表示有進程在等待cpu,即系統資源不足。

10.2.5 top、htop以及iftop命令

top命令查看動態進程狀態,默認每5秒刷新一次。

top選項說明:

-d:指定top刷新的時間間隔,默認是5 秒 -b:批處理模式,每次刷新分批顯示 -n:指定top刷新幾次就退出,可以配合-b使用 -p:指定監控的pid,指定方式為-pN1 -pN2 ...或-pN1, N2 [,...] -u:指定要監控的用戶的進程,可以是uid也可以是user_name

在top動態模式下,按下各種鍵可以進行不同操作。使用"h"或"?"可以查看相關鍵的說明。

  •   1     :(數字一)表示是否要在top的頭部顯示出多個cpu信息
  •   H     :表示是否要顯示線程,默認不顯示
  •   c,S   : c表示是否要展開進程的命令行,S表示顯示的cpu時間是否是累積模式,cpu累積模式下已死去的子進程cpu時間會累積到父進程中
  •   x,y   :x高亮排序的列,y表示高亮running進程
  •   u     :僅顯示指定用戶的進程
  •   n or #:設置要顯示最大的進程數量
  •   k     :殺進程
  •   q     :退出top
  •   P :以CPU 的使用資源排序顯示
  •   M :以Memory 的使用資源排序顯示
  •   N :以PID 來排序

以下是top的一次結果。

[root@xuexi ~]# top top - 17:43:44 up 1 day, 14:16, 2 users, load average: 0.10, 0.06, 0.01 Tasks: 156 total, 1 running, 155 sleeping, 0 stopped, 0 zombie Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st Cpu2 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu3 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1004348k total, 417928k used, 586420k free, 52340k buffers Swap: 2047996k total, 0k used, 2047996k free, 243800k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 19364 1444 1132 S 0.0 0.1 0:00.96 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:01.28 migration/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.59 ksoftirqd/0 5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0  
  • 第1行:和w命令的第一行一樣,也和uptime命令的結果一樣。此行各列分別表示"當前時間"、"已開機時長"、"當前在線用戶"、"前1、5、15分鍾平均負載率"。
  • 第2行:分別表示總進程數、running狀態的進程數、睡眠狀態的進程數、停止狀態進程數、僵屍進程數。
  • 第3-6行:每顆cpu的狀況。
  •      us = user mode
  •      sy = system mode
  •      ni = low priority user mode (nice)(用戶空間中低優先級進程的cpu占用百分比)
  •      id = idle task
  •      wa = I/O waiting
  •      hi = servicing IRQs(不可中斷睡眠,hard interruptible)
  •      si = servicing soft IRQs(可中斷睡眠,soft interruptible)
  •      st = steal (time given to other DomU instances)(被偷走的cpu時間,一般被虛擬化軟件偷走)
  • 第7-8行:從字面意思理解即可。
  • VIRT:虛擬內存總量
  • RES:實際內存總量
  • SHR:共享內存量
  • TIME:進程占用的cpu時間(若開啟了時間累積模式,則此處顯示的是累積時間)

top命令雖然非常強大,但是太老了。所以有了新生代的top命令htop。htop默認沒有安裝,需要手動安裝。

[root@xuexi ~]# yum -y install htop

htop可以使用鼠標完成點擊選中。其他使用方法和top類似,使用h查看各按鍵意義即可。

iftop用於動態顯示網絡接口的數據流量。用法也很簡單,按下h鍵即可獲取幫助。

10.2.6 分析系統負載(system load average)

根據前文uptime中對系統負載(system load)的描述,分析一下這個top的結果。

上圖中,系統負載非常之高,最近一分鍾的負載量高達383.19,這表示這一分鍾有383.19個進程正在運行或等待調度,如果是單核CPU,表示這一分鍾要毫不停留地執行這么多進程,如果是8核CPU,表示這一分鍾內平均每核心CPU要執行大概50個進程。

從load average上看,確實是非常繁忙的場景。但是看CPU的idle值為98.8,說明CPU非常閑。為什么系統負載如此高,CPU卻如此閑?

前面解釋system load average的時候,已經說明過可運行的(就緒態,即就緒隊列的長度)、正在運行的(運行態)和不可中斷睡眠(如IO等待)的進程任務都會計算到負載中。現在負載高、CPU空閑,說明當前正在執行的任務基本不消耗CPU資源,大量的負載進程都在IO等待中

可以從ps的進程狀態中獲取哪些進程是正在運行或運行隊列中的(狀態為R),哪些進程是在不可中斷睡眠中的(狀態為D)。

[root@xuexi src]# ps -eo stat,pid,ppid,comm --no-header |grep -E "^(D|R)"
R+    11864   9624 ps

10.3 vmstat命令

注意vmstat的第一次統計是自開機起的平均值信息,從第二次開始的統計才是指定刷新時間間隔內的資源利用信息,若不指定刷新時間間隔,則默認只顯示一次統計信息。

vmstat [-d] [delay [ count]] vmstat [-f] 選項說明: -f:統計自開機起fork的次數。包括fork、clone、vfork的次數。但不包括exec次數。 -d:顯示磁盤統計信息。 delay:刷新時間間隔,若不指定,則只統計一次信息就退出vmstat。 count:總共要統計的次數。

例如,只統計一次信息。

[root@xuexi ~]# vmstat 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 583692  52684 244200    0    0     5     3    4    5  0  0 100  0  0

其中各列的意義如下:

Procs

  •    r: 等待隊列中的進程數
  •    b: 不可中斷睡眠的進程數

Memory

  •    swpd: 虛擬內存使用總量
  •    free: 空閑內存量
  •    buff: buffer占用的內存量(buffer用於緩沖)
  •    cache: cache占用的內存量(cache用於緩存)

Swap

  •    si:從磁盤加載到swap分區的數據流量,單位為"kb/s"
  •    so: 從swap分區寫到磁盤的數據流量,單位為"kb/s"

IO

  •    bi: 從塊設備接受到數據的速率,單位為blocks/s
  •    bo: 發送數據到塊設備的速率,單位為blocks/s

System

  •    in: 每秒中斷數,包括時鍾中斷數量
  •    cs: 每秒上下文切換次數

CPU:統計的是cpu時間百分比,具體信息和top的cpu統計列一樣

  •    us: Time spent running non-kernel code. (user time, including nice time)
  •    sy: Time spent running kernel code. (system time)
  •    id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
  •    wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
  •    st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.

還可以統計磁盤的IO信息。統計信息的結果很容易看懂,所以略過。

10.4 iostat命令

iostat主要統計磁盤或分區的整體使用情況。也可以輸出cpu信息,甚至是NFS網絡文件系統的信息。同vmstat/sar一樣,第一次統計的都是自系統開機起的平均統計信息。

iostat [ -c ] [ -d ] [ -n -h ][ -k | -m ] [ -p [device][,...] ] [ interval [ count ] ] 選項說明: -c:統計cpu信息 -d:統計磁盤信息 -n:統計NFS文件系統信息 -h:使NFS統計信息更人類可讀化 -k:指定以kb/s為單位顯示 -m:指定以mb/s為單位顯示 -p:指定要統計的設備名稱 -y:指定不顯示第一次統計信息,即不顯示自開機起的統計信息。 interval:刷新時間間隔 count:總統計次數

例如:

[root@xuexi ~]# iostat Linux 2.6.32-504.el6.x86_64 (xuexi.longshuai.com)       06/11/2017      _x86_64_        (4 CPU) avg-cpu:  %user   %nice %system %iowait  %steal   %idle 0.01    0.00    0.03    0.01    0.00   99.96 Device: tps Blk_read/s   Blk_wrtn/s Blk_read Blk_wrtn sda 0.58        39.44        23.14    5557194    3259968 sdb 0.00         0.03         0.00       4256          0

各列的意義都很清晰,從字面即可理解。

  • tps:每秒transfer速率(transfers per second),一次對物理設備的IO請求為一個transfer,但多個邏輯請求可能只組成一個transfer
  • Blk_read/s:每秒讀取的block數量
  • Blk_wrtn/s:每秒寫入的block總數
  • Blk_read:讀取的總block數量
  • Blk_wrtn:寫入的總block數量

10.5 sar命令

sar是一個非常強大的性能分析工具,它可以獲取系統的cpu/等待隊列/磁盤IO/內存/網絡等性能指標。

功能多的必然結果是選項多,應用復雜,但只要知道一些常用的選項足以。

sar [options] [-o filename] [delay [count] ] 選項說明: -A:顯示系統所有資源運行狀況 -b:顯示磁盤IO和tranfer速率信息,和iostat的信息一樣,是總體IO統計信息 -d:顯示磁盤在刷新時間間隔內的活躍情況,可以指定一個或多個設備,和-b不同的是,它顯示的是單設備的IO、transfer信息。 :建議配合-p使用顯示友好的設備名,否則默認顯示帶主次設備號的設備名 -P:顯示指定的某顆或某幾顆cpu的使用情況。指定方式為,-P 0,1,2,3或ALL。 -u:顯示每顆cpu整體平均使用情況。-u和-P的區別通過下面的示例很容易區分。 -r:顯示內存在刷新時間間隔內的使用情況 -n:顯示網絡運行狀態。后可接DEV/NFS/NFSD/ALL等多種參數。 :DEV表示顯示網路接口信息,NFS和NFSD分別表示顯示NFS客戶端服務端的流量信息,ALL表示顯示所有信息。 -q:顯示等待隊列大小 -o filename:將結果存入到文件中 delay:狀態刷新時間間隔 count:總共刷新幾次

10.5.1 統計cpu使用情況

[root@server2 ~]# sar -P ALL 1 2 Linux 3.10.0-327.el7.x86_64 (server2.longshuai.com)     06/20/2017      _x86_64_        (4 CPU) 01:18:49 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle 01:18:50 AM     all      0.00      0.00      0.25      0.00      0.00     99.75
01:18:50 AM       0      0.00      0.00      0.00      0.00      0.00    100.00
01:18:50 AM       1      0.00      0.00      0.00      0.00      0.00    100.00
01:18:50 AM       2      0.00      0.00      0.00      0.00      0.00    100.00
01:18:50 AM       3      0.00      0.00      0.00      0.00      0.00    100.00
 
01:18:50 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle 01:18:51 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:18:51 AM       0      0.00      0.00      0.00      0.00      0.00    100.00
01:18:51 AM       1      0.00      0.00      0.99      0.00      0.00     99.01
01:18:51 AM       2      0.00      0.00      0.00      0.00      0.00    100.00
01:18:51 AM       3      0.00      0.00      0.00      0.00      0.00    100.00 Average: CPU %user     %nice   %system   %iowait    %steal     %idle Average: all 0.00      0.00      0.12      0.00      0.00     99.88 Average: 0      0.00      0.00      0.00      0.00      0.00    100.00 Average: 1      0.00      0.00      0.50      0.00      0.00     99.50 Average: 2      0.00      0.00      0.00      0.00      0.00    100.00 Average: 3      0.00      0.00      0.00      0.00      0.00    100.00

各列的意義就不再贅述了,在前面幾個信息查看命令已經解釋過多次了。

在上面的例子中,統計了所有cpu(0,1,2,3共4顆)每秒的狀態信息,每秒還進行了一次匯總,即all,最后還對每顆cpu和匯總all計算了平均值。而我們真正需要關注的是最后的average部分的idle值,idle越小,說明cpu處於空閑時間越少,該顆或整體cpu使用率就越高。

或者直接對整體進行統計。如下:

[root@server2 ~]# sar -u 1 2 Linux 3.10.0-327.el7.x86_64 (server2.longshuai.com)     06/20/2017      _x86_64_        (4 CPU) 01:18:37 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle 01:18:39 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:18:40 AM     all      0.00      0.00      0.23      0.00      0.00     99.77 Average: all 0.00      0.00      0.12      0.00      0.00     99.88

10.5.2 統計內存使用情況

其中kbdirty表示內存中臟頁的大小,即內存中還有多少應該刷新到磁盤的數據。

10.5.3 統計網絡流量

第一種方法是查看/proc/net/dev文件。

關注列:receive和transmit分別表示收包和發包,關注每個網卡的bytes即可獲得網卡的情況。寫一個腳本計算每秒的差值即為網絡流量。

或者使用sar -n命令統計網卡接口的數據。

[root@server2 ~]# sar -n DEV 1 2 Linux 3.10.0-327.el7.x86_64 (server2.longshuai.com)     06/20/2017      _x86_64_        (4 CPU) 01:51:11 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s 01:51:12 AM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
01:51:12 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00

01:51:12 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s 01:51:13 AM      eth0      0.99      0.99      0.06      0.41      0.00      0.00      0.00
01:51:13 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00 Average: IFACE rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s Average: eth0 0.50      0.50      0.03      0.21      0.00      0.00      0.00 Average: lo 0.00      0.00      0.00      0.00      0.00      0.00      0.00

各列的意義如下:

  • rxpck/s:每秒收到的包數量
  • txpck/s:每秒發送的包數量
  • rxkB/s:每秒收到的數據,單位為kb
  • txkB/s:每秒發送的數據,單位為kb
  • rxcmp/s:每秒收到的壓縮后的包數量
  • txcmp/s:每秒發送的壓縮后的包數量
  • rxmcst/s:每秒收到的多播包數量

10.5.4 查看隊列情況

[root@server2 ~]# sar -q Linux 3.10.0-327.el7.x86_64 (server2.longshuai.com)     06/20/2017      _x86_64_        (4 CPU) 12:00:01 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15 blocked 12:10:01 AM         0       446      0.01      0.02      0.05         0
12:20:01 AM         0       445      0.02      0.03      0.05         0
12:30:01 AM         0       446      0.00      0.01      0.05         0 Average: 0       446      0.01      0.02      0.05         0

每列意義解釋:

  • runq-sz:等待隊列的長度,不包括正在運行的進程
  • plist-sz:任務列表中的進程數量,即總任務數
  • ldavg-N:過去1分鍾、5分鍾、15分鍾內系統的平均哎
  • blocked:當前因為IO等待被阻塞的任務數量

10.5.5 統計磁盤IO情況

[root@server2 ~]# sar -d -p 1 2
Linux 3.10.0-327.el7.x86_64 (server2.longshuai.com)     06/20/2017      _x86_64_        (4 CPU)
 
12:53:06 AM   DEV    tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz   await   svctm   %util
12:53:07 AM   sda   0.00      0.00      0.00      0.00      0.00    0.00    0.00    0.00
 
12:53:07 AM   DEV    tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz   await   svctm   %util
12:53:08 AM   sda   0.00      0.00      0.00      0.00      0.00    0.00    0.00    0.00

Average:      DEV    tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz   await   svctm   %util
Average:      sda   0.00      0.00      0.00      0.00      0.00    0.00    0.00    0.00

分別統計的是12:53:06到12:53:07和12:53:07到12:53:08這兩秒的IO使用情況。

各列的意義如下:

  • tps:transfer per second,每秒的transfer速率,一次物理IO請求算一次transfer,但多次邏輯IO請求可能組合起來才算一次transfer。
  • rd_sec/s:每秒讀取的扇區數,扇區大小為512字節。
  • wr_sec/s:每秒寫入的扇區數。
  • avgrq-sz:請求寫入設備的平均大小,單位為扇區。(The average size (in sectors) of the requests that were issued to the device)
  • avgqu-sz:請求寫入設備的平均隊列長度。(The average queue length of the requests that were issued to the device.)
  • await:寫入設備的IO請求的平均(消耗)時間,單位微秒(The average time for I/O requests issued to the device to be served.)
  • svctm:不可信的列,該列未來將被移除,所以不用管
  • %util:最重要的一列,顯示的是設備的帶寬情況。該列若接近100%,說明磁盤速率飽和了。

10.6 free命令

free用於查看內存使用情況。CentOS 6和CentOS 7上顯示格式不太一樣。

free [options] 選項說明: -h:人類可讀方式顯式單位 -m:以MB為顯示單位 -w:將buffers和cache分開單獨顯示。只對CentOS 7上有效 -s:動態查看內存信息時的刷新時間間隔 -c:一共要刷新多少次退出free

以下以CentOS 7上的free結果說明各列的意義。

[root@server2 ~]# free -m total used free      shared  buff/cache available Mem: 1824         131        1286           8         407        1511 Swap: 1999           0        1999

Mem和Swap分別表示物理內存和交換分區的使用情況。

  • total:總內存空間
  • used:已使用的內存空間。該值是total-free-buffers-cache的結果
  • free:未使用的內存空間
  • shared:/tmpfs總用的內存空間。對內核版本有要求,若版本不夠,則顯示為0。
  • buff/cache:buffers和cache的總占用空間
  • available:可用的內存空間。即程序啟動時,將認為可用空間有這么多。可用的內存空間為free+buffers+cache。

所以available才是真正需要關注的可使用內存空間量。

使用-w可以將buffers/cache分開顯示。

[root@server2 ~]# free -w -m total used free shared buffers cache available Mem: 1824         131        1286           8           0         406        1511 Swap: 1999           0        1999

還可以動態統計內存信息,例如每秒統計一次,統計2次。

[root@server2 ~]# free -w -m -s 1 -c 2 total used free shared buffers cache available Mem: 1824         130        1287           8           0         406        1512 Swap: 1999           0        1999 total used free shared buffers cache available Mem: 1824         130        1287           8           0         406        1512 Swap: 1999           0        1999

以下是CentOS 6上的free結果。

[root@xuexi ~]# free -m total used free shared buffers cached Mem: 980        415        565          0         53        239
-/+ buffers/cache:        121        859 Swap: 1999          0       1999

在此結果中,"-/+ buffers/cache"的free列才是真正可用的內存空間了,即CentOS 7上的available列。

一般來說,內存可用量的范圍低於20%應該要引起注意了。

10.7 關於內存可用量的說明

對於CentOS 6的free結果

第一行:

total總物理內存,除掉一部分用於內核管理的,所以幾乎等於物理內存的總量。

used是OS已經分配出去的物理內存,包括OS自己使用的,用戶進程使用的以及緩存(cache)加緩沖(buff)。

free是完全空閑的物理內存,也就是OS還沒分配的。

buffers是用於緩沖數據,

cached用於緩存數據。

buffers和cached已經被包含在used中

第二行:-/+ buffers/cache

used:是第一行的used減掉buffers+cached后得到的,即完全占用而非用於緩存緩沖的數據,也就是說,它是真正被所有進程使用的,除非程序自己釋放,否則就必須占用,除非殺掉進程。

free:是第一行的free加上第一行的Buffers+cached,意義是表示非程序完全占用的內存,可以被釋放。

所以,第二行的數據更有意義。

對於CentOS 7的結果,available已經將free+cache+buffer全部匯總,所以只需看available。

嚴格來說,cache是為了臨時存儲,數據沒了也可以再次加載,所以可以直接釋放掉,但是buffer里的數據是緩沖的,是重要數據,缺了一部分可能導致數據不一致性或返回失敗,要釋放buffer里的數據必須先sync,sync完buffer里就空了,但是sync的時候可能會再次寫入cache。所以,釋放內存時,應先sync,再釋放cache。

手動釋放內存(buffer+cache)的方式:

sync

echo 3 >/proc/sys/vm/drop_caches

但有些buffer數據是無法手動釋放的,只能由程序自身來釋放,所以,完全認為free+buffer+cache就是可用內存也是不合理的,它只是相對比較合理的指標,屬於矮子堆里拔高個的指標,比如free列的內存不足了,buffer列占用了很多內存,使得available看上去的值也不小,但仍然會出現OOM而殺掉進程的現象,這時就需要人為手動釋放內存來替代OS的自動內存管理,但這樣只是治標不治本的,臨時解決問題罷了。


免責聲明!

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



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