Linux 系統監控工具 atop

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

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

如上圖所示, atop 的界面分爲上半部分的系統監控項和下半部分的進程列表。正則表達式

atop 每10s更新一次系統監控項以及在這段時間內狀態發生變化的進程,按下A鍵能夠查看所有進程。sql

系統狀態

進程

第一行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):tcp

  • 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。

相關文章
相關標籤/搜索