iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0

系統資源使用情況

在 Linux 環境中,瞭解和判別系統資源使用情況是至關重要的。這不僅有助於提前預警可能出現的問題,也是提升系統性能的基礎。但在我們探討之前,首先需要明確哪些項目值得關注。

  • CPU使用率
  • 系統負載
  • 記憶體使用情況
  • 磁碟空間和 I/O
  • 網絡流量

在作業系統中知道使用什麼工具得到上列資訊是第一步,實際的資源管理更是一個持續的過程。例如,發現 CPU 使用率持續高時,不只是需要關注,更可能是要進行程式優化或硬體升級。

瞭解和妥善管理系統資源使用情況是任何健全 IT 環境中不可或缺的一部分。透過對重要項目的觀查,乃至於持續監控和實際應用,不僅能確保系統的穩定運作,還能提升整體的性能和安全性。

CPU使用率

系統預設會提供 top 指令讓管理者即時進行系統監控。它能即時地提供系統運行狀態,包括 CPU 使用率、記憶體使用量、正在運行的行程列表、以及其他各種系統資源的狀況。

top 的常用資訊如下:

  1. CPU 使用率: 顯示系統單個或多個 CPU 核心的使用率。
  2. 記憶體和交換區狀態: 顯示系統 RAM 和 Swap 的使用狀況。
  3. 行程資訊: 列出目前正在運行的行程並顯示它們的運行狀態、CPU 和記憶體使用率等。
  4. 負載平均: 顯示 1 分鐘、5 分鐘和 15 分鐘的平均負載。

登入系統後,使用終端機執行 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)來表示。

影響系統負載的原因有很多,實務上發生高負載的原因如下,供讀者參考:

  1. 核心數量: 擁有多個核心的系統可以處理更多的負載。因此,負載平均值應與核心數量相比較。如果負載平均值超過核心數(通常也包含啟用 Hyper Threading 後的加總),我們通常會將它認為系統過載。
  2. I/O 狀態: 如果系統負載高,但 CPU 使用率不高,那麼可能是 I/O(輸入/輸出)造成的。在這種情況下,需要查看I/O 使用情況。
  3. 記憶體使用: 如果記憶體使用接近或已達上限,則系統可能會變慢,這也會影響負載平均值。
  4. 其他資源: 網路頻寬、磁磁空間等也是可能影響系統負載的因素。
  5. 行程狀態: 需要注意是否有異常的行程(例如 CPU 或記憶體使用過高)影響整體負載。

通過綜合評估這些因素,可以更準確地判斷系統的實際負載狀態,從而採取適當的處理方式。

在作業系統中,我們透過 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 行的輸出得到相同資訊。

其意義簡述如下:

  • 1 分鐘: 這個數字表示最近 1 分鐘的即時負載狀態,較適用於觀察短期變化。
  • 5 分鐘: 這個數字相對平穩,適合用來評估系統的中期狀態。
  • 15 分鐘: 這是一個長期的平均值,能夠提供對系統穩定性和性能的整體評估。

雖然我們知道 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 核心數量。然後,可用以下的計算方式:

  • (負載平均數 / 核心數量) * 100 = 負載百分比

假設一個 4 核心 CPU 系統的 1 分鐘負載平均數為 1.6,則其百分比化算法為:

( 1.6 / 4 ) * 100 = 40%

這意味著系統的負載為 40%。請注意,這種百分比化的方式並非絕對準確,但可以提供一個相對直觀的方式來理解系統負載。

記憶體使用情況

在 Linux 作業系統中,記憶體使用情況是影響系統性能關鍵因素之一。正確地瞭解和管理記憶體資源能確保系統運行的順暢與效能。

在記憶體的檢查項目指標中,有幾個項目是我們關心的:

  • 使用中的記憶體(Used Memory): 現行正被行程使用的記憶體量。
  • 可用記憶體(Free Memory): 目前未被使用,可供新行程使用的記憶體。
  • 緩衝(Buffers): 行程用於儲存臨時資料的記憶體空間。
  • 快取(Cached): 用於儲存頻繁訪問的文件或數據的內容,以提高 I/O 性能。
  • Swap 使用率: 當物理記憶體不足時,部分數據會被移動到 Swap 空間。

在實體伺服器主機中,我們會使用有 ECC(Error-Correcting Code)功能的記憶體,它是一種具有錯誤校正功能的記憶體,常用在需要高度可靠性的場景,比如資料庫。這類記憶體能自動修正單位錯誤,從而提高系統的穩定性。

在評估記憶體資訊前,我們要先瞭解資料、記憶體、CPU 運算與磁碟的關係。在談到主記憶體與作業系統的運作時,大部份管理員都知道它是用來儲存臨時資料的地方,但實際上他也做為資料 緩衝 (Buffer) 和 快取 (Cache) 的重要角色。這兩種機制讓主記憶體不僅僅是一個簡單的資料存儲區,更是提高效能的資料處理方式。

程式使用檔案進行處理完成後,再把結果儲存起來,雖然這是非常常見的應用,但是在系統核心中有相當多的步驟在執行,完整的資料流程甚至超出本書的範圍,以下為簡單概念流程說明:

  1. 從硬碟讀取: 當需要讀取儲存在硬碟上的資料時,作業系統會先將這些資料載入到記憶體 Cache,再對應到行程的 Buffer。
  2. CPU 處理: 當 CPU 需要這些資料時,它會首先查詢 CPU 內部快取。如果找不到,則會從行程 Buffer 或直接從主記憶體中讀取。
  3. 回寫硬碟: 在資料被修改後,Buffer 裡被修改的資料會被註記,直到有適當的時機再寫回硬碟。

透過 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 個項目:

  1. Mem

    • total: 總共的物理記憶體大小(3.6Gi)。
    • used: 目前使用中的記憶體(308Mi),但不包括被當作 buff/cache 的記憶體。
    • free: 實際未使用的記憶體(867Mi)。
    • buff/cache: 被用作緩衝和快取的記憶體(2.5Gi)。
    • available: 能夠供新應用程式使用的記憶體(3.0Gi)。
  2. Swap

    • total: 總Swap空間(2.0Gi)。
    • used: 目前使用中的Swap空間(0B)。
    • free: 未使用的Swap空間(2.0Gi)。

在一般日常維護中,有一些重要的維護指標需要檢查如下:

  1. used: 顯示多少記憶體正在被用於系統行程。這是系統真正正在使用的記憶體。
  2. free: 顯示多少記憶體是完全未使用的,並可被分配給新的行程。
  3. buff/cache: 顯示多少記憶體被用作緩衝(Buffers)和快取(Cached)。
  4. available: 這是比 free 更重要的數字,因為它表示可以被應用程式使用而不會造成 Swap 的記憶體。
  5. Swap usedfree: Swap 的使用狀況也非常重要。若 Swap 區域中的 used 非常高,可能代表系統記憶體不足。

在這個例子中,available 的值是 3.0Gi,表示還有大量的「有效」記憶體可以被新的行程使用,即使 free 顯示為 867Mi。這是因為 buff/cache 內的記憶體大部分可以被迅速釋放並分配給需要的行程。

此外,Swap的 used 是 0B,表示記憶體是足夠的,沒有需要使用 Swap,這通常是一個好的指標。

一般來說,在維護時我們只檢查 free 是不夠的,也應該留意 available 數量以獲得系統記憶體真正可用狀況,並且確保 Swap 在低使用率的狀態。

磁碟空間和 I/O

由於現在的伺服器都已經被虛擬化,所以大部份的系統管理員對實際硬體層面的資源比較沒有控制權,但是 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/ 目錄開頭的資訊,這是實際上磁碟裝置的資訊。所以經過簡化之後分析如下:

  • / 目錄: 使用了 92% 空間,雖然還有 4.2G 的可用空間,但這有可能是被大檔案或是沒有清掉的垃圾所佔滿,這需要進一步檢查。
  • /VM: 這個目錄有獨立的磁碟空間,但是已經使用了 100%,這種被獨立出來又快要用滿的情況我們需要特別留意,可能是應用程式產生的資料會放在這邊,如果讓磁碟完全用滿則可能會造成應用程式異常。
  • /boot: 這是一個健康的目錄,它被獨立出來,但使用空間只用了 18%,代表這個目錄的空間還很充足。

除了我們熟知的檔案空間之外,還有另一個議題是:檔案數量查看。檔案數量指的是在一個磁碟區中,都會有可放置檔案的上限,這個上限在一開始規劃好檔案系統時就已經決定了,通常越大的容量會有較多的可存放數量,在 Linux 中不管是檔案或目錄都會占一個數量份額(1 個檔案 1 個)。

檔案和目錄在 Linux 檔案系統裡,他們的文件屬性是放在一個索引節點中,這個索引節點叫做 inode,記載的項目大致如下:

  • 文件類型: 標識這是一個普通檔案、目錄、符號鏈接還是其他類型的項目。
  • 權限: 文件的存取權限(讀、寫、執行等)。
  • 擁有者和群組: 文件的擁有者和所屬群組的 ID。
  • 時間戳記: 包括文件的創建時間、最後訪問時間和最後修改時間。
  • 文件大小: 文件的大小。
  • 數據位置指向: 指向存儲實際文件數據在磁碟中的確切位置。
  • 鏈接數量: 文件或目錄的硬鏈接數量。

我們可以使用 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

透過上面的範例輸出,得出下列資訊:

  • sdb 和 sda 都沒有讀寫操作(r/s 和 w/s 為 0)。
  • 讀取和寫入的速度(rkB/s 和 wkB/s)也是 0。
  • 磁碟的利用率(%util)也是 0,這意味著磁碟沒有被利用。

以上的結果代表採樣期間沒有任何磁碟存取活動,使用率也很低。如果在非預期的時間點裡, %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 介面沒有任何流量產生。我們可以透過定期的查看來觀查流量變化,以便查出非預期的流量產生。


上一篇
Day 15: 行程運作與硬體資源
下一篇
Day 17: 系統行程管理
系列文
Linux 升華:初學者的探索到專家的洞察30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言