在 Linux 環境中,瞭解和判別系統資源使用情況是至關重要的。這不僅有助於提前預警可能出現的問題,也是提升系統性能的基礎。但在我們探討之前,首先需要明確哪些項目值得關注。
在作業系統中知道使用什麼工具得到上列資訊是第一步,實際的資源管理更是一個持續的過程。例如,發現 CPU 使用率持續高時,不只是需要關注,更可能是要進行程式優化或硬體升級。
瞭解和妥善管理系統資源使用情況是任何健全 IT 環境中不可或缺的一部分。透過對重要項目的觀查,乃至於持續監控和實際應用,不僅能確保系統的穩定運作,還能提升整體的性能和安全性。
系統預設會提供 top
指令讓管理者即時進行系統監控。它能即時地提供系統運行狀態,包括 CPU 使用率、記憶體使用量、正在運行的行程列表、以及其他各種系統資源的狀況。
top
的常用資訊如下:
登入系統後,使用終端機執行 top
命令可直接在終端機中輸入:
student$ top
我們會得到如下的互動式輸出:
top - 22:48:13 up 120 days, 7:52, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 140 total, 1 running, 139 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 32668368 total, 9858468 free, 316248 used, 22493652 buff/cache
KiB Swap: 16777208 total, 16776184 free, 1024 used. 31743824 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3206 root 20 0 162012 2288 1588 R 0.3 0.0 0:00.13 top
1 root 20 0 128248 6916 4196 S 0.0 0.0 2:12.10 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:07.21 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:07.74 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:03.39 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.21 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 8:41.75 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 1:16.51 watchdog/0
12 root rt 0 0 0 0 S 0.0 0.0 1:27.50 watchdog/1
由於 top
是一種互動式程式,我們可以在程式運作期間輸入支援的快速鍵以執行特定功能,常用功能如下:
q
: 退出top
u
: 顯示特定使用者的行程k
: 關閉/終止指定的行程r
: 改變指定行程的執行優先權透過top
工具,不僅可以獲得即時的系統資訊,也能夠進行簡單的行程管理,是在職人員進行系統監控時非常有用的一個工具。
"系統負載"(System Load)通常是用來衡量一個系統在一段時間內的工作量。這個指標可以用來評估系統是否過載,或者是否有足夠的資源來應對更多的工作。在 Linux 環境中,這通常通過 "負載平均值"(Load Average)來表示。
影響系統負載的原因有很多,實務上發生高負載的原因如下,供讀者參考:
通過綜合評估這些因素,可以更準確地判斷系統的實際負載狀態,從而採取適當的處理方式。
在作業系統中,我們透過 uptime
可以查詢系統負載資訊:
student$ uptime
23:18:12 up 120 days, 8:22, 1 user, load average: 0.00, 0.01, 0.05
在上列輸出項目,我們在意 load average 的數值,load average 是一個用於評估系統狀況的重要指標,它表示在一段時間內系統中等待 CPU 時間的行程數量,這三個數字來對應過去 1 分鐘、5 分鐘和 15 分鐘的平均負載,這個訊息也可以透過 top
第 1 行的輸出得到相同資訊。
其意義簡述如下:
雖然我們知道 Load Average 常用來表示系統負載狀況,但這個數字本身不是百分比形式的。一個負載平均數為 1.0,在單核心 CPU 上意味著系統完全被使用,而在 4 核心 CPU 上則只佔用了 25% 的資源。
在作業系統中我們可以使用 /proc/cpuinfo
檔案裡的 processor 索引得知主機有多少 CPU 核心,編號索引由 0 開始。我們可以透過列方式快速得知內容:
student$ grep processor /proc/cpuinfo
processor : 0
processor : 1
processor : 2
processor : 3
從以上輸出可以得知主機上有 4 個 CPU 核心。因此在實務上我們可以透過 Load Average 的值,再和主機中的 CPU 核心數加以計算,讓它呈現百分比化,如此一來較容易進行評估。
如果想將負載平均數轉化為百分比形式,首先需要知道系統的 CPU 核心數量。然後,可用以下的計算方式:
假設一個 4 核心 CPU 系統的 1 分鐘負載平均數為 1.6,則其百分比化算法為:
( 1.6 / 4 ) * 100 = 40%
這意味著系統的負載為 40%。請注意,這種百分比化的方式並非絕對準確,但可以提供一個相對直觀的方式來理解系統負載。
在 Linux 作業系統中,記憶體使用情況是影響系統性能關鍵因素之一。正確地瞭解和管理記憶體資源能確保系統運行的順暢與效能。
在記憶體的檢查項目指標中,有幾個項目是我們關心的:
在實體伺服器主機中,我們會使用有 ECC(Error-Correcting Code)功能的記憶體,它是一種具有錯誤校正功能的記憶體,常用在需要高度可靠性的場景,比如資料庫。這類記憶體能自動修正單位錯誤,從而提高系統的穩定性。
在評估記憶體資訊前,我們要先瞭解資料、記憶體、CPU 運算與磁碟的關係。在談到主記憶體與作業系統的運作時,大部份管理員都知道它是用來儲存臨時資料的地方,但實際上他也做為資料 緩衝 (Buffer) 和 快取 (Cache) 的重要角色。這兩種機制讓主記憶體不僅僅是一個簡單的資料存儲區,更是提高效能的資料處理方式。
程式使用檔案進行處理完成後,再把結果儲存起來,雖然這是非常常見的應用,但是在系統核心中有相當多的步驟在執行,完整的資料流程甚至超出本書的範圍,以下為簡單概念流程說明:
透過 Buffer 和 Cache 的機制,主記憶體成為了一個高度動態和高效率的資料處理中心,提高系統的整體性能和反應速度。這些機制也有助於降低 CPU 與 I/O 裝置之間速度差異所可能帶來的性能瓶頸。
在 Linux 中為了提升檔案存取效率,會儘量充份使用記憶體空間做為快取,所以我們會常常看到在系統中 Buffer/Cache 的值大於實際使用量。
評估與量測
在作業系統中,我們可以使用 free
指令來檢查目前記憶體使用狀態,free
程式會讀取 /proc/meminfo
後再加以整理輸出,成為我們看到的結果,由於 free
預設輸出為 byte
來顯示,使用 -h
參數較能讓我們理解其使用單位。
輸出給果如下:
student$ free -h
total used free shared buff/cache available
Mem: 3.6Gi 308Mi 867Mi 73Mi 2.5Gi 3.0Gi
Swap: 2.0Gi 0B 2.0Gi
以上輸出在
top
輸出中,也有包含相同的資訊。
上述的輸出中,有 Mem 與 Swap 2 個項目:
Mem:
total
: 總共的物理記憶體大小(3.6Gi)。used
: 目前使用中的記憶體(308Mi),但不包括被當作 buff/cache
的記憶體。free
: 實際未使用的記憶體(867Mi)。buff/cache
: 被用作緩衝和快取的記憶體(2.5Gi)。available
: 能夠供新應用程式使用的記憶體(3.0Gi)。Swap:
total
: 總Swap空間(2.0Gi)。used
: 目前使用中的Swap空間(0B)。free
: 未使用的Swap空間(2.0Gi)。在一般日常維護中,有一些重要的維護指標需要檢查如下:
used
: 顯示多少記憶體正在被用於系統行程。這是系統真正正在使用的記憶體。free
: 顯示多少記憶體是完全未使用的,並可被分配給新的行程。buff/cache
: 顯示多少記憶體被用作緩衝(Buffers)和快取(Cached)。available
: 這是比 free
更重要的數字,因為它表示可以被應用程式使用而不會造成 Swap 的記憶體。used
和 free
: Swap 的使用狀況也非常重要。若 Swap 區域中的 used
非常高,可能代表系統記憶體不足。在這個例子中,available
的值是 3.0Gi,表示還有大量的「有效」記憶體可以被新的行程使用,即使 free
顯示為 867Mi。這是因為 buff/cache
內的記憶體大部分可以被迅速釋放並分配給需要的行程。
此外,Swap的 used
是 0B,表示記憶體是足夠的,沒有需要使用 Swap,這通常是一個好的指標。
一般來說,在維護時我們只檢查 free
是不夠的,也應該留意 available
數量以獲得系統記憶體真正可用狀況,並且確保 Swap 在低使用率的狀態。
由於現在的伺服器都已經被虛擬化,所以大部份的系統管理員對實際硬體層面的資源比較沒有控制權,但是 VM 層級的管理上,仍然需要留意磁碟與 I/O 的使用效率。
針對磁碟空間通常會很概括的檢測可用空間,我們會使用 df
工具來取得空間的使用狀況。
df
使用 -h
參數可以把容量轉換成合適單位讓我們查看,其輸出如下:
student$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdb2 50G 46G 4.2G 92% /
devtmpfs 16G 0 16G 0% /dev
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 16G 170M 16G 2% /run
tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/sda 894G 886G 8.7G 100% /VM
/dev/sdb1 1014M 180M 835M 18% /boot
tmpfs 3.2G 0 3.2G 0% /run/user/0
在上述的例子中,維護時我們會查看 /dev/
目錄開頭的資訊,這是實際上磁碟裝置的資訊。所以經過簡化之後分析如下:
除了我們熟知的檔案空間之外,還有另一個議題是:檔案數量查看。檔案數量指的是在一個磁碟區中,都會有可放置檔案的上限,這個上限在一開始規劃好檔案系統時就已經決定了,通常越大的容量會有較多的可存放數量,在 Linux 中不管是檔案或目錄都會占一個數量份額(1 個檔案 1 個)。
檔案和目錄在 Linux 檔案系統裡,他們的文件屬性是放在一個索引節點中,這個索引節點叫做 inode
,記載的項目大致如下:
我們可以使用 df
的 -i
參數,我們透過 grep 找出輸出表的第 1 行與 /dev
為開頭的資訊,得知每個掛載目錄可以存放的物件數量與使用量:
student$ df -i | grep -E '^\/dev|Filesystem'
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb2 26214400 38019 26176381 1% /
/dev/sda 18070760 384 18070376 1% /VM
/dev/sdb1 524288 334 523954 1% /boot
從上列輸出中我們可以看到每個磁碟可以存放的 Inode 數量與 Iused 數量。要特別注意的是,如果應用程式時時刻刻會寫入小檔案到指定目錄且沒有清理作業的話,就可能照成 IUsed 達到完全使用的狀態,此時就算有多餘的容量也無法再寫入。
在磁碟 I/O 的管理上,我們可能無法完全瞭解磁碟讀寫性能,但是能夠透過 I/O 數據查看某個時間點上磁碟操作特別頻繁,如果是非預期的時間點有大量的磁碟存取,那我們就必須進一步的介入檢查。
針對基本的磁碟 I/O 檢查,我們使用 iostat
加上 -d
參數,可以得到較多的數據,一共採樣 2 次,每次 相隔一秒,代表一秒內發生的數據,並取得其 1, 4, 5, 6, 7, 14 欄位,其結果如下:
student$ iostat -dx 1 2 | awk 'BEGIN {OFS="\t"}; NR > 6 {print $1, $4, $5, $6, $7, $14}'
Device: r/s w/s rkB/s wkB/s %util
sdb 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.00 0.00 0.00 0.00
透過上面的範例輸出,得出下列資訊:
以上的結果代表採樣期間沒有任何磁碟存取活動,使用率也很低。如果在非預期的時間點裡, %util
升高甚至到達 100% 的話代表系統對於磁碟操作很頻繁,此時我們就要查看是否有特定的程式活動;若是常態性又有重要系統在運作時,高 %util
代表磁碟的速度無法完全滿足系統操作的需求,在主機資源層面則需要考慮是否放寬 VM 的 I/O 限制或是提升儲存設備的存取能量。
以企業主的角度來看,任何的系統都希望是被充份應用的,尤其是對外的行銷/銷售等和營收有關的系統。這些期望應該會反應在網路流量上,我們很難看到在沒有用戶使用的情況下無故發生網路使用量變高,或是在高使用率的系統中沒有流量的產生。所以在一般的維護上可以透過基本檢查確認網路流量的變化。
在網路資訊檢查,我們使用 ethtool
來查看目前指定實體網路介面的連接狀況,包含了支援速度、目前速度與是否連接等。
ethtool
必須提供網路介面代號,可以透過 ip link show
取得所有介面,然後再取出輸出的代號與介面名稱:
student$ ip link show | grep '^[0-9]' | awk '{print $1, $2}'
1: lo:
2: eno1:
3: wlp1s0:
4: br0:
5: virbr0:
6: virbr0-nic:
以上輸出得出有 7 個代號,其中 eno1 是實體網路介面,針對我們找出的介面再使用 ethtool
檢查實體狀態:
student$ ethtool eno1
Settings for eno1:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
MDI-X: on (auto)
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes
從上面的輸出檢查,可看出目前該介面有和其它節點使用 1000Mb/s 的速度連接,該介面卡也支援了 10/100/1000 速度。
除了物理資訊外,使用 sar
指令也可以協助管理員取得系統當下的網路流量。
我們使用 sar -n DEV 1 1
取得網路資訊,每秒取樣一次,共輸出一次,最後只取 eno1
介面資訊。
其參考結果如下:
student$ sar -n DEV 1 1 | grep -E 'IFACE|eno1'
17:06:23 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
17:06:24 eno1 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: eno1 0.00 0.00 0.00 0.00 0.00 0.00 0.00
以上結果顯示,在取樣時間內 eno1 介面沒有任何流量產生。我們可以透過定期的查看來觀查流量變化,以便查出非預期的流量產生。