Linux系統資源監控命令簡介
Linux 系統由若干主要物理組件組成,如CPU、內存、網卡和存儲設備。要有效地管理Linux 環境,您應該能夠以合理的精度測量這些資源的 各種指標—每個組件處理多少資源、是否存在瓶頸等。下面我們介紹下linux資源監控有關的一些命令。
查看系統發行版
root@cf0c6032ba2f:/# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
top(cpu)
Cpu(s)這一行提供了當前CPU運行情況的信息:
Cpu(s): 11.4%us, 29.6%sy, 0.0%ni, 58.3%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
- us:用戶CPU時間 運行非優雅的用戶進程所占CPU時間的百分比(優雅,英文“nicing”,是指一個進程允許你根據其他進程更改優先級)。
- sy:系統CPU時間 運行內核和內核進程所占CPU時間的百分比。
- ni:優雅CPU時間 如果更改過一些進程的優先級,這個指標能夠告訴你它們所占CPU時間的百分比。
- id:CPU空閑時間 這是你希望具備很高數值的度量指標中的一個。它代表了CPU的空閑時間比。如果系統運行緩慢,但是這個指標特別高,那么你就可以確定問題的原因不是高CPU負載。
- wa:I/O等待 這個數字代表了CPU時間用在等待執行I/O操作所占的百分比。當你解決運行緩慢的系統問題的時候,這是一個非常有價值的度量指標,因為如果這個數值很低,那么就能輕松排除磁盤或者網絡I/O的問題。
- hi:硬件中斷 CPU用于處理硬件中斷所占時間的百分比。
- si:軟件中斷 CPU用在處理軟件中斷所占時間的百分比。
- st:流逝的時間 如果你正在運行虛擬機,這個度量指標會告訴你虛擬機中執行的其他任務所占CPU時間的百分比。
查看cpu個數
判斷Linux服務器CPU情況的依據如下:
- 具有相同core id的CPU是同一個core的超線程。
- 具有相同physical id的CPU是同一個CPU封裝的線程或核心。
- 顯示物理CPU個數的命令如下所示:
- cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
- 顯示每個物理CPU中core的個數(即核數)的命令如下所示:
- cat /proc/cpuinfo | grep "cpu cores" | uniq
命令結果顯示如下所示: cpu cores : 1
- 顯示邏輯CPU的個數的命令如下所示:
- cat /proc/cpuinfo | grep "processor" | wc -l
命令結果顯示如下所示: 4 其實大家從這里就可以看出來,按理說應有如下等式: 物理CPU個數×核數=邏輯CPU的個數 如果不相等的話,則表示你的服務器CPU支持超線程技術。我們在配置服務器的應用時,應以服務器的邏輯CPU個數為準。
uptime(平均負載)
有時候我們會覺得系統響應速度很慢,但是又找不到原因,這時就要查平均負載了,看它是否有大量的進程在排隊等待。特定時間間隔內運行隊列中的平均進程數可以反映系統的繁忙程度,所以我們通常會在自己的網站或系統變慢時第一時間查系統的負載,即CPU的平均負載。究竟應該如何查看平均負載呢?最簡單的命令是uptime,如下所示:
- uptime
命令顯示結果如下:
- 11:31:11 up 11 days, 19:01, 2 users, load average: 0.02, 0.01, 0.00
目前的主流服務器都是雙四核,有相當強悍的CPU,提供一般的應用服務時,不必擔心Linux系統的負載。
這里需要注意的是load average的輸出值,這三個值的大小一般不能大于系統邏輯CPU的個數,例如,本輸出中系統有4個邏輯CPU,如果load average的三個值長期大于4,說明CPU很繁忙,負載很高,可能會影響系統性能,但是偶爾大于4時,不用擔心,一般不會影響系統性能。相反,如果load average的輸出值小于CPU的個數,則表示CPU還有空閑的,比如本例中的輸出,CPU是比較空閑的。
這時候可以結合vmstat命令來判斷我們的系統是否過于繁忙,如果確定很繁忙,就要考慮是否更換服務器或增加CPU的個數了。總結如下: 如果r經常大于3或4,且id經常少于50,則表示CPU的負荷很重。
top(mem)
- Mem: 1024176k total, 997408k used, 26768k free, 85520k buffers
- Swap: 1004052k total, 4360k used, 999692k free, 286040k cached
第1行告訴我們有多少物理內存可用、占用了多少內存、空閑多少內存以及緩存了多少內存。第2行為我們提供了相似的信息,交換存儲以及Linux文件緩存使用了多少RAM。
想要找出進程到底真正使用了多少RAM,你必須刨除RAM中的文件緩存。正如你所看到的示例代碼一樣,在已用的997408KB的RAM中,有286040KB的RAM被文件緩存占用,所以這就是說實際上僅使用了711368KB的RAM。 辨別是否耗盡了RAM的一個好方法是查看文件緩存。
如果實際用的內存減去文件緩存的值很大,同時交換存儲的值也很高,很可能的確有內存問題。
free -m(內存)
顯示的是當前內存的使用情況,m的意思是以M個字節來顯示內容,此命令只在Linux系統下有效,在FreeBSD下是沒有此命令的。命令顯示結果如下所示:
- total used free shared buffers cached
- Mem: 3949 1397 2551 0 268 917
- -/+ buffers/cache: 211 3737
- Swap: 8001 0 8001
上述結果中各個參數的詳細說明如下:
- total:內存總數。
- used:已經使用的內存數。
- free:空閑的內存數。
- shared:多個進程共享的內存總額。
- buffers buffer cache和cached page cache:磁盤緩存的大小。
- -buffers/cache:(已用)的內存數,即used-buffers-cached。
- +buffers/cache:(可用)的內存數,即free + buffers + cached。 由此得出結論,可用內存的計算公式為可用內存=free+buffers+cached 即 2551MB+268MB+917MB=3737MB 注意 上面等式兩邊的數值并不相等,但這個沒關系,-m參數其實是以整數數值來取舍的。大家如果對這個運算結果有懷疑,可以嘗試不帶-m參數來觀看free命令顯示的結果,這樣就會一目了然了。
可見-buffers/cache反映的是被程序實實在在占用的內存,而+buffers/cache反映的是可以挪用的內存總數。
vmstat(io)
vmstat是一個相當全面的性能分析工具,通過它可以觀察系統的進程狀態、內存使用情況、虛擬內存的使用情況、磁盤的I/O、中斷、上下文切換、CPU的使用情況等性能信息,建議熟練掌握此命令。
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 0 0 519024 74732 4606568 0 0 3 9 5 10 27 5 68 0 2 0 0 519664 74732 4606568 0 0 0 0 1847 1244 20 17 63 0 1 0 0 517296 74732 4606568 0 0 0 284 2092 1617 37 17 47 0 3 0 0 515440 74732 4606568 0 0 0 164 1620 718 26 17 57 0
其中:
(1)procs r:等待運行的進程數。 b:處于非中斷睡眠狀態的進程數。
(2)memory swpd:虛擬內存使用情況(單位:KB)。 free:空閑的內存(單位:KB)。 buff:被用來作為緩存的內存數量(單位:KB)。
(3)swap si:從磁盤交換到內存的交換頁數量(單位:KB/s)。 so:從內存交換到磁盤的交換頁數量(單位:KB/s)。
(4)io bi:發送到塊設備的塊數(單位:塊/秒)。 bo:從塊設備接收到的塊數(單位:塊/秒)。
(5)system in:每秒的中斷數,包括時鐘中斷。 cs:每秒的環境(上下文)切換次數。 (6)cpu 按CPU的總使用百分比來顯示。 us:CPU使用時間。 sy:CPU系統使用時間。 id:閑置時間。
標準情況下r和b值應該為:r<5,b≈0。 如果user%+sys%<70%則表示系統性能較好,如果user%+sys%>=85%或以上,這表示系統性能比較糟糕,這時就要對系統進行全方面檢查了。其中: user%表示CPU處在用戶模式下的時間百分比。 sys%表示CPU處在系統模式下的時間百分比。
ps auxf(進程)
要查看系統中用戶正在運行的所有進程,可以在ps命令后面使用以下選項:
a(表示所有用戶)
u(以面向用戶的格式顯示,或顯示擁有每個進程的用戶)
x(沒有控制tty或終端屏幕的進程,“顯示每個進程”的另一種方法)
- ps aux
請注意"ps -aux"不同于"ps aux"。POSIX和UNIX的標準要求"ps -aux"打印用戶名為"x"的用戶的所有進程,以及打印所有將由-a選項選擇的過程。如果用戶名為"x"不存在,ps的將會解釋為"ps aux",而且會打印一個警告。這種行為是為了幫助轉換舊腳本和習慣。它是脆弱的,即將更改,因此不應依賴。
要查看進程樹,除了使用上一節用過的a、u和x選項,還要加上個f(其名稱源于ASCII art forest)選項。
- ps auxf
ps -ef(進程)
ps aux是用BSD格式來顯示結果.ps -ef是用全格式的System V格式,顯示出來就是帶全路徑的進程名.
一個影響使用的區別是aux會截斷command列,而-ef不會。因此當需要結合grep的時候,優先選擇-ef命令,避免誤判
netstat(網絡)
netstat命令的功能是顯示網絡連接、路由表和網絡接口的信息,可以讓用戶得知目前都有哪些網絡連接正在運作。 下面是它的重要參數,以及詳細的說明:
-A:顯示任何關聯的協議控制塊的地址。主要用于調試。
-a:顯示所有套接字的狀態。在一般情況下不顯示與服務器進程相關聯的套接字。
-i:顯示自動配置接口的狀態。那些在系統初始引導后配置的接口狀態不在輸出之列。
-m:打印網絡存儲器的使用情況。
-n:打印實際地址,而不是對地址的解釋或顯示主機、網絡名之類的符號。
-r:打印路由選擇表。
-f address:family會對于給出名字的地址簇打印統計數字和控制塊信息。到目前為止,它唯一支持的地址簇是inet。
-I interface:表示只打印給出名字的接口狀態。
-p protocol-name:表示只打印給出名字的協議的統計數字和協議控制塊信息。
-s:打印每個協議的統計數字。
-t:表示在輸出顯示中用時間信息代替隊列長度信息。
我們用得最多的,也是最習慣的參數有兩個,即netstat-an,如下所示:
- netstat -an | grep –v unix
lsof(文件)
lsof(list open files)是一個列出當前系統打開文件的工具。在UNIX環境下,任何事物都是以文件的形式存在的,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。所以像傳輸控制協議(TCP)和用戶數據報協議(UDP)套接字等,系統在后臺都為該應用程序分配了一個文件描述符,無論這個文件的本質如何,該文件描述符都會為應用程序與基礎操作系統之間的交互提供通用接口。因為應用程序打開文件的描述符列表提供了大量關于這個應用程序的信息,因此通過lsof工具查看這個列表對系統監測,以及排錯非常有幫助。順便提一下,這工具首先出現在UNIX系統中,后才移植到Linux平臺下。
工作中用得最多的是-i參數,可以用它來查看特定端口的情況,比如,我可以用lsof -i:22查看22端口是由哪些程序占用的。
fdisk -l(硬盤分區)
查看硬盤及分區信息,如下所示: fdisk –l 命令顯示結果如下:
Disk /dev/sda: 160.0 GB, 160040803840 bytes 255 heads, 63 sectors/track, 19457 cylinders Units = cylinders of 16065 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 1 13 104391 83 Linux / /dev/sda2 14 3200 25599577+ 83 Linux /dev/sda3 3201 3582 3068415 82 Linux swap / Solaris /dev/sda4 3583 19457 127515937+ 5 Extended /dev/sda5 3583 19457 127515906 83 Linux
以上結果表明這是一塊160GB的服務器硬盤。
df(硬盤空間)
檢查文件系統的磁盤空間占用情況,命令如下所示:
df –h 命令顯示結果如下:
Filesystem Size Used Avail Use% Mounted on /dev/sda2 24G 5.9G 17G 26% /
/dev/sda5 118G 8.8G 103G 8% /data
/dev/sda1 99M 20M 75M 21% /boot
tmpfs 859M 0 859M 0% /dev/shm
du(目錄大小)
查看Linux系統中某目錄的大小,這在工作中經常會遇到。可以使用如下命令查看:
- du -sh 目錄名
例如du -sh /data 命令顯示結果如下所示: 8.6G /data/ 檢查是否有分區使用率(Use%)過高(比如超過90%),如發現某個分區空間接近用完,可以進入該分區的掛載點,用以下命令找出占用空間最多的文件或目錄,然后按照從大到小的順序,正好可以找出系統中占用最多空間的前十個文件或目錄:
- du -sh * | sort -hr | head -n 10
doc