1. 程式人生 > >Linux 系統監控工具 atop

Linux 系統監控工具 atop

系統監控是運維工作中重要的一環,本文以 atop 工具為例來介紹系統的重要監控項。

atop可以使用yum或apt包管理器進行安裝。atop man page 中詳細說明了 atop 中各監控項含義及atop命令用法。

如上圖所示, atop 的介面分為上半部分的系統監控項和下半部分的程序列表。

atop 每10s更新一次系統監控項以及在這段時間內狀態發生變化的程序,按下A鍵可以檢視全部程序。

  • 系統狀態
    • 程序
    • CPU
    • 記憶體
    • 磁碟
    • 網路
  • 程序列表
    • 預設檢視
    • 記憶體檢視
    • 排程檢視
  • 監控服務

系統狀態

程序

第一行PRC顯示總體程序狀況:

  • sys, user 表示 CPU 在核心態和使用者態的執行時間比例
  • #proc 為當前總程序數,
    • #trun 表示 running 狀態執行緒數
    • #tslpi 表示 sleeping interruptible 狀態的進執行緒數
    • #tslpu 表示 sleeping uninterruptible 狀態執行緒數
    • #zombie 表示殭屍程序數
  • clones 表示在監控週期(預設10s)內 clone() 系統呼叫次數

linux 中程序有兩種 sleep 狀態:

  • interruptible sleep: 程序接收系統訊號,可以被系統訊號中斷
  • uninterruptible sleep: 程序不接收系統訊號,不可被系統訊號中斷,包括kill -9 (SIGKILL 訊號)。此狀態的程序通常在等待系統資源,如磁碟IO或網路IO。

一個程序使用fork建立子程序,如果子程序退出,而父程序並沒有呼叫wait或waitpid獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中,這種程序稱之為殭屍程序。大量殭屍程序可能會佔用程序描述符空間導致無法建立程序。

孤兒程序是容易與殭屍程序混淆的一類程序,孤兒程序是父程序終止的程序,它們會被 init 程序接管並不會產生危害。

CPU

在 atop 中每個 CPU 邏輯核心擁有一個 cpu 行表示自身狀態, 最前面的 CPU 行則展示系統總覽。

  • sys 表示CPU在核心態工作時間比例
  • user 表示 CPU 在使用者態工作時間比例
  • irq 表示 CPU 處理系統中斷所消耗的時間比例
  • idle 表示 CPU 空閒時間比例

CPL 行表示 CPU 負載(CPU Load):

  • avg1, avg5, avg15: 過去 1min、5min和 15min 內的平均系統負載
  • csw 表示監控週期內上下文切換的次數
  • intr 表示監控週期內中斷髮生的次數

系統負載

CPU 負載或稱為系統負載是一個容易被誤解的監控項,它的定義為核心執行佇列中 running 或 uninterruptible sleep 狀態的程序的平均數與CPU計算能力的比值。

系統負載 1.0 說明CPU恰好滿載,當系統負載大於1.0時會有程序因為等待CPU而阻塞。在多核系統中,系統負載等於CPU核心數表示恰好滿載,如在上圖所示雙核系統中,load=2說明恰好滿載。

上文已經說明,uninterruptible sleep 程序通常是在等待IO, 當網路異常或磁碟故障時會導致大量程序處於 uninterruptible sleep 狀態從而導致 Load 急劇上升。

在常見的伺服器程式大多數為IO密集型程式,常見的CPU密集型任務包括:

  • 大規模的排序計算, 如 mysql filesort
  • 大量的正則表示式匹配
  • 大量的 Hash Code 計算
  • 大規模的加解密或壓縮解壓計算

當我們發現 CPU 使用率上升時,我們可以優先考慮是否在上述CPU密集型任務。

記憶體

MEM 行描述記憶體使用情況:

  • tot: 實體記憶體總量
  • free: 空閒記憶體總量
  • cache: 頁快取用量
  • buff: 檔案系統元資料快取用量
  • slab: 系統核心記憶體用量
  • dirty: 需要寫回磁碟的髒頁用量,這部分記憶體使用已包含在cache中

頁快取是 Linux 處理檔案IO的機制,由於磁碟的讀寫速度遠遠低於記憶體和CPU的執行速度,因此核心將檔案對映為頁快取在記憶體中,CPU 讀取檔案時首先訪問頁快取,若目標頁未被快取則會產生一個頁缺失中斷,中斷處理器會從磁碟中讀取檔案載入到記憶體中,必要時會將不常用的頁從記憶體中逐出。

與讀取過程類似,CPU 不會直接寫磁碟而是將更改寫入相應的頁,修改後的頁就會成為髒頁(dirty page), 髒頁的內容會被非同步地寫入磁碟。

在一些文件中 buff 被籠統地稱為檔案系統快取,在 man page 中 buff 的定義為 the amount of memory used for filesystem meta data 即檔案系統元資料快取。

PAG 行表示頁快取的使用情況:

  • scan: 當可用記憶體不足時掃描的頁數,這個值過高說明可用記憶體不足
  • stall: 核心緊急將頁載入到記憶體中的次數,這個值過高說明可用記憶體不足
  • steal: 虛擬機器相關指標
  • swin: 從 Swap 分割槽將頁載入到記憶體的次數
  • swout: 將記憶體頁寫入 Swap 分割槽的次數

scan 和 steal 的解釋比較難理解,附上 man page 中的原文:

This line contains the number of scanned pages ('scan') due to the fact that free memory drops below a particular threshold and the number times that the kernel tries to reclaim pages due to an urgent need ('stall')

SWP 行表示 Swap 分割槽使用狀態:

  • tot: Swap 分割槽總大小
  • free: Swap 分割槽空閒空間大小

當實體記憶體不足時,核心會將程序記憶體中不常用的頁逐出記憶體寫入磁碟中的 Swap 分割槽,當程序需要讀取這些頁時再將它們從磁碟中載入到記憶體。

磁碟

DSK 列描述磁碟使用情況:

  • vda: 該列為磁碟裝置名,每個裝置擁有一行
  • busy: 裝置處理IO請求的時間佔比
  • read: 監控週期內讀請求數
  • write: 監控週期內寫請求數
  • KiB/r: 每次讀請求的平均資料量
  • KiB/w: 每次寫請求的平均資料量
  • MBr/s: 每秒讀取的資料量
  • MBw/s: 每秒寫入的資料量
  • avq: io 佇列的平均長度
  • avio: 單次讀寫請求需要的毫秒數

網路

網路層通常包含 transport、network、 eth 和 lo 行, 分別表示傳輸層、網路層、乙太網(資料鏈路層)和本地迴環的監控指標。

  • tcpi/udpi/ipi: 接收的 tcp/udp/ip 資料包
  • tcpo/udpo/ipo : 發出的 tcp/udp/ip 資料包
  • tcpao: 主動建立的tcp連線數(active open)
  • tcppo: 被動建立的tcp連線數(passive open), 即通過 listen() 建立的連線數
  • tcprs: tcp 重傳次數
  • tcpie: 讀取時發生錯誤的次數

程序列表

程序列表有多個檢視分別展示不同方面的資料:

  • 預設檢視(Generic information): 按G鍵回到預設檢視
  • 記憶體檢視(Memory information): 按M鍵進入記憶體檢視,顯示程序的記憶體佔用情況
  • 命令列檢視(Command Line information): 按C鍵進入命令列檢視,顯示程序啟動時詳細命令列引數
  • 排程器檢視(Scheduling information): 按S鍵進入檢視,顯示執行緒排程、CPU使用和執行統計
  • 磁碟檢視(Disk information): 按D鍵進入檢視,顯示程序的磁碟IO使用情況
  • 網路檢視(Network information): 按N鍵進入檢視,顯示程序的網路IO使用情況

atop 預設展示過去10s內狀態發生變化的程序,按下A鍵可以檢視全部程序。

預設檢視

預設檢視展示常用的監控項:

  • PID: 程序ID
  • SYSCPU: 在核心態下使用CPU時間
  • USERCPU: 在使用者態下使用CPU時間
  • VGROW: 過去一個監控週期內程序的虛擬記憶體空間增長,包括malloc()分配記憶體、使用共享記憶體以及free()釋放記憶體造成的空間變化
  • RGROW: 過去一個監控週期內程序常駐記憶體空間(resident memory)增長, 即程序記憶體空間中駐留在實體記憶體中未被逐出到SWAP分割槽的部分。
  • RUID, EUID, SUID: 啟動程序的UID
    • RUID: 登入時的使用者ID
    • EUID: Effective Uid。通常EUID=RUID, setuid 或 sudo 等指令能以另一個使用者身份執行命令,這個被“代理”的使用者即為 Effective User。
  • EXC: 程序退出時的返回碼
  • THR: 程序中的執行緒數
  • S: 程序狀態,與ps命令的程序描述符相同

簡單介紹一下程序狀態

  • R: Runing
  • S: sleeping interruptible 等待某個事件
  • D: sleeping non-interruptible 通常在等待IO
  • Z: Zombie 殭屍程序
  • E: 程序在上個監控週期內退出
  • T: TASK_STOPPED 或 TASK_TRACED 狀態
    • TASK_STOPPED: 程序收到 SIGSTOP 訊號進入暫停狀態
    • TASK_TRACED: 程序進入暫停狀態等待跟蹤它的程序,比如程序被 gdb 的斷點暫停

記憶體檢視

按M鍵可以進入記憶體檢視檢視程序的記憶體使用情況:

  • MINFLT: 程序缺頁小錯誤(minor page fault)的次數
  • MAJFLT: 程序缺頁大錯誤(major page fault)的次數
  • VSIZE: 虛擬記憶體空間的總大小
  • RSIZE: 常駐記憶體(resident memory)的總大小
  • VGROW: 虛擬記憶體空間在上個監控週期的增長
  • RGROW: 虛擬記憶體空間在上個監控週期的增長
  • MEM: 實體記憶體使用佔比

在 Linux 的記憶體管理系統中需要讀取磁碟才能解決缺頁中斷稱為大錯誤(Major Page Fault), 不需要讀取磁碟可以解決的缺頁中斷被稱為小錯誤(Minor Page Fault)。

一般情況下 MINFLT 是因為頻繁分配/回收大記憶體塊導致的,可以考慮使用記憶體池優化程式來減少缺頁錯誤; MAJFLT 是由於實體記憶體不足導致。

排程檢視

按S鍵可以進入排程檢視(Scheduling View)檢視程序執行和CPU情況:

  • TRUN: running 狀態的執行緒數
  • TSLPI: sleeping interruptible 狀態執行緒數
  • TSLPU: 表示 sleeping uninterruptible 狀態程序數
  • PILI: 排程策略
  • PRI,NICE: 優先順序,PRI+NICE越低優先順序越高
  • CPU: CPU 使用時間佔比

監控服務

除了檢視當前的狀態外,atop 還可以服務方式執行在後臺監控並記錄系統狀態。

使用 service atop startsystemctl start atop 命令啟動atop監控服務。

atop 預設將資料儲存在/var/log/atop目錄下,10 分鐘採集一次,保留最近28天的資料。上述配置可以在 /etc/atop/atop.daily 檔案中進行修改。

使用 atop -r <filename> 命令讀取日誌檔案。按t鍵向前翻頁,T鍵向後翻頁,b鍵跳轉到指定時間,時間格式為hh:mm