概述
本系列主要講解Linux執行時命令,包括網路、磁碟、記憶體、CPU相關引數等,主要是為了分享怎麼透過常見的 Linux 命令去排查相關問題。比如:
-
發現機器的CPU負荷比較高,那麼怎麼查到是哪個程序CPU佔用率比較高?
-
磁碟IO的寫入很頻繁,怎麼查到是哪個程序或執行緒對磁碟IO頻繁的操作?等等。
本系列就是分享諸如這類問題的排查技巧。注意,本系列的核心方向不是去講解Linux的命令查詢、顯示當前目錄等(比如ls、cat等)基礎命令操作。本系列的重點分享內容包括:
-
Linux基礎命令和工具。
-
CPU效能監控。
-
記憶體效能監控。
-
檔案IO效能監控。
-
網路IO效能監控。
強烈推薦:Linux 大牛,Netflix 高階效能架構師 Brendan Gregg的部落格http://www.brendangregg.com。《效能之巔》書籍就是他出版的,主要分為:CPU、記憶體、磁碟、網路四大塊。
下面對應的命令大部分都不是專為某一個模組設計的。所以先把基本的命令都掌握,再去細分每個命令的側重點。
1.1、監控
常用的命令:
工具 | 描述 |
---|---|
free | 顯示系統記憶體使用情況,包括使用的記憶體、空閒的記憶體、快取和交換區等資訊。 |
ping | 用於測試網路連線的工具,透過向目標主機傳送 ICMP 回顯請求並等待回覆來測量網路延遲。 |
vmstat | Virtual Memory Statistics,虛擬記憶體統計工具,提供系統記憶體、程序、CPU活動等資訊。 |
iostat | 用於報告中央處理器(CPU)統計資訊和整個系統、介面卡、tty 裝置、磁碟和 CD-ROM 的輸入/輸出統計資訊。 |
dstat | 顯示了cpu使用情況,磁碟io情況,網路發包情況和換頁情況,輸出是彩色的,可讀性較強,相對於vmstat 和iostat 的輸入更加詳細且較為直觀。 |
pidstat | 監控所有或指定程序的資源佔用情況,如CPU、記憶體、裝置IO、任務切換、執行緒等。 |
top | 動態顯示系統效能資訊,包括負載、程序狀態、CPU 使用率、記憶體使用及交換分割槽的資訊。 |
iotop | LINUX程序實時監控工具,類似於 top 命令的工具,用於實時監控磁碟 I/O 使用情況及程序的資訊。 |
htop | 互動式程序檢視器,提供使用者友好的介面,支援按鍵操作以管理程序。一個文字模式的應用程式(在控制檯或者X終端中),需要ncurses 。 |
mpstat | 報告 CPU 的統計資訊,顯示每個 CPU 的使用情況,有助於分析 CPU 效能。 |
netstat | 顯示與 IP、TCP、UDP 和 ICMP 協議相關的網路連線和統計資訊。一般用於檢驗本機各埠的網路連線情況。 |
ps | 顯示當前程序的狀態和相關資訊,類似於 Windows 的工作管理員。 |
strace | 跟蹤程式執行過程中產生的系統呼叫及接收到的訊號,用於診斷程式問題。 |
ltrace | 跟蹤程序呼叫的庫函式,幫助分析程式的庫函式使用情況。 |
uptime | 顯示系統當前執行時間和負載資訊,為使用者提供系統負載狀態的一個快照。能夠列印系統總共執行了多長時間和系統的平均負載,uptime命令最後輸出的三個數字的含義分別是1分鐘,5分鐘,15分鐘內系統的平均負荷。 |
lsof | 列出當前系統中開啟的檔案及相關程序,幫助識別檔案使用情況。 |
perf | Linux kernel 自帶的效能分析工具,幫助識別程式效能瓶頸,透過分析 CPU 使用情況及熱點函式。是Linux kernel自帶的系統效能最佳化工具。優勢在於與Linux Kernel的緊密結合,它可以最先應用到加入Kernel的new feature,用於檢視熱點函式,檢視cashe miss的比率,從而幫助開發者來最佳化程式效能。 |
tcpdump | 網路抓包工具,捕獲和分析網路資料包,常用於網路故障排查和監控。 |
sar | 收集和報告系統活動資訊,涵蓋 CPU、記憶體、I/O、網路等效能指標。 |
blktrace | 跟蹤塊裝置 I/O 操作,分析系統的磁碟 I/O 效能及行為。 |
下面這張圖是 Brendan Gregg 提供的一個效能最佳化命令集。可以看到有很多命令可以監控系統的效能,比如檔案系統相關、呼叫棧相關、網路相關等的命令。
1.2、測試
sysbench是一個模組化、跨平臺、多執行緒基準測試工具,可用於以下效能測試:
-
CPU效能。
-
磁碟IO效能。
-
排程程式效能。
-
記憶體分配及傳輸速度。
-
POSIX執行緒效能。
-
資料庫效能(OLTP基準測試)。
Linux CPU使用率主要是從以下幾個維度進行統計:
指標 | 描述 |
---|---|
%usr |
普通程序在使用者模式下執行的時間 |
%sys |
程序在核心模式下的執行時間 |
%nice |
被提高優先順序的程序在使用者模式下的執行時間 |
%idle |
空閒時間 |
%iowait |
等待I/O完成的時間 |
%irp |
處理硬中斷請求花費的時間 |
%soft |
處理軟中斷請求花費的時間 |
%steal |
是衡量虛擬機器CPU的指標,是指分配給本虛擬機器的時間片被同一宿主機別的虛擬機器佔用,一般%steal值較高時,說明宿主機的資源使用已達到瓶頸。 |
一般情況下,CPU大部分的時間片都是消耗在使用者態和核心態上。
sys
和user
間的比例是相互影響的,%sys
比例高意味著被測服務頻繁的進行使用者態和系統態之間的切換,會帶來一定的CPU開銷,這樣分配處理業務的時間片就會較少,造成系統效能的下降。對於IO密集型系統,無論是網路IO還是磁碟IO,一般都會產生大量的中斷,從而導致%sys
相對升高,其中磁碟IO密集型系統,對磁碟的讀寫需要佔用大量的CPU,會導致%iowait
的值一定比例的升高,所以當出現%iowait
較高時,需排查是否存在大量的不合理的日誌操作,或者頻繁的資料載入等情況;
1.3、最佳化
Linux Performance Tuning Tools的示意圖,展示了Linux系統中不同的工具及其對應的元件。
grep 搜尋字元
grep
命令用於在檔案中執行關鍵詞搜尋,並顯示匹配的效果。
基本語法:
grep [選項] 模式 [檔案...]
部分常用選項:
引數 | 作用 |
---|---|
-c | 僅顯示找到的行數 |
-i | 忽略大小寫 |
-n | 顯示行號 |
-v | 反向選擇,僅列出沒有關鍵詞的行。v 是 invert 的縮寫。 |
-r | 遞迴搜尋檔案目錄 |
-C n | 列印匹配行的前後n行 |
-E |
使用擴充套件正規表示式。 |
-l |
僅顯示包含匹配行的檔名。 |
-h |
不顯示檔名。 |
-w |
僅匹配整個單詞。 |
-o |
僅顯示匹配的模式。 |
-q |
靜默模式,不輸出任何內容。 |
-A n |
顯示匹配行及其後面的 n 行。 |
-B n |
顯示匹配行及其前面的 n 行。 |
-f 檔名 |
從檔案中讀取模式。 |
基本正規表示式:
-
.
:匹配任意單個字元。 -
*
:匹配前一個字元零次或多次。 -
[]
:匹配括號內的任意一個字元。 -
[^]
:匹配括號內以外的任意一個字元。 -
\
: 跳脫字元,用於匹配特殊字元。 -
^
:匹配行首。 -
$
:匹配行尾。 -
|
:或運算子。 -
()
:分組運算子。
擴充套件正規表示式:
-
+
:匹配前一個字元一次或多次。 -
?
:匹配前一個字元零次或一次。 -
{}
:匹配前一個字元指定次數。
示例:
-
在指定檔案查詢,查詢login關鍵字。
grep login ImUser.cpp
-
多個檔案中搜尋。
grep login ImUser.cpp MsgConn.cpp
-
在多個檔案搜尋的時候,可以使用萬用字元。在以 cpp結尾的檔案中,搜尋包含login 的行
grep login *.cpp
-
遞迴搜尋目錄下所有檔案, 搜尋 msg_server目錄下所有檔案,列印出包含 login的行。
grep login -r msg_server/
-
反向查詢,查詢檔案中,不包含 CImUser 的行。
grep -v CImUser ImUser.cpp
-
找出檔案中包含 login的行,並列印出行號。
grep -n login ImUser.cpp
-
找出檔案中包含 login的行,列印出行號,並顯示前後3行。
grep -C 3 -n login ImUser.cpp
-
找出檔案中包含 login的行,列印出行號,並顯示前後3行,並忽略大小寫。
grep -C 3 -i -n login ImUser.cpp
注意事項:
-
grep
命令通常用於處理文字檔案,但也支援從標準輸入讀取資料。 -
grep
命令的效率取決於模式的複雜度和檔案的大小。 -
grep
命令可以與其他命令結合使用,例如管道
和重定向
。
其他相關命令:
-
egrep
:等價於grep -E
,使用擴充套件正規表示式。 -
fgrep
:等價於grep -F
,使用固定字串匹配。 -
ag
:更快更強大的搜尋工具。
03
find 查詢檔案
find
命令用於在檔案系統中搜尋檔案和目錄,並對找到的專案執行操作。透過檔名查詢檔案的所在位置,檔名查詢支援模糊匹配。
基本語法:
find [起始目錄] [選項] [表示式]
引數:
-
起始目錄
: 指定搜尋的起始目錄。如果省略,則預設從當前目錄開始搜尋。 -
選項
: 用於控制搜尋行為和輸出結果。 -
表示式
: 用於描述要搜尋的目標檔案或目錄。
主要選項:
選項 | 作用 |
---|---|
-name 模式 |
根據檔名匹配模式搜尋。支援萬用字元 * 和 ? 。 |
-iname 模式 |
根據檔名匹配模式搜尋,忽略大小寫。 |
-type 型別 |
根據檔案型別搜尋。例如 f 表示檔案,d 表示目錄,l 表示符號連結。 |
-size +n |
搜尋大小大於 n 個塊的檔案。 |
-size -n |
搜尋大小小於 n 個塊的檔案。 |
-size n |
搜尋大小等於 n 個塊的檔案。 |
-mtime +n |
搜尋修改時間距離現在超過 n 天的檔案。 |
-mtime -n |
搜尋修改時間距離現在少於 n 天的檔案。 |
-mtime n |
搜尋修改時間距離現在正好 n 天的檔案。 |
-atime |
根據訪問時間進行搜尋。用法與 -mtime 相同。 |
-ctime |
根據檔案建立時間進行搜尋。用法與 -mtime 相同。 |
-user 使用者名稱 |
搜尋屬於特定使用者的檔案。 |
-group 組名 |
搜尋屬於特定組的檔案。 |
-perm 模式 |
根據許可權模式搜尋檔案。例如 -perm 644 搜尋許可權為 -rw-r--r-- 的檔案。 |
-exec 命令 {} \; |
對找到的檔案執行指定的命令。 |
-ok 命令 {} \; |
對找到的檔案執行指定的命令,並在執行前提示使用者確認。 |
-print |
列印找到的檔案的路徑。 |
-print0 |
列印找到的檔案的路徑,並使用空字元作為分隔符。 |
-depth |
先搜尋子目錄再搜尋當前目錄。 |
-maxdepth n |
設定最大搜尋深度。 |
-mindepth n |
設定最小搜尋深度。 |
! |
取反運算子,用於排除某些檔案或目錄。 |
-o |
或運算子,用於組合多個搜尋條件。 |
-a |
與運算子,用於組合多個搜尋條件。 |
() |
括號用於分組搜尋條件。 |
示例:
-
查詢當前目錄下所有以 .txt 結尾的檔案:
find . -name "*.txt"
-
查詢 /home 目錄下所有大於 10M 的檔案:
find /home -size +10M
-
查詢 /tmp 目錄下修改時間距離現在超過 7 天的檔案:
find /tmp -mtime +7
-
查詢當前目錄下所有許可權為 755 的檔案:
find . -perm 755
-
查詢 /var/log 目錄下所有以 .log 結尾的檔案,並刪除它們:
find /var/log -name "*.log" -delete
-
查詢當前目錄下所有目錄,並列印它們的路徑:
find . -type d -print
-
查詢當前目錄下所有以 .txt 結尾的檔案,並把它們複製到 /backup 目錄:
find . -name "*.txt" -exec cp {} /backup \;
-
查詢當前目錄下所有以 .txt 結尾的檔案,並提示使用者是否刪除它們:
find . -name "*.txt" -ok rm {} \;
04
ls 顯示檔案
ls
命令用於列出目錄的內容。它可以顯示檔案和目錄的名稱、大小、修改時間、許可權等資訊。
基本語法:
ls [選項] [檔案或目錄...]
選項 | 描述 | 類別 |
---|---|---|
-a |
顯示所有檔案,包括隱藏檔案(以 . 開頭的檔案)。 |
列出檔案資訊 |
-l |
以長格式列出檔案資訊,包括檔案許可權、檔案大小、檔案所有者、修改時間等。 | 列出檔案資訊 |
-h |
以易於閱讀的格式顯示檔案大小,例如 1K、2M、3G 等。 | 列出檔案資訊 |
-t |
按修改時間排序。 | 列出檔案資訊 |
-r |
反轉排序順序。 | 列出檔案資訊 |
-S |
按檔案大小排序。 | 列出檔案資訊 |
-i |
顯示檔案 inode 號。 | 列出檔案資訊 |
-d |
顯示目錄本身的資訊,而不是目錄內的檔案資訊。 | 列出檔案資訊 |
-R |
遞迴列出所有子目錄。 | 列出檔案資訊 |
-F |
在檔名後新增標記,表示檔案型別。例如 / 表示目錄,* 表示可執行檔案,@ 表示符號連結等。 |
檔案顯示格式 |
-b |
將不可列印字元顯示為反斜槓跳脫字元。 | 檔案顯示格式 |
-c |
使用數字字元編碼顯示檔案。 | 檔案顯示格式 |
-G |
顯示顏色,用於區分不同型別的檔案。 | 檔案顯示格式 |
-1 |
單行顯示檔名,每個檔名佔一行。 | 其他 |
-C |
多列顯示檔名,根據終端寬度自動調整列數。 | 其他 |
-m |
用逗號分隔顯示檔名。 | 其他 |
-n |
使用數字使用者 ID 和組 ID 顯示檔案資訊。 | 其他 |
-p |
在目錄名後新增 / 。 |
其他 |
-q |
將不可列印字元顯示為 ? 。 |
其他 |
-s |
顯示檔案大小(以塊為單位)。 | 其他 |
示例:
-
列出當前目錄下所有檔案:
ls
-
以長格式列出當前目錄下所有檔案:
ls -l
-
列出當前目錄下所有檔案,包括隱藏檔案:
ls -a
-
列出當前目錄下所有檔案,按修改時間排序:
ls -lt
-
遞迴列出 /home/user 目錄下所有檔案:
ls -R /home/user
-
列出當前目錄下所有檔案,並用顏色區分檔案型別:
ls -G
wc 命令
wc
命令用於統計檔案中的行數、字數和位元組數。利用wc
指令我們可以計算檔案的Byte
數、字數、或是列數,若不指定檔名稱、或是所給予的檔名為"-
",則wc
指令會從標準輸入裝置讀取資料。
基本語法:
wc [選項] [檔案...]
主要選項:
-
-l或--lines
: 統計行數。 -
-w或--words
: 統計字數。 -
-c或--bytes或--chars
: 統計位元組數。 -
-m
: 統計字元數。 -
-L
: 統計最長行的長度。 -
-W
: 統計單詞數。
示例:
-
統計檔案 test.txt 的行數、字數和位元組數:
wc test.txt
-
只統計檔案 test.txt 的行數:
wc -l test.txt
-
統計多個檔案 test.txt 和 data.log 的行數:
wc -l test.txt data.log
-
統計檔案 test.txt 的最長行的長度:
wc -L test.txt
注意事項:
-
wc
命令預設統計所有三個值(行數、字數和位元組數)。 -
wc
命令可以使用多個選項組合,以實現不同的統計功能。 -
wc
命令的輸出結果可能會根據檔案內容和系統環境有所不同。
其他:
-
wc 命令可以用於統計標準輸入的內容,例如:
cat test.txt | wc -l
-
wc 命令可以與其他命令結合使用,例如:
# 統計檔案 `test.txt` 中包含 "error" 字串的行數。
grep "error" test.txt | wc -l