2017年6月14日 星期三

【Linux cmd】Linux下使用top來監控cpu使用率或記憶體使用率

top可以顯示系統各進程 (process) 狀態的文字模式工具,top 可以列出消耗系統資源最多的十多個進程。

通常我們會用這樣的方式來啟動top,意思是啟動top並且每秒更新狀態
#top -d 1

當啟動 top 後會顯示Process的數目、CPU 和 記憶體使用量等系統資訊,並預設會列出 CPU 使用率 (%CPU) 最高的十多個Process。另外我們可以按不同的按鍵來改變 top 顯示系統方式,包括按【M】鍵列出佔用最多記憶體的Process,【R】排列出 CPU 使用率最高的Process。另外常用的 top 命令有:
     【? 】或 【h】 - 顯示說明畫面。
     【q】 - 離開 top。
     【Space】或【Enter】 - 更新並重新繪畫整個畫面。
     【M】 - 進程依記憶體使用率 (%MEM) 由大至小排列。
     【T】 - 進程依總 CPU 時間 (TIME+) 由大至小排列。
     【I 】- 在 Solaris 和 Irix 模式切換,改變 CPU 使用率的計算方法。預設一般為 Irix 模式,
     【k】 - 終止某個進程。
     【r】 - 改變進程 nice 值,影響進程的優先序。
       ***process priority nice值範圍 -20 ~ +19,越小優先權越高,一般userSpace程式為0


下圖是進入top後的畫面:












整個 top 畫面主要分成三個區域,由上至下分別為:
     概要區 (Summary Area) - 顯示整個系統的資訊
     訊息/提示列 (Message/Prompt Line) - 顯示各命令的結果訊息或讓使用者輸入命令的參數,平常為一列空行。
     任務區 (Task Area) - 顯示各個task/process的資料。


概要區 (Summary Area) - 系統運作時間及平均負載
第一列顯示現時時間、系統運作時間 (up time)、使用者數目 (users) 和平均負載 (load average)。可以按 【l】 鍵切換是否顯示。



平均負載的三個數值分別為在平均過去 1 分鐘、5 分鐘和 15 分鐘在可運行或不可中斷狀態的進程數目。平均負載為 1.0 表示一個 CPU 被佔用所有時間。如果電腦有多個 CPU,平均負載的參考值亦會倍數增長。例如一個雙處理器雙核的電腦,所有 CPU 所有時間被完全佔用時的平均負載應該為 1.0 x 2 x 2 = 4.0。

任務資訊
第二列顯示任務 (task) 資訊,包括任務總數、運行中 (running)、睡眠中 (sleeping)、停止了(stopped) 和不能運作 (zombie) 的process數目。可以按 【t】 鍵切換是否和下一列 CPU 狀態列一同顯示。



CPU 使用率
第三列顯示 CPU 狀態,包括以下資訊:
us (user): 使用者空間 (user space) 佔用 CPU 百分比。此數值主要受較少 I/O 等系統呼叫的進程所影響。
sy (system): 核心空間 (kernel space) 佔用 CPU 百分比。一般在系統要處理大量 IRQ 或任務排程時,此值會較高。
ni (nice): nice 值比一般值 0 大 (優先序較低) 的進程佔用 CPU 百分比
id (idle): CPU 閒置時間百分比
wa (iowait): CPU 等待輸入/輸出的百分比。當些值過高 (如超過 30%),表示系統的儲存或網路 I/O 效能有問題。
hi (H/W Interrupt): CPU 處理硬體中斷時間的百分比。除光碟機不斷檢查是否有光碟外,一般此值不會太高。
si (S/W Interrupt): CPU 處理軟體中斷時間的百分比,此值很少機會會太高。
st: (Steal): 在如 Xen 等虛擬環境下 CPU 運作虛擬機器時間的百分比。太高表示可能需要停止一些虛擬機器。





您可以按 【t】鍵切換不同顯示方式。在多處理器 (multi-processor) 或多核 (multi-core) 系統上,您亦可以按 數字【1】鍵切換使用一列顯示整體 CPU 使用狀態還是每個 CPU 使用一列顯示其狀態。

記憶體和置換空間使用率
接下來的兩列分別顯示記憶體和置換空間 (swap space) 使用率。可以按 【m】 鍵切換是否顯示。




buffers (緩衝區) 表示被用作磁碟寫入快取 (write cache) 的記憶體大小。當系統記憶體不夠時,自然會把 buffers上的資料清出 (flush) 至磁碟並釋放有關記憶體。過大 buffers (超過幾百 MB) 一般表示儲存子系統有問題,導至buffers上的資料無法清出。
cache (快取) 則表示被使用作檔案讀取快取 (read cache) 的記憶體大小。同樣在記憶體不夠時,部份 cache 使用的記憶體會被釋放。當系統正進行大量讀取工作,此值若高會是不錯的現象。但如果此值在有大量讀取工作時過低 (少於總記憶體大小的四成),這表示系統到了需要增加記憶體的時候。
對大部份伺服器工作,當置換空間 (swap) 被使用時,一般都會拖慢整個系統。除 Oracle 等本身會盡用置換空間的服務外,一般伺服器在開始使用超過幾 MB 的置換空間時,就表示需要進行一些微調工作。


任務區 (Task Area)
任務區會顯示Process耗用系統資源的資訊。每個Process預設會顯示以下資料:









PID (Process ID) - Process ID
USER (Effective user name) - 執行此Process的owner。
PR (priority) - Process的優先值,數值越小表示進程的優先順序越高。
NI (nice) - Process的 nice 值,會影響進程的優先順序 (priority),可以為 20 至 -19 任何一個整數,數值越小會令進程的優先序越高。
VIRT (Virtual memory) - Process使用的總虛擬記憶體 (virtual memory) 大小,包括Process的程式碼、資料和共用程式庫再加上被置換 (swap out) 的空間,單位為 KiB。VIRT = SWAP + RES.
RES (Resident size) - Process非Swap的實體記憶體大小,單位為 KiB。RES = CODE + DATA
SHR (Shared Mem size) - Process使用的共用記憶體大小,也就是可以和其他進程共用的記憶體空間,單位為 KiB。
S (Stats) - Process的狀態,可以為:
   D (uninterruptible sleep) - 在不可中斷的休眠中 (一般為正在進行輸入/輸出)
   R (running) - 在運行中或可以被運行 (即在運行序列 run queue)
   S (sleeping) - 在可以被中斷的休眠中 (一般是正在等待某事件完結)
   T (traced or stopped) - 已被停止。因工作控制訊號 (job control signal) 或Process在被追蹤中。
   Z (Zombie) - 不能運作的進程,即所謂殭屍進程。一般因為已終止但未能被其母進程成功接收的進程。
%CPU (CPU usage) - 由上次 top 畫面更新資料後Process的 CPU 使用率。為Process佔用的 CPU 時間除以實際時間 (CPU 時間 / 實際時間),以百分比顯示。顯示小數點後一個位。可以按 I 鍵切換 Irix 模式 (一般計算方法) 和 Solaris 模式 (一般的 CPU 使用率再除系統的處理器數目) 改變此欄顯示的數值。
%MEM (Memory usage) - Process佔用實體記憶體大小與系統總實體記憶體大小的比例,以百分比顯示。
TIME+ (CPU Time) - 由進程被啟動至今的總 CPU 時間。可以按 S 鍵切換是否開啟累計模式 (Cumulative mode) 改變此欄顯示的數值。
COMMAND (Command line or Program name) - 啟動Process的命令,可以按 c 鍵切換只顯示程式名稱或整個連參數的命令行。


主要命令:
  • ? 或 h - 顯示說明畫面。
  • q - 離開 top。
  • 【Space】【Enter】 - 更新並重新繪畫整個畫面。
  • d 或 s - 改變畫面更新時間。
  • z - 切換單色或彩色顯示模式。
  • B - 切換是否以粗體強調重要資料。
  • c - 切換進程命令欄只顯示命令本身還是連參數顯示整個命令。
  • f - 改變會顯示的進程資料欄目。
  • o - 改變顯示進程的排序方法。
  • M - 進程依記憶體使用率 (%MEM) 由大至小排列。
  • N - 進程依 PID 由大至小排序。
  • P - 進程依 CPU 使用率 (%CPU) 由大至小排列,預設一般使用此方法排列。
  • T - 進程依總 CPU 時間 (TIME+) 由大至小排列。
  • I - 在 Solaris 和 Irix 模式切換,改變 CPU 使用率的計算方法。預設一般為 Irix 模式,
  • u - 監察有效 UID (effective UID) 為個別使用者的進程。
  • U - 監察個真正/有效 UID 為別使用者的進程。
  • i - 切換只顯示活躍進程 (不顯示閒置進程 idle process) 或所有進程,預設一般顯示所有進程
  • n - 設定顯示最多進程數目,預設一般會盡用畫面的空間顯示最多的進程。
  • = - 解除如 u/U/i/n 等命令或 -p 選項監察進程的過濾,顯示所有進程。
  • x - 切換是否以粗體或反白強調排序的進程資料欄目。
  • y - 切換是否以粗體或反白強調正在運行的進程。
  • b - 切換 x/y 命令強調的資料以粗體還是反白顯示。
  • k - 終止某個進程。
  • r - 改變進程 nice 值,影響進程的優先序。
  • l - 切換是否顯示系統運作時間 (up time) 和平均負載 (load average)。預設會顯示。
  • m - 切換是否顯示記憶體和置換空間 (swap space) 使用率。預設會顯示。
  • t - 切換是否顯示進程 (task) 和 CPU 狀態。預設會顯示。
  • 1 - 切換以一列顯示所有 CPU 的平均狀態還是每一個 CPU 顯示一列狀態資訊。預設會只顯示一列平均狀態。


更詳細的內容請參考以下的鏈結:
http://wiki.linux.org.hk/w/Monitor_processes_with_top

2017年6月2日 星期五

Makefile當中 CFLAGS, LDFLAGS, LIBS的使用方法

1. 首先是CFLAGS: 
       說明: 在Makefile當中這個變數是用來指定header所在的位置
       用法: CFLAGS=-I/usr/include/ -I/usr/local/include (指定兩個以上用空白隔開)

2. LDFLAGS:
       說明: 用來指定編譯時所需要用到的Library的路徑位置
       用法: LDFLAGS=-L/usr/lib -L/lib/ (指定兩個以上用空白隔開)

3. LIBS:
       說明: 用來告訴Makefile需要用到的Library檔名叫做甚麼
       用法: LIBS=-lpthread -lz