linux系統運行時參數命令、網絡、磁盤參數和日志監控
重點內容
- linux基礎命令和工具
- CPU性能監控
- 內存性能監控
- 文件IO性能監控
- 網絡IO監控
1 linux基礎命令和工具
1.1 Grep搜索字符
grep命令用于在文件中執行關鍵字搜索,并顯示匹配效果。
一些常見的選項
| 參數 | 作用 |
|---|---|
| -c | 僅顯示找到的行數 |
| -i | 忽略大小寫 |
| -n | 顯示行號 |
| -v | 反向選擇 -僅列出沒有關鍵詞的行.v是invert的縮寫 |
| -r | 遞歸搜索文件目錄 |
| -C n | 打印匹配行的前后N行 |
| 在指定文件查找,查找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
1.2 find查找文件
通過文件名查找文件的所在位置,文件名查找支持模糊匹配
find [指定查找目錄] [查找規則] [查找完后執行的action]
常用的操作:
find . -name FILE_NAME
find . -iname FILE_NAME 忽略文件名稱大小寫
find /etc -maxdepth 1 -name passwd ##查找/etc/下名稱中帶有passwd的文件,查找一層
find /mnt -size 20K ##查找/mnt文件大小近似20k的文件
find /mnt -size +20K ##查找/mnt文件大小大于20k的文件
find /mnt -size -20K ##查找/mnt文件大小小于20k的文件
find /etc -maxdepth 2 -mindepth 2 -name .conf ##查找/etc/下名稱中帶有.conf的文件,且只查找第二層
find /mnt -type d ##按type查找/mnt中目錄
find /mnt -type f ##按type查找/mnt中文件
find /mnt -cmin 10 ##查找/mnt中十分鐘左右修改的
find /mnt -cmin +10 ##查找/mnt中十分鐘以上修改的
find /mnt -cmin -10 ##查找/mnt中十分鐘以內修改的
find /mnt -ctime 10 ##查找/mnt中十天左右修改的
find /mnt -ctime +10 ##查找/mnt中十天以上修改的
find /mnt -ctime -10 ##查找/mnt中十天以內修改的
1.3 ls顯示文件
| 參數 | 作用 |
|---|---|
| -t | 可以查看最新修改的時間 |
| -l | 每行顯示一個條目 |
| -h | 可以結合顯示文件的GB,MB等(human); |
| -R | 遞歸顯示 |
| -n | 顯示組id和gid |
1.4 wc命令
wc命令用于計算字數。 利用wc指令我們可以計算文件的Byte數、字數、或是列數,若不指定文件名稱、或是所給予的文件名為"-",則wc指令會從標準輸入設備讀取數據。
語法
wc [-clw][--help][--version][文件...]
參數:
- -c或--bytes或--chars 只顯示Bytes數。
- -l或--lines 只顯示行數。
- -w或--words 只顯示字數。
- --help 在線幫助。
- --version 顯示版本信息。
1.5 ulimit用戶資源
Linux系統對每個登錄的用戶都限制其最大進程數和打開的最大文件句柄數。為了提高性能,可以根據硬件資源的具體情況設置各個用戶的最大進程數和打開的最大文件句柄數??梢杂胾limit -a來顯示當前的各種系統對用戶使用資源的限制:
[root@ubuntu~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7269
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 100001
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 65535
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
設置用戶的最大進程數:
ulimit -u 1024
設置用戶可以打開的最大文件句柄數:
ulimit -n 65530
1.6 curl http
由于當前的線上服務較多地使用了RESTful風格的API,所以集成測試就需要進行HTTP調用,查看返回的結果是否符合預期,curl命令當然是首選的測試方法。
使用方式:
curl -i "http://www.sina.com" # 打印請求響應頭信息
curl -I "http://www.sina.com" # 僅返回http頭
curl -v "http://www.sina.com" # 打印更多的調試信息
curl -verbose "http://www.sina.com" # 打印更多的調試信息
curl -d 'abc=def' "http://www.sina.com" # 使用post方法提交http請求
curl -sw '%{http_code}' "http://www.sina.com" # 打印http響應碼
1.7 scp遠程拷貝
ecure copy的縮寫, scp是linux系統下基于ssh登陸進行安全的遠程文件拷貝命令。
scp命令是Linux系統中功能強大的文件傳輸命令,可以實現從本地到遠程,以及從遠程到本地的雙向文件傳輸,用起來非常方便,常用來在線上定位問題時將線卜的一些文件下載到本地進行詳查,或者將本地的修改上傳到服務器上。
使用方式:
sudo apt-get install openssh-server?
1.8 dos2unix和unix2dos
用于轉換Windows和UNIX的換行符,通常在Windows系統h開發的腳本和配置,UNIX系統下都需要轉換。
使用方式:
dos2unix test.txt
unix2dos test.txt
轉換整個目錄
find . -type f -exec dos2unix {} \;
find ./ -type f 此命令是顯示當前目錄下所有的文
1.9 sed
命令格式1:sed 's/原字符串/新字符串/' 文件
命令格式2:sed 's/原字符串/新字符串/g' 文件
這兩種命令格式的區別在于是否有個“g”。沒有“g”表示只替換第一個匹配到的字符串,有“g”表示替換所有能匹配到的字符串,“g”可以認為是“global”(全局的)的縮寫,沒有“全局的”結尾就不要替換全部。
sed命令是用來批量修改文本內容的,比如批量替換配置中的某個ip。
sed命令在處理時,會先讀取一行,把當前處理的行存儲在臨時緩沖區中,處理完緩沖區中的內容后,打印到屏幕上。然后再讀入下一行,執行下一個循環。不斷的重復,直到文件末尾。
簡單模式

一個簡單的sed命令包含三個主要部分:參數、范圍、操作。要操作的文件,可以直接掛在命令行的最后。
參數
-n 這個參數是--quiet或者--silent的意思。表明忽略執行過程的輸出,只輸出我們的結果即可。
還有另外一個參數 :-i。使用此參數后,所有改動將在原文件上執行。你的輸出將覆蓋原文件。非常危險,一定要注意。
范圍
2,5 表示找到文件中,2,3,4,5行的內容。
這個范圍的指定很有靈性,請看以下示例(請自行替換圖中的范圍部分)。
5 選擇第5行。2,5 選擇2到5行,共4行。1~2 選擇奇數行。2,5 選擇2到5行,共4行。1~2 選擇奇數行。2~2 選擇偶數行。
范圍的選擇還可以使用正則匹配。請看下面示例。
/void/,+3 選擇出現void字樣的行,以及后面的三行。2^void/,/mem/ 選擇以void開頭的行,和出現mem字樣行之間的數據。
為了直觀,下面的命令一一對應上面的介紹,范圍和操作之間是可以有空格的。
sed -n '5p' sed1.cpp
sed -n '2,5 p' sed1.cpp
sed -n '1~2 p' sed1.cpp
sed -n '2~2 p' sed1.cpp
sed -n '2,+3p' sed1.cpp
sed -n '2,$ p' sed1.cpp
sed -n '/void/,+3 p' sed1.cpp
sed -n '/^void/,/CLIENT_TYPE_FLAG_BOTH/p' sed1.cpp
sed -n '/^BroadcastPdu/,/CLIENT_TYPE_FLAG_BOTH/p' sed1.cpp
sed -n '/^void CImUserManager::BroadcastPdu/,/CLIENT_TYPE_FLAG_BOTH/p' sed1.cpp
替換模式
以上是sed命令的常用匹配模式,但它還有一個強大的替換模式,意思就是查找替換其中的某些值,并輸出結果。使用替換模式很少使用-n參數。

替換模式的參數有點多,但第一部分和第五部分都是可以省略的。替換后會將整個文本輸出出來。
前半部分用來匹配一些范圍,而后半部分執行替換的動作。
范圍
這個范圍和上面的范圍語法類似??聪旅娴睦?。
/sys/,+3 選擇出現sys字樣的行,以及后面的三行。/^sys/,/mem/選擇以sys開頭的行,和出現mem字樣行之間的數據。
具體命令為:
sed 's/a/b/g' file
sed 's/[a,b,c]/<&>/g' file
#這個命令我們下面解釋
替換
是時候把找出的字符串給替換掉了。本部分的內容將替換查找匹配部分找到的內容。
可惜的是,這部分不能使用正則。常用的就是精確替換。比如把a替換成b。
但也有高級功能。和java或者python的正則api類似,sed的替換同樣有Matched Pattern的含義,同樣可以得到Group,不深究。常用的替位符,就是&。
**&**號,再重復一遍。當它用在替換字符串中的時候,代表的是原始的查找匹配數據
[&] 表明將查找到的數據使用[]包圍起來?!?amp;” 表明將查找的數據使用””包圍起來。
下面這條命令,將會把文件中的每一行,使用引號包圍起來。
sed 's/.*/"&"/' file
flag 參數
這些參數可以單個使用,也可以使用多個,僅介紹最常用的。
g 默認只匹配行中第一次出現的內容,加上g,就可以全文替換了。常用。p 當使用了-n
參數,p
將僅輸出匹配行內容。w 和上面的w模式類似,但是它僅僅輸出有變換的行。i 這個參數比較重要,表示忽略大小寫。e 表示將輸出的每一行,執行一個命令。不建議使用,可以使用xargs配合完成這種功能。
看兩個命令的語法:
sed -n 's/a/b/gipw output.txt' file
sed 's/^/ls -la/e' file
^M 就是\r
1.10 awk
awk同sed命令類似,只不過sed擅長取行,awk命令擅長取列。
原理:一般是遍歷一個文件中的每一行,然后分別對文件的每一行進行處理
用法:
awk [可選的命令行選項] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名

打印某幾列
$ echo 'I love you' | awk '{print $3 $2 $1}'
youloveI
我們將字符串I love you通過管道傳遞給awk命令,相當于awk處理一個文件,該文件的內容就是I love you,默認通過空格作為分隔符(不管列之間有多少個空格都將當作一個空格處理)I love you就分割成三列了。
假如分割符號為.,可以這樣用
$ echo '192.168.1.1' | awk -F "." '{print $2}'
168
條件過濾
我們知道awk的用法是這樣的,那么pattern部分怎么用呢?
awk [可選的命令行選項] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
$ cat score.txt
tom 60 60 60
kitty 90 95 87
jack 72 84 99
$ awk '$2>=90{print $0}' score.txt
kitty 90 95 87
$2>=90 表示如果當前行的第2列的值大于90則處理當前行,否則不處理。說白了pattern部分是用來從文件中篩選出需要處理的行進行處理的,這部分是空的代表全部處理。
pattern部分可以是任何條件表達式的判斷結果,例如>,<,==,>=,<=,!=同時還可以使用+,-,*,/運算與條件表達式相結合的復合表達式,邏輯 &&,||,!同樣也可以使用進來。另外pattern部分還可以使用 /正則/ 選擇需要處理的行。
判斷語句
判斷語句是寫在pattern{ 命令 }命令中的,他具備條件過濾一樣的作用,同時他也可以讓輸出更豐富
$ awk '{if($2>=90 )print $0}' score.txt
kitty 90 95 87
$ awk '{if($2>=90 )print $1,"優秀"; else print $1,"良好"}' score.txt
tom 良好
kitty 優秀
jack 良好
$ awk '{if($2>=90 )print $0,"優秀"; else print $1,"良好"}' score.txt
tom 良好
kitty 90 95 87 優秀
jack 良好
BEGIN 定義表頭
awk [可選的命令行選項] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
使用方法如下:
$ awk 'BEGIN{print "姓名 語文 數學 英語"}{printf "%-8s%-5d%-5d%-5d\n",$1,$2,$3,$4}' score.txt
姓名 語文數學英語
tom 60 60 60
kitty 90 95 87
jack 72 84 99
這里要注意,我為了輸出格式好看,做了左對齊的操作(%-8s左對齊,寬8位),printf用法和c++類似。
不僅可以用來定義表頭,還可以做一些變量初始化的工作,例如
$ awk 'BEGIN{OFMT="%.2f";print 1.2567,12E-2}'
1.26 0.12
這里OFMT是個內置變量,初始化數字輸出格式,保留小數點后兩位
END 添加結尾符
和BEGIN用法類似
$ echo ok | awk '{print $1}END{print "end"}'
ok
end
數據計算
$ awk 'BEGIN{print "姓名 語文 數學 英語 總成績"; \
sum1=0;sum2=0;sum3=0;sumall=0} \
{printf "%5s%5d%5d%5d%5d\n",$1,$2,$3,$4,$2+$3+$4;\
sum1+=$2;sum2+=$3;sum3+=$4;sumall+=$2+$3+$4}\
END{printf "%5s%5d%5d%5d%5d\n","總成績",sum1,sum2,sum3,sumall}'\
score.txt
姓名 語文 數學 英語 總成績
tom 60 60 60 180
kitty 90 95 87 272
jack 72 84 99 255
總成績 222 239 246 707
因為命令太長,末尾用\符號換行。
- BEGIN體里輸出表頭,并給四個變量初始化0
- pattern體里輸出每一行,并累加運算
- END體里輸出總統計結果
當然了,一個正常人在用linux命令的時候是不會輸入那么多格式化符號來對齊的,所以新命令又來了
column -t(鬼知道我為什么會記得這么多亂七八糟的命令。)
范例:網絡狀態統計
本小節,采用awk統計netstat命令的一些網絡狀態,來看一下awk語言的基本要素。netstat的輸出類似于:

其中,第6列,標明了網絡連接所處于的網絡狀態。我們先給出awk命令,看一下統計結果。
netstat -ant |
awk ' \
BEGIN{print "State","Count" } \
/^tcp/ \
{ rt[$6]++ } \
END{ for(i in rt){print i,rt[i]} }'
netstat -ant |
awk ' \
BEGIN{print "State","Count" } \
/^tcp/ \
{ if($4=="0.0.0.0:3306" ) rt[$6]++ } \
END{ for(i in rt){print i,rt[i]} }'
輸出結果為:
State Count
LAST_ACK 1
LISTEN 64
CLOSE_WAIT 43
ESTABLISHED 719
SYN_SENT 5
TIME_WAIT 146
下面這張圖會配合以上命令詳細說明,希望你能了解awk的精髓。

乍一看,好嚇人的命令,但是很簡單。awk和我們通常的程序不太一樣,它分為四個部分。
1、BEGIN 開頭部分,可選的。用來設置一些參數,輸出一些表頭,定義一些變量等。上面的命令僅打印了一行信息而已。
2、END 結尾部分,可選的。用來計算一些匯總邏輯,或者輸出這些內容。上面的命令,使用簡單的for循環,輸出了數組rt中的內容。
3、Pattern 匹配部分,依然可選。用來匹配一些需要處理的行。上面的命令,只匹配tcp開頭的行,其他的不進入處理。
4、Action 模塊.主要邏輯體,按行處理,統計打印,都可以。
注意點
1、awk的主程序部分使用單引號‘包圍,而不能是雙引號
2、awk的列開始的index是0,而不是1
CPU性能監控
2.1 平均負載和CPU使用率
1 平均負載基礎
平均負載是指單位時間內,系統處于可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數,它和 CPU 使用率并沒有直接關系。
- 可運行狀態的進程,是指正在使用 CPU 或者正在等待 CPU 的進程,也就是我們常用 ps 命令看到的,處于 R 狀態(Running 或 Runnable)的進程。
- 不可中斷狀態的進程則是正處于內核態關鍵流程中的進程,并且這些流程是不可打斷的,比如最常見的是等待硬件設備的 I/O 響應,也就是我們在 ps 命令中看到的 D 狀態(Uninterruptible Sleep,也稱為 Disk Sleep)的進程。
平均負載其實就是平均活躍進程數。平均活躍進程數,直觀上的理解就是單位時間內的活躍進程數。
平均負載其實就是平均活躍進程數。平均活躍進程數,直觀上的理解就是單位時間內的活躍進程數。
2 使用uptime命令分析平均負載
查看機器的啟動時間、登錄用戶、平均負載等情況,通常用于在線上應急或者技術攻關中,確定操作系統的重啟時間。
[root@ubuntusrc]# uptime
13:01:52 up 46 days, 22:03, 4 users, load average: 0.13, 0.08, 0.05
從上面的輸出可以看到如下信息
- 當前時間: 13:01:52
- 系統已經運行的時間:43天22小時3分鐘。
- 前在線用戶:4個用戶,是總連接數量,不是不同用戶數量(開一個終端連接就算一個用戶)。
- 系統平均負載:0.13 , 0.08, 0.05,為最近1分鐘、5分鐘、15分鐘的系統負載情況。
比如當平均負載為 2 時,意味著什么呢?
- 在只有 2 個 CPU 的系統上,意味著所有的 CPU 都剛好被完全占用。
- 在 4 個 CPU 的系統上,意味著 CPU 有 50% 的空閑。
- 而在只有 1 個 CPU 的系統中,則意味著有一半的進程競爭不到 CPU。
補充:
查看cpu信息:cat /proc/cpuinfo
直接獲取cpu核數:grep 'model name' /proc/cpuinfo | wc -l
負載說明(現針對單核情況,不是單核時則乘以核數):
- load<1:沒有等待
- load==1:系統已無額外的資源跑更多的進程了
- load>1:進程都堵著等待資源
注意:
- load < 0.7時:系統很閑,要考慮多部署一些服務
- 0.7 < load < 1時:系統狀態不錯
- load == 1時:系統馬上要處理不多來了,趕緊找一下原因
- load > 5時:系統已經非常繁忙了
不同load值說明的問題
1)1分鐘 load >5,5分鐘 load ??,15分鐘 load <1
短期內繁忙,中長期空閑,初步判斷是一個抖動或者是擁塞前兆
2)1分鐘 load >5,5分鐘 load >3,15分鐘 load <1
短期內繁忙,中期內緊張,很可能是一個擁塞的開始
3)1分鐘 load >5,5分鐘 load >5,15分鐘 load >5
短中長期都繁忙,系統正在擁塞
4)1分鐘 load <1,5分鐘Load>3,15分鐘 load >5
短期內空閑,中長期繁忙,不用緊張,系統擁塞正在好轉
舉個例子,假設我們在一個單 CPU 系統上看到平均負載為 1.73(1分鐘),0.60(5分鐘),7.98(15分鐘),那么說明在過去 1 分鐘內,系統有 73% 的超載,而在 15 分鐘內,有 698% 的超載,從整體趨勢來看,系統的負載在降低。
3 平均負載與 CPU 使用率
平均負載是指單位時間內,處于可運行狀態和不可中斷狀態的進程數。所以,它不僅包括了正在使用 CPU 的進程,還包括等待 CPU 和等待 I/O 的進程。
CPU 使用率,是單位時間內 CPU 繁忙情況的統計,跟平均負載并不一定完全對應。比如:
CPU 密集型進程,使用大量 CPU 會導致平均負載升高,此時這兩者是一致的;
I/O 密集型進程,等待 I/O 也會導致平均負載升高,但CPU 使用率不一定很高;
大量等待 CPU 的進程調度也會導致平均負載升高,此時的 CPU 使用率也會比較高。
4 CPU使用率監測命令
系統自帶:ps、top
第三方安裝:mpstat 、pidstat
安裝對應的命令:apt install stress sysstat
其中sysstat 包括了mpstat 和pidstat 。
- mpstat 是一個常用的多核 CPU 性能分析工具,用來實時查看每個 CPU 的性能指標,以及所有 CPU 的平均指標。
- pidstat 是一個常用的進程性能分析工具,用來實時查看進程的 CPU、內存、I/O 以及上下文切換等性能指標。
壓測命令:stress ,一個 Linux 系統壓力測試工具,這里我們用作異常進程模擬平均負載升高的場景。
ps查找進程信息
ps用一于顯示系統內的所有進程。
-l或l 采用詳細的格式來顯示進程狀況。
查看幫助:ps --help all
常用方式:ps -elf 和ps -ef
輸出:
lwl@DragonNetWork:~$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 5 03:14 ? 00:00:02 /sbin/init
root 2 0 0 03:14 ? 00:00:00 [kthreadd]
root 3 2 0 03:14 ? 00:00:00 [rcu_gp]
root 4 2 0 03:14 ? 00:00:00 [rcu_par_gp]
root 5 2 0 03:14 ? 00:00:00 [kworker/0:0-cgroup_destroy]
root 6 2 0 03:14 ? 00:00:00 [kworker/0:0H-events_highpri]
root 7 2 0 03:14 ? 00:00:00 [kworker/u256:0-ext4-rsv-conversion]
root 8 2 0 03:14 ? 00:00:00 [kworker/0:1H-events_highpri]
root 9 2 0 03:14 ? 00:00:00 [mm_percpu_wq]
root 10 2 0 03:14 ? 00:00:00 [rcu_tasks_rude_]
root 11 2 0 03:14 ? 00:00:00 [rcu_tasks_trace]
root 12 2 0 03:14 ? 00:00:00 [ksoftirqd/0]
root 13 2 0 03:14 ? 00:00:00 [rcu_sched]
root 14 2 0 03:14 ? 00:00:00 [migration/0]
root 15 2 0 03:14 ? 00:00:00 [kworker/0:1-events]
root 16 2 0 03:14 ? 00:00:00 [cpuhp/0]
root 18 2 0 03:14 ? 00:00:00 [kdevtmpfs]
root 19 2 0 03:14 ? 00:00:00 [netns]
root 20 2 0 03:14 ? 00:00:00 [kauditd]
root 21 2 0 03:14 ? 00:00:00 [khungtaskd]
root 22 2 0 03:14 ? 00:00:00 [oom_reaper]
root 23 2 0 03:14 ? 00:00:00 [writeback]
root 24 2 0 03:14 ? 00:00:00 [kcompactd0]
root 25 2 0 03:14 ? 00:00:00 [ksmd]
root 26 2 0 03:14 ? 00:00:00 [khugepaged]
root 44 2 0 03:14 ? 00:00:00 [kintegrityd]
root 45 2 0 03:14 ? 00:00:00 [kblockd]
root 46 2 0 03:14 ? 00:00:00 [blkcg_punt_bio]
root 47 2 0 03:14 ? 00:00:00 [edac-poller]
root 48 2 0 03:14 ? 00:00:00 [devfreq_wq]
root 49 2 0 03:14 ? 00:00:00 [kswapd0]
root 50 2 0 03:14 ? 00:00:00 [kthrotld]
root 51 2 0 03:14 ? 00:00:00 [irq/24-pciehp]
root 52 2 0 03:14 ? 00:00:00 [irq/25-pciehp]
root 53 2 0 03:14 ? 00:00:00 [irq/26-pciehp]
root 54 2 0 03:14 ? 00:00:00 [irq/27-pciehp]
root 55 2 0 03:14 ? 00:00:00 [irq/28-pciehp]
root 56 2 0 03:14 ? 00:00:00 [irq/29-pciehp]
root 57 2 0 03:14 ? 00:00:00 [irq/30-pciehp]
root 58 2 0 03:14 ? 00:00:00 [irq/31-pciehp]
root 59 2 0 03:14 ? 00:00:00 [irq/32-pciehp]
root 60 2 0 03:14 ? 00:00:00 [irq/33-pciehp]
root 61 2 0 03:14 ? 00:00:00 [irq/34-pciehp]
root 62 2 0 03:14 ? 00:00:00 [irq/35-pciehp]
root 63 2 0 03:14 ? 00:00:00 [irq/36-pciehp]
root 64 2 0 03:14 ? 00:00:00 [irq/37-pciehp]
root 65 2 0 03:14 ? 00:00:00 [irq/38-pciehp]
root 66 2 0 03:14 ? 00:00:00 [irq/39-pciehp]
root 67 2 0 03:14 ? 00:00:00 [irq/40-pciehp]
root 68 2 0 03:14 ? 00:00:00 [irq/41-pciehp]
root 69 2 0 03:14 ? 00:00:00 [irq/42-pciehp]
root 70 2 0 03:14 ? 00:00:00 [irq/43-pciehp]
root 71 2 0 03:14 ? 00:00:00 [irq/44-pciehp]
root 72 2 0 03:14 ? 00:00:00 [irq/45-pciehp]
root 73 2 0 03:14 ? 00:00:00 [irq/46-pciehp]
root 74 2 0 03:14 ? 00:00:00 [irq/47-pciehp]
root 75 2 0 03:14 ? 00:00:00 [irq/48-pciehp]
root 76 2 0 03:14 ? 00:00:00 [irq/49-pciehp]
root 77 2 0 03:14 ? 00:00:00 [irq/50-pciehp]
root 78 2 0 03:14 ? 00:00:00 [irq/51-pciehp]
root 79 2 0 03:14 ? 00:00:00 [irq/52-pciehp]
root 80 2 0 03:14 ? 00:00:00 [irq/53-pciehp]
root 81 2 0 03:14 ? 00:00:00 [irq/54-pciehp]
root 82 2 0 03:14 ? 00:00:00 [irq/55-pciehp]
root 83 2 0 03:14 ? 00:00:00 [acpi_thermal_pm]
root 84 2 0 03:14 ? 00:00:00 [ipv6_addrconf]
root 85 2 0 03:14 ? 00:00:00 [kworker/u256:1-ext4-rsv-conversion]
root 94 2 0 03:14 ? 00:00:00 [kstrp]
root 97 2 0 03:14 ? 00:00:00 [zswap-shrink]
root 98 2 0 03:14 ? 00:00:00 [kworker/u257:0]
root 137 2 0 03:14 ? 00:00:00 [ata_sff]
root 140 2 0 03:14 ? 00:00:00 [scsi_eh_0]
root 141 2 0 03:14 ? 00:00:00 [mpt_poll_0]
root 142 2 0 03:14 ? 00:00:00 [scsi_tmf_0]
root 144 2 0 03:14 ? 00:00:00 [mpt/0]
root 145 2 0 03:14 ? 00:00:00 [scsi_eh_1]
root 146 2 0 03:14 ? 00:00:00 [scsi_tmf_1]
root 147 2 0 03:14 ? 00:00:00 [kworker/u256:2-events_unbound]
root 148 2 0 03:14 ? 00:00:00 [kworker/0:2-ata_sff]
root 149 2 0 03:14 ? 00:00:00 [irq/16-vmwgfx]
root 150 2 0 03:14 ? 00:00:00 [ttm_swap]
root 151 2 0 03:14 ? 00:00:00 [card0-crtc0]
root 152 2 0 03:14 ? 00:00:00 [card0-crtc1]
root 153 2 0 03:14 ? 00:00:00 [card0-crtc2]
root 154 2 0 03:14 ? 00:00:00 [card0-crtc3]
root 155 2 0 03:14 ? 00:00:00 [card0-crtc4]
root 156 2 0 03:14 ? 00:00:00 [card0-crtc5]
root 157 2 0 03:14 ? 00:00:00 [card0-crtc6]
root 158 2 0 03:14 ? 00:00:00 [card0-crtc7]
root 159 2 0 03:14 ? 00:00:00 [kworker/0:3-events]
root 160 2 0 03:14 ? 00:00:00 [scsi_eh_2]
root 161 2 0 03:14 ? 00:00:00 [scsi_tmf_2]
root 210 2 0 03:15 ? 00:00:00 [jbd2/sda1-8]
root 211 2 0 03:15 ? 00:00:00 [ext4-rsv-conver]
root 250 1 0 03:15 ? 00:00:00 /lib/systemd/systemd-journald
root 272 1 0 03:15 ? 00:00:00 /lib/systemd/systemd-udevd
root 352 2 0 03:15 ? 00:00:00 [cryptd]
systemd+ 359 1 0 03:15 ? 00:00:00 /lib/systemd/systemd-timesyncd
root 382 2 0 03:15 ? 00:00:00 [kworker/u256:3-ext4-rsv-conversion]
root 436 1 0 03:15 ? 00:00:00 /usr/libexec/accounts-daemon
root 438 1 0 03:15 ? 00:00:00 /usr/sbin/anacron -d -q -s
avahi 444 1 0 03:15 ? 00:00:00 avahi-daemon: running [DragonNetWork.local]
root 445 1 0 03:15 ? 00:00:00 /usr/sbin/cron -f
message+ 446 1 1 03:15 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --syst
root 456 1 0 03:15 ? 00:00:00 /usr/sbin/NetworkManager --no-daemon
root 467 1 1 03:15 ? 00:00:00 /usr/libexec/polkitd --no-debug
root 468 1 0 03:15 ? 00:00:00 /usr/sbin/rsyslogd -n -iNONE
root 473 1 0 03:15 ? 00:00:00 /usr/libexec/switcheroo-control
root 476 1 0 03:15 ? 00:00:00 /lib/systemd/systemd-logind
root 478 1 0 03:15 ? 00:00:00 /usr/libexec/udisks2/udisksd
root 488 1 0 03:15 ? 00:00:00 /sbin/wpa_supplicant -u -s -O /run/wpa_supplicant
avahi 493 444 0 03:15 ? 00:00:00 avahi-daemon: chroot helper
root 502 1 0 03:15 ? 00:00:00 /usr/sbin/ModemManager
root 523 1 0 03:15 ? 00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown
root 532 1 0 03:15 ? 00:00:00 /lib/systemd/systemd-hostnamed
root 543 1 0 03:15 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 547 1 0 03:15 ? 00:00:00 /usr/sbin/gdm3
root 553 1 0 03:15 ? 00:00:00 /usr/sbin/apache2 -k start
root 554 547 0 03:15 ? 00:00:00 gdm-session-worker [pam/gdm-launch-environment]
Debian-+ 640 1 0 03:15 ? 00:00:00 /lib/systemd/systemd --user
Debian-+ 649 640 0 03:15 ? 00:00:00 (sd-pam)
Debian-+ 683 640 0 03:15 ? 00:00:00 /usr/bin/pipewire
Debian-+ 684 640 1 03:15 ? 00:00:00 /usr/bin/pulseaudio --daemonize=no --log-target=journal
Debian-+ 685 554 0 03:15 tty1 00:00:00 /usr/libexec/gdm-wayland-session dbus-run-session -- gnome-session --autosta
Debian-+ 687 640 0 03:15 ? 00:00:00 /usr/libexec/tracker-miner-fs
Debian-+ 690 640 0 03:15 ? 00:00:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --sys
rtkit 691 1 0 03:15 ? 00:00:00 /usr/libexec/rtkit-daemon
Debian-+ 713 683 0 03:15 ? 00:00:00 /usr/bin/pipewire-media-session
Debian-+ 714 685 0 03:15 tty1 00:00:00 dbus-run-session -- gnome-session --autostart /usr/share/gdm/greeter/autosta
Debian-+ 715 714 0 03:15 tty1 00:00:00 dbus-daemon --nofork --print-address 4 --session
Debian-+ 718 714 0 03:15 tty1 00:00:00 /usr/libexec/gnome-session-binary --systemd --autostart /usr/share/gdm/greet
Debian-+ 757 718 8 03:15 tty1 00:00:02 /usr/bin/gnome-shell
Debian-+ 810 640 0 03:15 ? 00:00:00 /usr/libexec/gvfsd
Debian-+ 815 640 0 03:15 ? 00:00:00 /usr/libexec/gvfsd-fuse /run/user/116/gvfs -f
root 847 1 0 03:15 ? 00:00:00 /usr/sbin/vmware-vmblock-fuse -o subtype=vmware-vmblock,default_permissions,
root 872 1 0 03:15 ? 00:00:00 /usr/sbin/vmtoolsd
Debian-+ 887 1 0 03:15 tty1 00:00:00 /usr/libexec/at-spi-bus-launcher
Debian-+ 894 887 0 03:15 tty1 00:00:00 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility
root 914 1 0 03:15 ? 00:00:00 /usr/lib/vmware-vgauth/VGAuthService -s
Debian-+ 915 757 0 03:15 tty1 00:00:00 /usr/bin/Xwayland :1024 -rootless -noreset -accessx -core -auth /run/user/11
root 923 1 0 03:15 ? 00:00:00 /usr/sbin/nmbd --foreground --no-process-group
root 954 1 0 03:15 ? 00:00:00 /usr/sbin/smbd --foreground --no-process-group
root 978 954 0 03:15 ? 00:00:00 /usr/sbin/smbd --foreground --no-process-group
root 979 954 0 03:15 ? 00:00:00 /usr/sbin/smbd --foreground --no-process-group
root 988 954 0 03:15 ? 00:00:00 /usr/sbin/smbd --foreground --no-process-group
Debian-+ 995 640 0 03:15 ? 00:00:00 /usr/libexec/gvfs-udisks2-volume-monitor
Debian-+ 1001 640 0 03:15 ? 00:00:00 /usr/libexec/gvfs-afc-volume-monitor
root 1002 1 0 03:15 ? 00:00:00 /lib/systemd/systemd-localed
Debian-+ 1029 640 0 03:15 ? 00:00:00 /usr/libexec/gvfs-goa-volume-monitor
Debian-+ 1034 640 0 03:15 ? 00:00:00 /usr/libexec/goa-daemon
Debian-+ 1052 640 0 03:15 ? 00:00:00 /usr/libexec/goa-identity-service
Debian-+ 1059 1 0 03:15 tty1 00:00:00 /usr/libexec/xdg-permission-store
root 1064 1 0 03:15 ? 00:00:00 /usr/libexec/upowerd
geoclue 1072 1 0 03:15 ? 00:00:00 /usr/libexec/geoclue
root 1078 1 0 03:15 ? 00:00:00 /usr/libexec/packagekitd
Debian-+ 1089 1 0 03:15 tty1 00:00:00 /usr/bin/gjs /usr/share/gnome-shell/org.gnome.Shell.Notifications
Debian-+ 1091 1 0 03:15 tty1 00:00:00 /usr/libexec/at-spi2-registryd --use-gnome-session
Debian-+ 1092 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-sharing
Debian-+ 1093 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-wacom
Debian-+ 1101 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-color
Debian-+ 1105 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-keyboard
Debian-+ 1107 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-print-notifications
Debian-+ 1108 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-rfkill
Debian-+ 1109 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-smartcard
Debian-+ 1110 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-datetime
Debian-+ 1111 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-media-keys
Debian-+ 1112 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-screensaver-proxy
Debian-+ 1113 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-sound
Debian-+ 1114 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-a11y-settings
Debian-+ 1117 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-housekeeping
Debian-+ 1118 718 0 03:15 tty1 00:00:00 /usr/libexec/gsd-power
Debian-+ 1146 1 0 03:15 tty1 00:00:00 /usr/libexec/gsd-printer
Debian-+ 1165 640 0 03:15 ? 00:00:00 /usr/libexec/gvfs-gphoto2-volume-monitor
root 1197 1 0 03:15 ? 00:00:00 /usr/lib/realmd/realmd
colord 1204 1 0 03:15 ? 00:00:00 /usr/libexec/colord
www-data 1218 553 0 03:15 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 1219 553 0 03:15 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 1220 553 0 03:15 ? 00:00:00 /usr/sbin/apache2 -k start
Debian-+ 1277 757 0 03:15 tty1 00:00:00 ibus-daemon --panel disable -r --xim
Debian-+ 1291 1277 0 03:15 tty1 00:00:00 /usr/libexec/ibus-dconf
Debian-+ 1292 1277 4 03:15 tty1 00:00:01 /usr/libexec/ibus-extension-gtk3
Debian-+ 1294 1 0 03:15 tty1 00:00:00 /usr/libexec/ibus-x11 --kill-daemon
Debian-+ 1298 1 0 03:15 tty1 00:00:00 /usr/libexec/ibus-portal
Debian-+ 1320 640 0 03:15 ? 00:00:00 /usr/libexec/gvfs-mtp-volume-monitor
root 1333 1 0 03:15 ? 00:00:00 /usr/sbin/cupsd -l
root 1334 2 0 03:15 ? 00:00:00 [kworker/0:4-events]
root 1335 1 0 03:15 ? 00:00:00 /usr/sbin/cups-browsed
Debian-+ 1348 1277 0 03:15 tty1 00:00:00 /usr/libexec/ibus-engine-simple
Debian-+ 1363 640 1 03:15 ? 00:00:00 /usr/libexec/tracker-store
Debian-+ 1380 640 0 03:15 ? 00:00:00 /usr/libexec/gvfsd-metadata
root 1384 543 3 03:15 ? 00:00:00 sshd: lwl [priv]
lwl 1387 1 1 03:15 ? 00:00:00 /lib/systemd/systemd --user
lwl 1388 1387 0 03:15 ? 00:00:00 (sd-pam)
lwl 1403 1387 0 03:15 ? 00:00:00 /usr/bin/pipewire
lwl 1404 1387 3 03:15 ? 00:00:00 /usr/bin/pulseaudio --daemonize=no --log-target=journal
lwl 1407 1387 4 03:15 ? 00:00:00 /usr/libexec/tracker-extract
lwl 1408 1387 2 03:15 ? 00:00:00 /usr/libexec/tracker-miner-fs
lwl 1413 1387 0 03:15 ? 00:00:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --sys
lwl 1414 1384 1 03:15 ? 00:00:00 sshd: lwl@pts/0,pts/1
lwl 1415 1403 0 03:15 ? 00:00:00 /usr/bin/pipewire-media-session
root 1416 543 1 03:15 ? 00:00:00 sshd: lwl [priv]
lwl 1418 1414 0 03:15 pts/0 00:00:00 -bash
lwl 1422 1414 0 03:15 pts/1 00:00:00 -bash
lwl 1436 1416 0 03:15 ? 00:00:00 sshd: lwl@notty
lwl 1438 1436 0 03:15 ? 00:00:00 /usr/lib/openssh/sftp-server
lwl 1441 1436 0 03:15 ? 00:00:00 /usr/lib/openssh/sftp-server
lwl 1442 1436 0 03:15 ? 00:00:00 /usr/lib/openssh/sftp-server
lwl 1444 1436 0 03:15 ? 00:00:00 /usr/lib/openssh/sftp-server
lwl 1447 1436 0 03:15 ? 00:00:00 /usr/lib/openssh/sftp-server
lwl 1453 1436 0 03:15 ? 00:00:00 /usr/lib/openssh/sftp-server
lwl 1473 1387 0 03:15 ? 00:00:00 /usr/libexec/gvfsd
lwl 1481 1387 0 03:15 ? 00:00:00 /usr/libexec/gvfsd-fuse /run/user/1000/gvfs -f
root 1483 272 0 03:15 ? 00:00:00 /lib/systemd/systemd-udevd
lwl 1493 1387 0 03:15 ? 00:00:00 /usr/libexec/gvfs-udisks2-volume-monitor
lwl 1498 1387 0 03:15 ? 00:00:00 /usr/libexec/gvfs-afc-volume-monitor
lwl 1504 1387 0 03:15 ? 00:00:00 /usr/libexec/gvfs-goa-volume-monitor
lwl 1508 1387 2 03:15 ? 00:00:00 /usr/libexec/goa-daemon
lwl 1521 1387 0 03:15 ? 00:00:00 /usr/libexec/goa-identity-service
lwl 1527 1387 0 03:15 ? 00:00:00 /usr/libexec/gvfs-gphoto2-volume-monitor
lwl 1531 1387 0 03:15 ? 00:00:00 /usr/libexec/gvfs-mtp-volume-monitor
lwl 1539 1387 6 03:15 ? 00:00:00 /usr/libexec/tracker-store
lwl 1555 1422 0 03:15 pts/1 00:00:00 top
lwl 1570 1414 0 03:15 ? 00:00:00 bash -c export LANG="en_US";export LANGUAGE="en_US";export LC_ALL="en_US";fr
lwl 1575 1570 0 03:15 ? 00:00:00 sleep 1
lwl 1576 1418 0 03:15 pts/0 00:00:00 ps -ef
根據進程的名字或者其他信息,通過grep命令找到目標進程,也可以看到進程啟動腳木的全路徑。
更多參數說明:
############################################################
常用參數:
-A 顯示所有進程(等價于-e)(utility)
-a 顯示一個終端的所有進程,除了會話引線
-N 忽略選擇。
-d 顯示所有進程,但省略所有的會話引線(utility)
-x 顯示沒有控制終端的進程,同時顯示各個命令的具體路徑。dx不可合用。(utility)
-p pid 進程使用cpu的時間
-u uid or username 選擇有效的用戶id或者是用戶名
-g gid or groupname 顯示組的所有進程。
U username 顯示該用戶下的所有進程,且顯示各個命令的詳細路徑。如:ps U zhang;(utility)
-f 全部列出,通常和其他選項聯用。如:ps -fa or ps -fx and so on.
-l 長格式(有F,wchan,C 等字段)
-j 作業格式
-o 用戶自定義格式。
v 以虛擬存儲器格式顯示
s 以信號格式顯示
-m 顯示所有的線程
-H 顯示進程的層次(和其它的命令合用,如:ps -Ha)(utility)
e 命令之后顯示環境(如:ps -d e; ps -a e)(utility)
h 不顯示第一行
===================================ps 的參數說明=============================
l 長格式輸出;
u 按用戶名和啟動時間的順序來顯示進程;
j 用任務格式來顯示進程;
f 用樹形格式來顯示進程;
a 顯示所有用戶的所有進程(包括其它用戶)。顯示所有進程
-a 顯示同一終端下的所有程序
x 顯示無控制終端的進程;
r 顯示運行中的進程;
ww 避免詳細參數被截斷;
-A 列出所有的進程
-w 顯示加寬可以顯示較多的資訊
-au 顯示較詳細的資訊
-aux 顯示所有包含其他使用者的進程
-e 顯示所有進程,環境變量
-f 全格式
-h 不顯示標題
-l 長格式
-w 寬輸出
a 顯示終端上地所有進程,包括其他用戶地進程
r 只顯示正在運行地進程
x 顯示沒有控制終端地進程
常用的選項是組合是 aux 或 lax,還有參數 f 的應用。
pids 只列出進程標識符,之間運用逗號分隔,
該進程列表必須在命令行參數地最后一個選項后面緊接著給出,
中間不能插入空格。比如:ps -f1,4,5 顯示的是進程ID為1,4,5的進程
下面介紹長命令行選項,這些選項都運用“--”開頭:
--sort X[+|-] key [,[+|-] key [,…]] 從SORT KEYS段中選一個多字母鍵.“+”字符是可選地,
因為默認地方向就是按數字升序或者詞典順序,“-”字符是逆序排序(即降序).
比如: ps -jax -sort=uid,-ppid,+pid.
--help 顯示幫助信息.
--version 顯示該命令地版本信息.
在前面地選項說明中提到了排序鍵,接下來對排序鍵作進一步說明.
需要注意的是排序中運用的值是ps運用地內部值,并非僅用于某些輸出格式地偽值.
排序鍵列表見下表.
============排序鍵列表==========================
c cmd 可執行地簡單名稱
C cmdline 完整命令行
f flags 長模式標志
g pgrp 進程地組ID
G tpgid 控制tty進程組ID
j cutime 累計用戶時間
J cstime 累計系統時間
k utime 用戶時間
K stime 系統時間
m min_flt 次要頁錯誤地數量
M maj_flt 重點頁錯誤地數量
n cmin_flt 累計次要頁錯誤
N cmaj_flt 累計重點頁錯誤
o session 對話ID
p pid 進程ID
P ppid 父進程ID
r rss 駐留大小
R resident 駐留頁
s size 內存大小(千字節)
S share 共享頁地數量
t tty tty次要設備號
T start_time 進程啟動地時間
U uid UID
u user 用戶名
v vsize 總地虛擬內存數量(字節)
y priority 內核調度優先級
練習:
(1)檢測是否有活動進程:
sudo ps -ef |grep "nginx: master process" |grep -v grep
(2)檢測有幾個同樣的活動進程
sudo ps -ef |grep "nginx: master process" |grep -v grep |wc -l
top命令查詢進程的cpu、內存信息
top命令用于查看活動進程的CPU和內存信息,能夠實時顯示系統中各個進程的資源占用情況,可以按照CPU、內存的使用情況和執行時間對進程進行排序。
使用方式:top
命令輸出:
Tasks: 280 total, 1 running, 199 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.4 us, 0.1 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 6143776 total, 1103656 free, 1211704 used, 3828416 buff/cache
KiB Swap: 998396 total, 998384 free, 12 used. 4461984 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 185308 5828 3844 S 0.0 0.1 0:05.00 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
...
從輸出可以看到整體的CPU占用率、CPU負載,以及進程占用CPU和內存等資源的情況。
我們可以用以下所示的top命令的快捷鍵對輸出的顯示信息進行轉換。
- t:切換報示進程和CPU狀態信息。
- n:切換顯示內存信息。
- r:重新設置一個進程的優先級。系統提示用戶輸人需要改變的進程PID及需要設置的進程優先級,然后輸入個正數值使優先級降低,反之則可以使該進程擁有更高的優先級,即是在原有基礎上進行相加,默認優先級的值是100
- k:終止一個進程,系統將提示用戶輸入需要終止的進程PID o
- s:改變刷新的時間間隔。
- u:查看指定用戶的進程。
練習:
top 命令查找cpu占用率最高的程序,找到對應的PID
top -Hp pid ,查看具體進程下的線程,比如

mpstat
此命令用于實時監控系統CPU的一些統計信息,這些信息存放在/proc/stat文件中,在多核CPU系統里,不但能查看所有CPU的平均使用信息,還能查看某個特定CPU的信息。
使用方式:mpstat [-P {cpu|ALL}] [internal [count]]
當mpstat不帶參數時,輸出為從系統啟動以來的平均值。
[root@ubuntu~]# mpstat -P ALL
Linux 3.10.0-957.5.1.el7.x86_64 (VM_0_ubuntu) 08/22/2019 x86_64 (1 CPU)
05:00:44 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
05:00:44 PM all 1.67 0.00 1.65 4.21 0.00 0.02 0.00 0.00 0.00 92.45
05:00:44 PM 0 1.67 0.00 1.65 4.21 0.00 0.02 0.00 0.00 0.00 92.45
我們可以看到每個CPU核心的占用率、I/O等待、軟中斷、硬中斷等。
輸出各參數含義:
| 參數 | 含義 |
|---|---|
| -P | 表示監控哪個CPU, cpu在[0,cpu個數-1]中取值 |
| internal | 相鄰的兩次采樣的間隔時間 |
| count | 采樣的次數,count只能和internal一起使用 |
| 使用mpstat -P ALL 5 2命令,表示每5秒產生一個報告,總共產生2個。 |
[root@ubuntu~]# mpstat -P ALL 5 2
Linux 5.10.0-18-amd64 (DragonNetWork) 2022年10月04日 x86_64 (1 CPU)
^[[B
03時29分55秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
03時30分00秒 all 1.41 0.00 3.82 0.00 0.00 0.00 0.00 0.00 0.00 94.78
03時30分00秒 0 1.41 0.00 3.82 0.00 0.00 0.00 0.00 0.00 0.00 94.78
[[A[[AHHHHHH
03時30分00秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
03時30分05秒 all 1.21 0.00 3.42 0.00 0.00 0.00 0.00 0.00 0.00 95.37
03時30分05秒 0 1.21 0.00 3.42 0.00 0.00 0.00 0.00 0.00 0.00 95.37
平均時間: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
平均時間: all 1.31 0.00 3.62 0.00 0.00 0.00 0.00 0.00 0.00 95.08
平均時間: 0 1.31 0.00 3.62 0.00 0.00 0.00 0.00 0.00 0.00 95.08
輸出參數含義
當沒有參數時,mpstat則顯示系統啟動以后所有信息的平均值。有interval時,第一行的信息自系統啟動以來的平均信息。從第二行開始,輸出為前一個interval時間段的平均信息。 輸出各參數含義:
| 參數 | 釋義 | 從/proc/stat獲得數據 |
|---|---|---|
| CPU | 處理器ID | |
| ------- | ------------------------------------------------ | |
| %usr | 在internal時間段里,用戶態的CPU時間(%),不包含 nice值為負進程 | |
| %nice | 在internal時間段里,nice值為負進程的CPU時間(%) | |
| %sys | 在internal時間段里,核心時間(%) | |
| %iowait | 在internal時間段里,硬盤IO等待時間(%) | |
| %irq | 在internal時間段里,硬中斷時間(%) | |
| %soft | 在internal時間段里,軟中斷時間(%) | |
| %steal | 顯示虛擬機管理器在服務另一個虛擬處理器時虛擬CPU處在非自愿等待下花費時間的百分比 | |
| %guest | 顯示運行虛擬處理器時CPU花費時間的百分比 | |
| %gnice | ||
| %idle | 在internal時間段里,CPU除去等待磁盤IO操作外的因為任何原因而空閑的時間閑置時間(%) |
pidstat
pidstat用于監控全部或指定的進程占用系統資源的情況,包括CPU、內存、磁盤I/O、程切換、線程數等數據。
- -u:表示查看cpu相關的性能指標
- -w:表示查看上下文切換情況,要想查看每個進程的詳細情況,要加上-w
- -t:查看線程相關的信息,默認是進程的;常與-w結合使用(cpu的上下文切換包括進程的切換、線程的切換、中斷的切換)
- -d:展示磁盤 I/O 統計數據
- -p:指明進程號
使用方式:pidstat [option] interval [count]
使用范例:pidstat -urd -p 進程號
[root@VM_0_ubuntu ~]# pidstat -urd -p 24615
Linux 3.10.0-957.5.1.el7.x86_64 (VM_0_ubuntu) 08/22/2019 x86_64 (1 CPU)
輸出CPU的使用信息 -u
03:48:12 PM UID PID %usr %system %guest %CPU CPU Command
03:48:12 PM 0 24615 0.00 0.00 0.00 0.00 0 nginx
輸出內存的使用信息 -r
03:48:12 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command
03:48:12 PM 0 24615 0.00 0.00 58252 24940 1.32 nginx
** 輸出磁盤I/O的使用信息 -d **
03:48:12 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
03:48:12 PM 0 24615 0.07 0.00 0.00 nginx
03:20:54 PM UID PID cswch/s nvcswch/s Command
03:20:54 PM 0 24615 0.03 0.00 nginx
CPU信息
-
%usr #用戶層任務正在使用的CPU百分比(with or without nice priority ,NOT include time spent running a virtual processor)
-
%system #系統層正在執行的任務的CPU使用百分比
-
%guest #運行虛擬機的CPU占用百分比
-
%CPU #所有的使用的CPU的時間百分比
-
CPU #處理器數量
-
Command #命令
** 內存信息 ** -
PID #進程號
-
minflt/s #每秒次缺頁錯誤次數(minor page faults),次缺頁錯誤次數意即虛擬內存地址映射成物理內存地址產生的page fault次數
-
majflt/s #每秒主缺頁錯誤次數(major page faults),當虛擬內存地址映射成物理內存地址時,相應的page在swap中,這樣的page fault為major page fault,一般在內存使用緊張時產生
-
VSZ #該進程使用的虛擬內存(以kB為單位)
-
RSS #該進程使用的物理內存(以kB為單位)
-
%MEM #當前任務使用的有效內存的百分比
-
Command #任務的命令名
磁盤I/O -
PID #進程號
-
kB_rd/s #每秒此進程從磁盤讀取的千字節數
-
kB_wr/s #此進程已經或者將要寫入磁盤的每秒千字節數
-
kB_ccwr/s #由任務取消的寫入磁盤的千字節數
-
Command #命令的名字
上下文切換 -
PID #PID號
-
cswch/s #每秒自動上下文切換
-
nvcswch/s #每秒非自愿的上下文切換
-
Command #命令
# 每隔5秒輸出1組數據
$ pidstat -w 5
Linux 4.15.0 (ubuntu) 09/23/18 _x86_64_ (2 CPU)
08:18:26 UID PID cswch/s nvcswch/s Command
08:18:31 0 1 0.20 0.00 systemd
08:18:31 0 8 5.40 0.00 rcu_sched
這個結果中有兩列內容是我們的重點關注對象。一個是 cswch ,表示每秒自愿上下文切換(voluntary context switches)的次數,另一個則是 nvcswch ,表示每秒非自愿上下文切換(non voluntary context switches)的次數。
這兩個概念一定要牢牢記住,因為它們意味著不同的性能問題:
- 所謂自愿上下文切換,是指進程無法獲取所需資源,導致的上下文切換。比如說, I/O、內存等系統資源不足時,就會發生自愿上下文切換。
- 而非自愿上下文切換,則是指進程由于時間片已到等原因,被系統強制調度,進而發生的上下文切換。比如說,大量進程都在爭搶 CPU 時,就容易發生非自愿上下文切換
場景一:CPU 密集型進程
- 模擬一個 CPU 使用率 100% 的場景
stress --cpu 1 --timeout 600
- 在第二個終端運行 uptime 查看平均負載的變化情況
lqf@ubuntu:~$ uptime
16:01:48 up 1 day, 28 min, 4 users, load average: 0.61, 0.19, 0.06
- 第三個終端運行 mpstat 查看 CPU 使用率的變化情況
lqf@ubuntu:~$ mpstat -P ALL 5
Linux 4.15.0-142-generic (ubuntu) 11/02/2021 _x86_64_ (4 CPU)
04:02:14 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
04:02:19 PM all 25.03 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 74.97
04:02:19 PM 0 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
04:02:19 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:02:19 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:02:19 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
正好有一個 CPU 的使用率為 100%,但它的 iowait 只有 0。這說明,平均負載的升高正是由于 CPU 使用率為 100% 。
4. 查看是哪個進程導致了cpu使用率為100%
lqf@ubuntu:~$ pidstat -u 5 1
Linux 4.15.0-142-generic (ubuntu) 11/02/2021 _x86_64_ (4 CPU)
04:05:44 PM UID PID %usr %system %guest %CPU CPU Command
04:05:49 PM 122 1236 0.00 0.20 0.00 0.20 3 mysqld
04:05:49 PM 999 3098 0.20 0.00 0.00 0.20 1 redis-server
04:05:49 PM 1000 103642 100.00 0.00 0.00 100.00 2 stress
Average: UID PID %usr %system %guest %CPU CPU Command
Average: 122 1236 0.00 0.20 0.00 0.20 - mysqld
Average: 999 3098 0.20 0.00 0.00 0.20 - redis-server
Average: 1000 103642 100.00 0.00 0.00 100.00 - stress
場景二:I/O 密集型進程
- 第一個終端運行 stress 命令模擬 I/O 壓力
stress -i 1 --timeout 600
- 第二個終端運行 uptime 查看平均負載的變化情況
uptime
- 第三個終端運行 mpstat 查看 CPU 使用率的變化情況
mpstat -P ALL 5 1
- 查看是哪個進程,導致 iowait較高
pidstat -u 5 1
場景三:大量進程的場景
- 第一個終端模擬8個進程
stress -c 8 --timeout 600
- 第二個終端uptime
uptime
- 使用pidstat查看進程情況
lqf@ubuntu:~$ pidstat -u 5 1
Linux 4.15.0-142-generic (ubuntu) 11/02/2021 _x86_64_ (4 CPU)
04:13:57 PM UID PID %usr %system %guest %CPU CPU Command
04:14:02 PM 1000 3748 0.00 0.20 0.00 0.20 3 unity-panel-ser
04:14:02 PM 1000 103715 50.00 0.00 0.00 50.00 3 stress
04:14:02 PM 1000 103716 49.80 0.00 0.00 49.80 2 stress
04:14:02 PM 1000 103717 49.80 0.00 0.00 49.80 2 stress
04:14:02 PM 1000 103718 49.80 0.00 0.00 49.80 1 stress
04:14:02 PM 1000 103719 49.60 0.00 0.00 49.60 3 stress
04:14:02 PM 1000 103720 49.80 0.00 0.00 49.80 0 stress
04:14:02 PM 1000 103721 49.80 0.00 0.00 49.80 1 stress
04:14:02 PM 1000 103722 49.80 0.00 0.00 49.80 0 stress
Average: UID PID %usr %system %guest %CPU CPU Command
Average: 1000 3748 0.00 0.20 0.00 0.20 - unity-panel-ser
Average: 1000 103715 50.00 0.00 0.00 50.00 - stress
Average: 1000 103716 49.80 0.00 0.00 49.80 - stress
Average: 1000 103717 49.80 0.00 0.00 49.80 - stress
Average: 1000 103718 49.80 0.00 0.00 49.80 - stress
Average: 1000 103719 49.60 0.00 0.00 49.60 - stress
Average: 1000 103720 49.80 0.00 0.00 49.80 - stress
Average: 1000 103721 49.80 0.00 0.00 49.80 - stress
Average: 1000 103722 49.80 0.00 0.00 49.80 - stress
可以看出,8 個進程在爭搶 4 個 CPU,這些超出 CPU 計算能力的進程,最終導致 CPU 過載
2.2 CPU上下文切換
2.2.1 什么是CPU上下文切換
所謂的上下文切換,就是把上一個任務的寄存器和計數器保存起來,然后加載新任務的寄存器和計數器,最后跳轉到新任務的位置開始執行新任務。
根據任務的不同,CPU 的上下文切換就可以分為幾個不同的場景,也就是進程上下文切換、線程上下文切換以及中斷上下文切換
2.2.2 有哪些上下文切換
1 系統調用上下文切換
linux 進程既可以在用戶空間運行,又可以在內核空間中運行。
當它在用戶空間運行時,被稱為進程的用戶態;當它進入進入內核空間的時候,被稱為進程的內核態
從用戶態到內核態的轉變過程,需要通過系統調用來完成
CPU 寄存器里原來的指令位置是在用戶態。但是為了執行內核態代碼,需要先把用戶態的位置保存起來,然后寄存器更新為內核態指令的新位置。最后跳轉到內核態運行內核任務。
當系統調用結束后,CPU 寄存器需要恢復原來保存的用戶態位置,然后再切換到用戶空間,繼續運行進程。一次系統調用發生了兩次 CPU 上下文切換!
系統調用過程中對用戶態的資源沒有任何影響,也不會切換進程,所以也稱為特權模式切換.
2 進程上下文切換
進程是由內核來管理和調度的,所以進程的切換只發生在內核態。進程的上下文不僅包括了虛擬內存、棧、全局變量等用戶空間的資源,還包括了內核堆棧、寄存器等內核空間的狀態。
進程的上下文切換在保存當前進程的內核狀態和 CPU 寄存器之前,需要先把該進程的虛擬內存、棧等保存下來;而加載了下一進程的內核態后再刷新進程的虛擬內存映射關系和用戶棧,刷新虛擬內存映射就涉及到 TLB 快表 (虛擬地址緩存),因此會影響內存的訪問速度。
單次進程上下文切換的 CPU 時間在幾十納秒到數微秒之間。特別是在進程上下文切換次數較多的情況下,很容易導致 CPU 將大量時間耗費在寄存器、內核棧以及虛擬內存等資源的保存和恢復上,進而影響 cpu 的實際使用率。
進程上下文切換的原因
其一,為了保證所有進程可以得到公平調度,CPU 時間被劃分為一段段的時間片,這些時間片再被輪流分配給各個進程。這樣,當某個進程的時間片耗盡了,就會被系統掛起,切換到其它正在等待 CPU 的進程運行。(被動切換)
其二,進程在系統資源不足,這個時候進程也會被掛起,并由系統調度其他進程運行。(主動切換)
其三,當進程通過睡眠函數 sleep 這樣的方法將自己主動掛起時,自然也會重新調度。
其四,當有優先級更高的進程運行時,為了保證高優先級進程的運行,當前進程會被掛起,由高優先級進程來運行。
第五,發生硬件中斷時,CPU 上的進程會被中斷掛起,轉而執行內核中的中斷服務程序。
3 線程上下文切換
線程與進程的區別在于:線程是調度的基本單位,而進程是資源分配基本單位。內核中的任務調度,實際調度的是線程;而進程只是給線程提供了虛擬內存、全局變量等資源。
1:當進程只有一個線程時,可以認為進程就等于線程
2:當進程擁有多個線程時,共享虛擬內存和全局變量等資源。這些資源在上下文切換時不需要修改
3:線程也有自己的私有數據,比如棧和寄存器等,這些在上下文切換時需要保存
線程的上下文切換分為兩種
1.前后兩個線程屬于不同進程。此時,因為資源不共享,所以切換過程就跟進程上下文切換是一樣。
2.前后兩個線程屬于同一個進程。此時,因為虛擬內存是共享的,所以在切換時,虛擬內存這些資源就保持不動,只需要切換線程的私有數據、寄存器等不共享的數據
4 中斷上下文切換
為了快速響應硬件的事件,中斷處理會打斷進程的正常調度和執行,轉而調用中斷處理程序,響應設備事件。而在打斷其他進程時,就需要將進程當前的狀態保存下來,這樣在中斷結束后,進程仍然可以從原來的狀態恢復運行。
跟進程上下文不同,中斷上下文切換并不涉及到進程的用戶態。中斷上下文只包括內核態中斷服務程序執行所必需的狀態,包括 CPU 寄存器、內核堆棧、硬件中斷參數等
2.2.3 怎么查看上下文切換
過多的上下文切換,會把 CPU 時間消耗在寄存器、內核棧以及虛擬內存等數據的保存和恢復上,縮短進程真正運行的時間,成了系統性能大幅下降的一個元兇。
可以使用** vmstat **這個工具,來查詢系統的上下文切換情況。此命令顯示關于內核線程、虛擬內存、磁盤I/O 、陷阱和CPU占用率的統計信息。
vmstat
vmstat [options] [delay [count]]
lwl@DragonNetWork:~$ vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b 交換 空閑 緩沖 緩存 si so bi bo in cs us sy id wa st
0 0 0 957176 31068 452648 0 0 5379 315 254 1084 6 17 77 0 0
0 0 0 973764 31068 452680 0 0 0 1 134 767 1 3 95 0 0
需要注意如下內容。
- r(Running or Runnable)是就緒隊列的長度,也就是正在運行和等待 CPU 的進程數。
- b(Blocked)則是處于不可中斷睡眠狀態的進程數。
- buff:是I/O系統存儲的磁盤塊文件的元數據的統計信息。
- cache:是操作系統用來緩存磁盤數據的緩沖區,操作系統會自動一調節這個參數,在內存緊張時操作系統會減少cache的占用空間來保證其他進程可用。
- si和so較大時,說明系統頻繁使用交換區,應該查看操作系統的內存是否夠用。
- bi和bo代表I/O活動,根據其大小可以知道磁盤I/O的負載情況。
- in(interrupt)則是每秒中斷的次數。
- **cs*:參數表示線程環境的切換次數,此數據太大時表明線程的同步機制有問題。
2.2.4 案例分析
上下文切換頻率是多少次才是正常的?
使用sysbench 來模擬系統多線程調度切換的情況。
有命令,都默認以 root 用戶運行,運行 sudo su root 命令切換到 root 用戶。
- 測試工具sysbench的安裝:
apt install sysbench
- 使用vmstat查看空閑系統的上下文切換次數
lwl@DragonNetWork:~$ vmstat 1 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b 交換 空閑 緩沖 緩存 si so bi bo in cs us sy id wa st
0 0 0 981768 31148 453040 0 0 2431 171 181 783 3 9 87 0 0
- 在另一個終端開始壓測
// 以10個線程運行5分鐘的基準測試,模擬多線程切換的問題
sysbench --num-threads=10 --max-time=300 --max-requests=10000000 --test=threads run
4.使用vmstat查看
# 每隔1秒輸出1組數據(需要Ctrl+C才結束)
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b 交換 空閑 緩沖 緩存 si so bi bo in cs us sy id wa st
0 0 0 981736 31148 453040 0 0 1776 125 163 703 3 7 90 0 0
1 0 0 981004 31148 453040 0 0 0 0 225 999 1 6 93 0 0
0 0 0 981256 31148 453040 0 0 0 0 88 171 0 1 99 0 0
0 0 0 981508 31148 453040 0 0 0 0 75 155 0 1 99 0 0
0 0 0 980988 31148 453040 0 0 0 0 228 971 2 4 94 0 0
0 0 0 981256 31148 453040 0 0 0 0 85 164 0 2 98 0 0
0 0 0 981524 31148 453040 0 0 0 0 70 138 0 2 98 0 0
0 0 0 981004 31148 453040 0 0 0 0 228 1352 3 7 90 0 0
0 0 0 981256 31148 453040 0 0 0 0 71 149 0 1 99 0 0
0 0 0 981508 31148 453040 0 0 0 0 81 168 0 2 98 0 0
0 0 0 981004 31148 453040 0 0 0 0 195 1015 2 8 90 0 0
0 0 0 981272 31148 453040 0 0 0 0 83 164 1 4 95 0 0
- cs 列:的上下文切換次數從之前的 35 驟然上升到了 139 萬。
- r 列:就緒隊列的長度已經到了 8 ,遠遠超過了系統 CPU 的個數 2,所以肯定會有大量的 CPU 競爭。
- us(user)和 sy(system)列:這兩列的 CPU 使用率加起來上升到了 100%,其中系統 CPU 使用率,也就是 sy 列高達 84%,說明 CPU 主要是被內核占用了。
- in 列:中斷次數也上升到了 1 萬左右,說明中斷處理也是個潛在的問題。
綜合這幾個指標,我們可以知道,系統的就緒隊列過長,也就是正在運行和等待 CPU 的進程數過多,導致了大量的上下文切換,而上下文切換又導致了系統 CPU 的占用率升高。
**使用pidstat查看 **
什么進程導致了這些問題呢?
在第三個終端再用 pidstat 來看一下, CPU 和進程上下文切換的情況:
# 每隔1秒輸出1組數據(需要 Ctrl+C 才結束)
# -w參數表示輸出進程切換指標,而-u參數則表示輸出CPU使用指標
$ pidstat -w -u 1
從 pidstat 的輸出你可以發現,CPU 使用率的升高果然是 sysbench 導致的,它的 CPU 使用率已經達到了 100%。但上下文切換則是來自其他進程,包括非自愿上下文切換頻率最高的 pidstat ,以及自愿上下文切換頻率最高的內核線程 kworker 和 sshd。
怪異的事兒:pidstat 輸出的上下文切換次數,加起來也就幾百,比 vmstat 的 139 萬明顯小了太多。這是怎么回事呢?難道是工具本身出了錯嗎?別著急,在懷疑工具之前,我們再來回想一下,前面講到的幾種上下文切換場景。其中有一點提到, Linux 調度的基本單位實際上是線程,而我們的場景 sysbench 模擬的也是線程的調度問題,那么,是不是 pidstat 忽略了線程的數據呢?
?
通過運行 man pidstat ,你會發現,pidstat 默認顯示進程的指標數據,加上 -t 參數后,才會輸出線程的指標。所以,我們可以在第三個終端里, Ctrl+C 停止剛才的 pidstat 命令,再加上 -t 參數,重試一下看看:
# 每隔1秒輸出一組數據(需要 Ctrl+C 才結束)
# -wt 參數表示輸出線程的上下文切換指標
$ pidstat -wt 1
08:14:05 UID TGID TID cswch/s nvcswch/s Command
...
08:14:05 0 10551 - 6.00 0.00 sysbench
08:14:05 0 - 10551 6.00 0.00 |__sysbench
08:14:05 0 - 10552 18911.00 103740.00 |__sysbench
08:14:05 0 - 10553 18915.00 100955.00 |__sysbench
08:14:05 0 - 10554 18827.00 103954.00 |__sysbench
現在你就能看到了,雖然 sysbench 進程(也就是主線程)的上下文切換次數看起來并不多,但它的子線程的上下文切換次數卻有很多。看來,上下文切換罪魁禍首,還是過多的 sysbench 線程,這也解釋了:對于線程池而言,并不是開啟的線程越多越好。
每秒上下文切換多少次才算正常呢?這個數值其實取決于系統本身的 CPU 性能。 如果系統的上下文切換次數比較穩定,那么從數百到一萬以內,都應該算是正常的。但當上下文切換次數超過一萬次,或者切換次數出現數量級的增長時,就很可能已經出現了性能問題。
?
這時,你還需要根據上下文切換的類型,再做具體分析。比方說:
- 自愿上下文切換變多了,說明進程都在等待資源,有可能發生了 I/O 等其他問題;
- 非自愿上下文切換變多了,說明進程都在被強制調度,也就是都在爭搶 CPU,說明 CPU 的確成了瓶頸;
- 中斷次數變多了,說明 CPU 被中斷處理程序占用,還需要通過查看 /proc/interrupts 文件來分析具體的中斷類型。
2.3 遇到CPU利用率高該如何排查
遇到CPU使用率高時,首先確認CPU是消耗在哪一塊,如果是內核態占用CPU較高:
- %iowait 高,這時要重點關注磁盤IO的相關操作,是否存在不合理的寫日志操作,數據庫操作等;
- %soft或%cs 高,觀察CPU負載是否較高、網卡流量是否較大,可不可以精簡數據、代碼在是否在多線程操作上存在不合適的中斷操作等;
- %steal 高,這種情況一般發生在虛擬機上,這時要查看宿主機是否資源超限;
如果是用戶態較高,且沒有達到預期的性能,說明應用程序需要優化。
2.3.1 根據指標查找工具

2.3.2 根據工具查指標

3 內存性能監控
3.1 內存是什么-虛擬內存和物理內存
該文原文鏈接參考:https://blog.csdn.net/lvyibin890/article/details/82217193
操作系統有虛擬內存與物理內存的概念。在很久以前,還沒有虛擬內存概念的時候,程序尋址用的都是物理地址。程序能尋址的范圍是有限的,這取決于CPU的地址線條數。比如在32位平臺下,尋址的范圍是2^32也就是4G。并且這是固定的,如果沒有虛擬內存,且每次開啟一個進程都給4G的物理內存,就可能會出現很多問題:
- 因為我的物理內存時有限的,當有多個進程要執行的時候,都要給4G內存,很顯然你內存小一點,這很快就分配完了,于是沒有得到分配資源的進程就只能等待。當一個進程執行完了以后,再將等待的進程裝入內存。這種頻繁的裝入內存的操作是很沒效率的
- 由于指令都是直接訪問物理內存的,那么我這個進程就可以修改其他進程的數據,甚至會修改內核地址空間的數據,這是我們不想看到的
- 因為內存時隨機分配的,所以程序運行的地址也是不正確的
一個進程運行時都會得到4G的虛擬內存。這個虛擬內存你可以認為,每個進程都認為自己擁有4G的空間,這只是每個進程認為的,但是實際上,在虛擬內存對應的物理內存上,可能只對應的一點點的物理內存,實際用了多少內存,就會對應多少物理內存。
進程得到的這4G虛擬內存是一個連續的地址空間(這也只是進程認為),而實際上,它通常是被分隔成多個物理內存碎片,還有一部分存儲在外部磁盤存儲器上,在需要時進行數據交換。
進程開始要訪問一個地址,它可能會經歷下面的過程
-
每次我要訪問地址空間上的某一個地址,都需要把地址翻譯為實際物理內存地址
-
所有進程共享這整一塊物理內存,每個進程只把自己目前需要的虛擬地址空間映射到物理內存上
-
進程需要知道哪些地址空間上的數據在物理內存上,哪些不在(可能這部分存儲在磁盤上),還有在物理內存上的哪里,這就需要通過頁表來記錄
-
頁表的每一個表項分兩部分,第一部分記錄此頁是否在物理內存上,第二部分記錄物理內存頁的地址(如果在的話)
-
當進程訪問某個虛擬地址的時候,就會先去看頁表,如果發現對應的數據不在物理內存上,就會發生缺頁異常
-
缺頁異常的處理過程,操作系統立即阻塞該進程,并將硬盤里對應的頁換入內存,然后使該進程就緒,如果內存已經滿了,沒有空地方了,那就找一個頁覆蓋,至于具體覆蓋的哪個頁,就需要看操作系統的頁面置換算法是怎么設計的了。
-
我們的cpu想訪問虛擬地址所在的虛擬頁(VP3),根據頁表,找出頁表中第三條的值.判斷有效位。 如果有效位為1,DRMA緩存命中,根據物理頁號,找到物理頁當中的內容,返回。
-
若有效位為0,參數缺頁異常,調用內核缺頁異常處理程序。內核通過頁面置換算法選擇一個頁面作為被覆蓋的頁面,將該頁的內容刷新到磁盤空間當中。然后把VP3映射的磁盤文件緩存到該物理頁上面。然后頁表中第三條,有效位變成1,第二部分存儲上了可以對應物理內存頁的地址的內容。
-
缺頁異常處理完畢后,返回中斷前的指令,重新執行,此時緩存命中,執行1。
-
將找到的內容映射到告訴緩存當中,CPU從告訴緩存中獲取該值,結束。
當每個進程創建的時候,內核會為進程分配4G的虛擬內存,當進程還沒有開始運行時,這只是一個內存布局。實際上并不立即就把虛擬內存對應位置的程序數據和代碼(比如.text .data段)拷貝到物理內存中,只是建立好虛擬內存和磁盤文件之間的映射就好(叫做存儲器映射)。這個時候數據和代碼還是在磁盤上的。當運行到對應的程序時,進程去尋找頁表,發現頁表中地址沒有存放在物理內存上,而是在磁盤上,于是發生缺頁異常,于是將磁盤上的數據拷貝到物理內存中。
另外在進程運行過程中,要通過malloc來動態分配內存時,也只是分配了虛擬內存,即為這塊虛擬內存對應的頁表項做相應設置,當進程真正訪問到此數據時,才引發缺頁異常。
可以認為虛擬空間都被映射到了磁盤空間中(事實上也是按需要映射到磁盤空間上,通過mmap,mmap是用來建立虛擬空間和磁盤空間的映射關系的)
3.2 內存中的buffer和cache
root@ubuntu:/home/lqf# free -h
total used free shared buff/cache available
Mem: 5.9G 1.2G 1.1G 36M 3.6G 4.3G
Swap: 974M 12K 974M
這個界面包含了物理內存 Mem 和交換分區 Swap 的具體使用情況,比如總內存、已用內存、緩存、可用內存等。其中緩存是 Buffer 和 Cache 兩部分的總和。
- Mem 行(第二行)是內存的使用情況。
- Swap 行(第三行)是交換空間的使用情況。
- total 列顯示系統總的可用物理內存和交換空間大小。
- used 列顯示已經被使用的物理內存和交換空間。
- free 列顯示還有多少物理內存和交換空間可用使用。
- shared 列顯示被共享使用的物理內存大小。
- buff/cache 列顯示被 buffer 和 cache 使用的物理內存大小。
- available 列顯示還可以被應用程序使用的物理內存大小。
對于buffer和cache的區別
- Buffers 是對原始磁盤塊的臨時存儲,也就是用來緩存磁盤的數據,通常不會特別大(20MB 左右)。這樣,內核就可以把分散的寫集中起來,統一優化磁盤的寫入,比如可以把多次小的寫合并成單次大的寫等等。
- Cached 是從磁盤讀取文件的頁緩存,也就是用來緩存從文件讀取的數據。這樣,下次訪問這些文件數據時,就可以直接從內存中快速獲取,而不需要再次訪問緩慢的磁盤。
- Buffer 既可以用作“將要寫入磁盤數據的緩存”,也可以用作“從磁盤讀取數據的緩存”。
- Cache 既可以用作“從文件讀取數據的頁緩存”,也可以用作“寫文件的頁緩存”。
Buffer 是對磁盤數據的緩存,而 Cache 是文件數據的緩存,它們既會用在讀請求中,也會用在寫請求中。
在讀寫普通文件時,會經過文件系統,由文件系統負責與磁盤交互;而讀寫磁盤或者分區時,就會跳過文件系統,也就是所謂的“裸I/O“。這兩種讀寫方式所使用的緩存是不同的,也就是文中所講的 Cache 和 Buffer 區別。
3.3 內存優化監測
Buffer 和 Cache 分別緩存的是對磁盤和文件系統的讀寫數據。
- 從寫的角度來說,不僅可以優化磁盤和文件的寫入,對應用程序也有好處,應用程序可以在數據真正落盤前,就返回去做其他工作。
- 從讀的角度來說,不僅可以提高那些頻繁訪問數據的讀取速度,也降低了頻繁 I/O 對磁盤的壓力
4 文件IO性能監控
寫入速度
讀取速度
寫入次數
讀取次數
io等待時間 時間越大說明文件操作頻繁
磁盤的統計參數
- tps:該設備每秒的傳輸次數(Indicate the number of transfers per second that were issued to the device.)。"一次傳輸"意思是"一次I/O請求"。
多個邏輯請求可能會被合并為"一次I/O請求"。"一次傳輸"請求的大小是未知的。 - kB_read/s:每秒從設備(drive expressed)讀取的數據量;
- kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;
- kB_read:讀取的總數據量;
- kB_wrtn:寫入的總數量數據量;這些單位都為Kilobytes。
系統調用、VFS、緩存、文件系統以及塊存儲之間的關系如下圖所示:
![]()
Linux 內核在用戶進程和文件系統的中間,又引入了一個抽象層,也就是虛擬文件系統 VFS(Virtual File System)。
I/O 指的是相對內存而言的 input 和 output。從文件、數據庫、網絡向內存中寫入數據叫做 input;從內存向文件、數據庫、網絡中輸出數據叫做 output。Linux 系統 I/O 分為內核準備數據和將數據從內核拷貝到用戶空間兩個階段
4.1 I/O 的兩種方式(緩存 I/O 和直接 I/O)
1 緩存 I/O
緩存 I/O 又被稱作標準 I/O,大多數文件系統的默認 I/O 操作都是緩存 I/O。在 Linux 的緩存 I/O 機制中,數據先從磁盤復制到內核空間的緩沖區,然后從內核空間緩沖區復制到應用程序的地址空間(用戶空間)。
- 讀操作:操作系統檢查內核空間的緩沖區有沒有需要的數據,如果已經緩存了,那么就直接從緩存中返回,也就是將數據復制到應用程序的用戶空間;否則從磁盤中讀取數據至內核空間的緩沖區,再將內核空間緩沖區的數據返回。
- 寫操作:將數據從用戶空間復制到內核空間的緩沖區,這時對用戶程序來說寫操作就已經完成。至于什么時候將數據從內核空間寫到磁盤中,這步由操作系統決定,除非顯示地調用了 sync 同步命令。
緩存 I/O 的優點:
- 在一定程度上分離了內核空間和用戶空間,保護系統本身的運行安全;
- 可以減少讀盤的次數,從而提高性能。
緩存 I/O 的缺點: - 在緩存 I/O 機制中,DMA 方式可以將數據直接從磁盤讀到內核空間的頁緩存中,或者將數據從內核空間的頁緩存中直接寫回到磁盤上,而不能直接在應用程序地址空間(用戶空間)和磁盤之間進行數據傳輸。這樣,數據在傳輸過程中需要在應用程序地址空間(用戶空間)和頁緩存(內核空間)之間進行多次數據拷貝操作,這些數據拷貝操作所帶來的 CPU 以及內存開銷是比較大的。
2 直接 I/O
直接 IO 就是應用程序直接訪問磁盤,而不經過內核緩沖區,這樣做的目的是減少一次從內核緩沖區到用戶程序地址空間的數據復制操作。
例如數據庫管理系統這類應用,它們更傾向于選擇自己的緩存機制,因為數據庫管理系統往往比操作系統更了解數據庫中存放的數據。數據庫管理系統可以提供一種更加高效的緩存機制來提高數據庫中存取數據的性能。
4.2 監控磁盤I/O的命令
1 iostat IO狀態
該命令用于監控CPU占用率、平均負載值及I/O讀寫速度等。
參數介紹
iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]
常用參數
-c: 輸出cpu統計信息-d: 輸出磁盤統計信息 注:默認是兩個都輸出-k|-m: 以kb/s|mb/s代替原來的塊/s-t: 輸出時打印收集信息時刻的時間 注:時間的打印格式和系統變量S_TIME_FORMAT相關-x: 輸出詳細的拓展統計數據,比如各種等待時間,隊列,利用率等信息。interval [count] :interval是統計的時間間隔單位是s,count則是統計次數
await指的是平均等待時間,一般都在10ms左右。
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 80.00 5.00 1152.00 20.00 935160.00 1616.56 2.74 2.96 1.60 2.97 0.74 85.20
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 80.00 15.00 1137.00 852.00 1049236.00 1823.07 2.30 2.59 1.07 2.61 0.72 82.80
每個輸出消息含義:
- rrqm/s: 每秒對該設備的讀請求被合并次數,文件系統會對讀取同塊(block)的請求進行合并
- wrqm/s: 每秒對該設備的寫請求被合并次數
- r/s: 每秒完成的讀次數
- w/s: 每秒完成的寫次數
- rkB/s: 每秒讀數據量(kB為單位)
- wkB/s: 每秒寫數據量(kB為單位)
- avgrq-sz:平均每次IO操作的數據量(扇區數為單位) ,比如1616.56
- avgqu-sz: 平均等待處理的IO請求隊列長度,比如2.74
- await: 平均每次IO請求等待時間(包括等待時間和處理時間,毫秒為單位),比如w_await 2.97
- svctm: 平均每次IO請求的處理時間(毫秒為單位),比如0.72
- %util: 采用周期內用于IO操作的時間比率,即IO隊列非空的時間比率。表示該設備的繁忙程度,比如82.80。例如,如果統計間隔1秒,該設備有0.5秒在處理IO,而0.5秒閑置,則該設備的%util = 0.5/1 = 50%。一般地,如果該參數是100%表示設備已經接近滿負荷運行。
關于 await和svctm
可以理解為IO請求的響應時間,包括隊列等待時間和服務時間,我們分析IO問題時,如果await大于svctm,await-svctm差值越小,則說明隊列時間越短, 反之差值越大,隊列時間越長,說明磁盤io有性能問題。
cpu的統計信息,如果是多cpu系統,顯示的所有cpu的平均統計信息。
- %user:用戶進程消耗cpu的比例
- %nice:用戶進程優先級調整消耗的cpu比例
- %sys:系統內核消耗的cpu比例
- %iowait:等待磁盤io所消耗的cpu比例
- %idle:閑置cpu的比例(不包括等待磁盤I/O)
常用用法
// kb/s顯示磁盤信息,每2s刷新一次
iostat -d -k 2
// kb/s顯示磁盤統計信息及擴展信息,每1s刷新 ,刷新10次結束
iostat -dkx 1 10
2 swapon查看分區使用情況
查看交互分區的使用情況
使用方法:swapon -s
[root@VM_0_ubuntu ~]# swapon -s
Filename Type Size Used Priority
/var/swap file 8191996 473856 -2
我們在安裝系統的時候已經建立了 swap 分區。swap 分區通常被稱為交換分區,這是一塊特殊的硬盤空間,即當實際內存不夠用的時候,操作系統會從內存中取出一部分暫時不用的數據,放在交換分區中,從而為當前運行的程序騰出足夠的內存空間。 也就是說,當內存不夠用時,我們使用 swap 分區來臨時頂替。這種“拆東墻,補西墻”的方式應用于幾乎所有的操作系統中
一般來講,swap 分區容量應大于物理內存大小,建議是內存的兩倍,但不超過 2GB。
3 df硬盤使用情況
該命令用于查看文件系統的硬盤掛載點和空間使用情況。
使用方式:df -h
[root@VM_0_ubuntu ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 50G 42G 5.6G 89% /
devtmpfs 909M 0 909M 0% /dev
tmpfs 920M 24K 920M 1% /dev/shm
tmpfs 920M 844K 919M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
tmpfs 184M 0 184M 0% /run/user/0
4 du目錄文件大小
du常用的選項:
-h:以人類可讀的方式顯示,顯示M或K
-a:顯示目錄占用的磁盤空間大小,還要顯示其下目錄和文件占用磁盤空間的大小-s:顯示目錄占用的磁盤空間大小,不顯示其下子目錄和文件占用的磁盤空間大小-c:顯示幾個目錄或文件占用的磁盤空間大小,還要統計它們的總和
du -a 顯示目錄和目錄下子目錄和文件占用磁盤空間的大小。直接使用-a 以字節為單位,-ha 如下圖以M或K為結果顯示。
du -s 顯示當前所在目錄大小
du -s -h home 顯示home目錄大小
du -c 顯示幾個目錄或文件占用的磁盤空間大小,還要統計它們的總和
du -lh --max-depth=1 : 查看當前目錄下一級子文件和子目錄占用的磁盤容量。
[root@VM_0_ubuntu 0voice_im]# du -lh --max-depth=1
6.1M ./php
11M ./ios
146M ./server
6.6M ./pb
723M ./auto_setup
29M ./android
133M ./win-client
18M ./mac
8.0K ./tutorial
28K ./doc
99M ./.git
1.2G .
4.3 文件IO寫入頻繁案例分析
-
啟動iostat -x命令監測
iostat -dkx 1 30 -
使用sysbench模擬數據讀寫
sysbench的性能測試都需要做prepare,run,cleanup這三步,準備數據,跑測試,刪除數據。在準備階段創建測試所需數據,在清理階段刪除這些數據。
#cd要到你測試的磁盤目錄下
cd /data/disktest
# 線程數=4 每隔4s輸出一次結果 測試時間=60s
# 文件數=10 文件總大小=10G 文件操作模式=隨機讀寫
sysbench --num-threads=4 --max-time=60 --test=fileio --file-num=10 --file-total-size=10G --file-test-mode=rndrw prepare
sysbench --num-threads=4 --max-time=60 --test=fileio --file-num=10 --file-total-size=10G --file-test-mode=rndrw run
sysbench --num-threads=4 --max-time=60 --test=fileio --file-num=10 --file-total-size=10G --file-test-mode=rndrw cleanup
5 網絡IO性能監控
5.1 性能指標
通常用帶寬、吞吐量、延時、PPS(Packet Per Second)等指標衡量網絡的性能。
- 帶寬,表示鏈路的最大傳輸速率,單位通常為 b/s (比特 / 秒)。
- 吞吐量,表示單位時間內成功傳輸的數據量,單位通常為 b/s(比特 / 秒)或者 B/s(字節 / 秒)。吞吐量受帶寬限制,而吞吐量 / 帶寬,也就是該網絡的使用率。
- 延時,表示從網絡請求發出后,一直到收到遠端響應,所需要的時間延遲。在不同場景中,這一指標可能會有不同含義。比如,它可以表示,建立連接需要的時間(比如 TCP 握手延時),或一個數據包往返所需的時間(比如 RTT)。
- PPS,是 Packet Per Second(包 / 秒)的縮寫,表示以網絡包為單位的傳輸速率。PPS 通常用來評估網絡的轉發能力,比如硬件交換機,通??梢赃_到線性轉發(即 PPS 可以達到或者接近理論最大值)。而基于 Linux 服務器的轉發,則容易受網絡包大小的影響。
除了這些指標,網絡的可用性(網絡能否正常通信)、并發連接數(TCP 連接數量)、丟包率(丟包百分比)、重傳率(重新傳輸的網絡包比例)等也是常用的性能指標。
5.2 網絡信息
5.2.1 網絡配置
使用 ifconfig 或者 ip 命令,來查看網絡的配置。
ifconfig 和 ip 分別屬于軟件包 net-tools 和 iproute2,iproute2 是 net-tools 的下一代。通常情況下它們會在發行版中默認安裝。
如果你找不到 ifconfig 或者 ip 命令,可以安裝這兩個軟件包。
以網絡接口 ens33為例
- 使用ifconfig
root@ubuntu:/home/lqf# ifconfig ens33
ens33 Link encap:Ethernet HWaddr 00:0c:29:11:82:79
inet addr:192.168.206.134 Bcast:192.168.206.255 Mask:255.255.255.0
inet6 addr: fe80::ceb7:e01f:2d2b:c50e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:48485 errors:0 dropped:0 overruns:0 frame:0
TX packets:124191 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:35666099 (35.6 MB) TX bytes:8827549 (8.8 MB)
- 使用ip
root@ubuntu:/home/lqf# ip -s addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:11:82:79 brd ff:ff:ff:ff:ff:ff
inet 192.168.206.134/24 brd 192.168.206.255 scope global dynamic ens33
valid_lft 1493sec preferred_lft 1493sec
inet6 fe80::ceb7:e01f:2d2b:c50e/64 scope link
valid_lft forever preferred_lft forever
RX: bytes packets errors dropped overrun mcast
35667821 48505 0 0 0 0
TX: bytes packets errors dropped carrier collsns
8831315 124236 0 0 0 0
以下和網絡性能密切相關的指標需要掌握:
-
網絡接口的狀態標志。ifconfig 輸出中的 RUNNING ,或 ip 輸出中的 LOWER_UP ,都表示物理網絡是連通的,即網卡已經連接到了交換機或者路由器中。如果你看不到它們,通常表示網線被拔掉了。
-
MTU 的大小。MTU 默認大小是 1500,根據網絡架構的不同(比如是否使用了 VXLAN 等疊加網絡),你可能需要調大或者調小 MTU 的數值。
-
網絡接口的 IP 地址、子網以及 MAC 地址。這些都是保障網絡功能正常工作所必需的,你需要確保配置正確。
-
網絡收發的字節數、包數、錯誤數以及丟包情況,特別是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指標不為 0 時,通常表示出現了網絡 I/O 問題。其中:
- errors 表示發生錯誤的數據包數,比如校驗錯誤、幀同步錯誤等;
- dropped 表示丟棄的數據包數,即數據包已經收到了 Ring Buffer,但因為內存不足等原因丟包;
- overruns 表示超限數據包數,即網絡 I/O 速度過快,導致 Ring Buffer 中的數據包來不及處理(隊列滿)而導致的丟包;
- carrier 表示發生 carrirer 錯誤的數據包數,比如雙工模式不匹配、物理電纜出現問題等;
- collisions 表示碰撞數據包數。
5.2.2 套接字信息
使用netstat或者 ss ,來查看套接字、網絡棧、網絡接口以及路由表的信息。
PS:查詢網絡的連接信息ss比netstat查詢速度更快
# head -n 3 表示只顯示前面3行
-a (all)顯示所有選項,默認不顯示LISTEN相關
-t (tcp)僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數字的全部轉化成數字。
-l 僅列出有在 Listen (監聽) 的服務狀態
-p 顯示建立相關鏈接的程序名
-r 顯示路由信息,路由表
-e 顯示擴展信息,例如uid等
-s 按各個協議進行統計
-c 每隔一個固定時間,執行該netstat命令。
root@ubuntu:/home/lqf# netstat -nlp | head -n 3
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:6371 0.0.0.0:* LISTEN 3098/redis-server *
# -l 表示只顯示監聽套接字
# -t 表示只顯示 TCP 套接字
# -n 表示顯示數字地址和端口(而不是名字)
# -p 表示顯示進程信息
root@ubuntu:/home/lqf# ss -ltnp | head -n 3
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:6371 *:* users:(("redis-server",pid=3098,fd=6))
LISTEN 0 80 127.0.0.1:3306 *:* users:(("mysqld",pid=1236,fd=39))
netstat 和 ss 的輸出也是類似的,都展示了套接字的狀態、接收隊列、發送隊列、本地地址、遠端地址、進程 PID 和進程名稱等。其中,接收隊列(Recv-Q)和發送隊列(Send-Q)需要特別關注,它們通常應該是 0。當你發現它們不是 0 時,說明有網絡包的堆積發生。當然還要注意,在不同套接字狀態下,它們的含義不同。
當套接字處于連接狀態(Established)時:
- Recv-Q 表示套接字緩沖還沒有被應用程序取走的字節數(即接收隊列長度)。
- Send-Q 表示還沒有被遠端主機確認的字節數(即發送隊列長度)。
當套接字處于監聽狀態(Listening)時:
Recv-Q 表示全連接** 隊列的長度。
Send-Q 表示全連接隊列的最大長度**。
所謂全連接,是指服務器收到了客戶端的 ACK,完成了 TCP 三次握手,然后就會把這個連接挪到全連接隊列中。這些全連接中的套接字,還需要被 accept() 系統調用取走,服務器才可以開始真正處理客戶端的請求。
與全連接隊列相對應的,還有一個半連接隊列。所謂半連接是指還沒有完成 TCP 三次握手的連接,連接只進行了一半。服務器收到了客戶端的 SYN 包后,就會把這個連接放到半連接隊列中,然后再向客戶端發送 SYN+ACK 包。
5.2.3 協議棧統計信息-netstat命令
使用 netstat 或 ss 查看協議棧的信息
root@ubuntu:/home/lqf# netstat -s
Ip:
351903 total packets received
3 with invalid addresses
0 forwarded
0 incoming packets discarded
351838 incoming packets delivered
664706 requests sent out
4 outgoing packets dropped
328 dropped because of missing route
root@ubuntu:/home/lqf# ss -s
Total: 1501 (kernel 8096)
TCP: 34 (estab 3, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* 8096 - -
RAW 1 0 1
UDP 28 23 5
TCP 34 23 11
INET 63 46 17
FRAG 0 0 0
這些協議棧的統計信息都很直觀。ss 只顯示已經連接、關閉、孤兒套接字等簡要統計,而netstat 則提供的是更詳細的網絡協議棧信息。比如,上面 netstat 的輸出示例,就展示了 TCP 協議的主動連接、被動連接、失敗重試、發送和接收的分段數量等各種信息。
5.2.4 網絡吞吐-sar命令
給sar 增加 -n參數就可以查看網絡的統計信息,比如網絡接口(DEV)、網絡接口錯誤(EDEV)、TCP、UDP、ICMP 等等。執行下面的命令,你就可以得到網絡接口統計信息:
root@iZbp1h2l856zgoegc8rvnhZ:~# sar -n DEV 1
Linux 4.4.0-93-generic (iZbp1h2l856zgoegc8rvnhZ) 11/02/2021 _x86_64_ (1 CPU)
06:38:15 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
06:38:16 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:38:16 PM eth0 11.46 10.42 6.35 2.47 0.00 0.00 0.00 0.00
輸出指標含義
- rxpck/s 和 txpck/s 分別是接收和發送的 PPS,單位為包 / 秒。
- rxkB/s 和 txkB/s 分別是接收和發送的吞吐量,單位是 KB/ 秒。
- rxcmp/s 和 txcmp/s 分別是接收和發送的壓縮數據包數,單位是包 / 秒。
- %ifutil 是網絡接口的使用率,即半雙工模式下為 (rxkB/s+txkB/s)/Bandwidth,而全雙工模式下為 max(rxkB/s, txkB/s)/Bandwidth。
Linux 5.10.0-18-amd64 (DragonNetWork) 2022年10月04日 x86_64 (1 CPU)
15時32分37秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
15時32分38秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
15時32分38秒 ens33 75.00 130.00 5.13 23.98 0.00 0.00 0.00 0.02
平均時間: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
平均時間: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均時間: ens33 75.00 130.00 5.13 23.98 0.00 0.00 0.00 0.02
從輸出中可以看到網卡的讀寫速度和流量,在應急過程中可以用來判斷服務器是否上量。
此命令除了可以用于查看網卡的信息,還可以用來收集如下服務的狀態信息。
- -A:所有報告的總和。
- -u:CPU利用率。
- -v:進程、I節點、文件和鎖表狀態。
- -d:硬盤的使用報告。
- -r:沒有使用的內存頁面和硬盤快。
- -g:串口I/O的情況。
- -b:緩沖區的使用情況。
- -a:文件的讀寫情況。
- -c:系統的調用情況。
- -R:進程的活動情況。
- -y:終端設備的活動情況。
- -w:系統的交換活動。
5.2.5 連通性和延時
通常使用 ping ,來測試遠程主機的連通性和延時
ping
說明
ping命令是用于檢測網絡故障的常用命令,可以用來鋇J試一臺主機到另外一臺主機的網絡是否連通。
語法
ping [-dfnqrRv][-c<完成次數>][-i<間隔秒數>][-I<網絡界面>][-l<前置載入>][-p<范本樣式>][-s<數據包大小>][-t<存活數值>][主機名稱或IP地址]
- -d 使用Socket的SO_DEBUG功能。
- -c<完成次數> 設置完成要求回應的次數。
- -f 極限檢測。
- -i<間隔秒數> 指定收發信息的間隔時間。
- -I<網絡界面> 使用指定的網絡接口送出數據包。
- -l<前置載入> 設置在送出要求信息之前,先行發出的數據包。
- -n 只輸出數值。
- -p<范本樣式> 設置填滿數據包的范本樣式。
- -q 不顯示指令執行過程,開頭和結尾的相關信息除外。
- -r 忽略普通的Routing Table,直接將數據包送到遠端主機上。
- -R 記錄路由過程。
- -s<數據包大小> 設置數據包的大小。
- -t<存活數值> 設置存活數值TTL的大小。
- -v 詳細顯示指令的執行過程。
檢測和主機是否連通
ping baidu.com
ping指定次數
-
ping目標主機的域名和IP(ping會自動將域名轉換為IP)
-
不帶包頭的包大小和帶包頭的包大?。▍⒖肌?s”參數)
-
icmp_seq:ping序列,從1開始;如果數字不是按順序遞增也就意味著丟包了
ttl:剩余的ttl;見TTL解釋
time: 響應時間,數值越小,連通速度越快; -
發出去的包數,返回的包數,丟包率,耗費時間;
-
最小/最大/平均響應時間和本機硬件耗費時間;
TTL:每經過一個‘路由點‘,就把預先設定的這個TTL數值減1,直到最后TTL=1時報文就被扔掉,不向下轉發。ping顯示的TTL是指:被ping主機那里返回的報文,到了你這里,從它自己預設的TTL減小到還剩下多少。
范例
- 指定ping的次數: -c 次數
ping -c 4 www.baidu.com
- 只顯示結果:-q
lwl@ubuntu:~$ ping -c 4 www.baidu.com -q
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3008ms
rtt min/avg/max/mdev = 20.471/21.141/21.678/0.444 ms
mdev 往返時延
mdev是 Mean Deviation 的縮寫, 表示 ICMP包的RTT(Round-Trip Time,往返時延)偏離平均值的程度, 主要用來衡量網速的穩定性。 mdev 的值越大說明 網速越不穩定。 另外,不同的操作系統的mdev的名字也有所不同, 在mac下它叫作 stddev, 而在 Windows 下則根本沒有這個統計指標。
RTT參考值
| 場景 | 參考值 |
|---|---|
| 本機 | 0.001ms |
| 同機房 | 0.1ms |
| 同城 | 1ms |
| 不同城 | 20ms |
| 中國北方到南方 | 50ms |
| 國內到國外 | 200ms |
| 3.制定ping數據包的大小 | |
| 默認ping命令的數據包大小是64Bytes,通過-s選項可以制定數據包的大小 | |
| 范圍:1Byte-65507Byte |
root@ubuntu:/home/lqf# ping -s 254 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 254(282) bytes of data.
262 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.054 ms
262 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.056 ms
262 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.026 ms
262 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.042 ms
262 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.025 ms
補充:,如果以最大值去ping服務器,并且以多進程多終端的方式,可能會造成服務器響應遲緩,可以認為是一種網絡攻擊手段
4.TTL 生成時間
TTL(Time to Live) ,即生存時間,指的是數據包被路由器丟棄之前允許通過的路由器的跳數,為了防止數據包在路由器之間無限轉發,必須設置一個TTL值,每次路由器轉發后都會將這個值減1,直到TTL的值為0,這個數據包的生命就被終結了.
命令 : ping -t 255 www.baidu.com
若不指定ttl的值,系統會默認給定一個值,不同的操作系統有不同的默認TTL值:
操作系統 TCP傳輸 UDP傳輸
AIX 60 30
DEC Patchworks V5 30 30
FreeBSD 2.1 64 64
HP/UX 9.0x 30 30
HP/UX 10.01 64 64
Irix 5.3 60 60
Irix 6.x 60 60
UNIX 255 255
Linux 64 64
MacOS/MacTCP 2.0.x 60 60
OS/2 TCP/IP 3.0 64 64
OSF/1 V3.2A 60 30
Solaris 2.x 255 255
SunOS 4.1.3/4.1.4 60 60
Ultrix V4.1/V4.2A 60 30
VMS/Multinet 64 64
VMS/TCPware 60 64
VMS/Wollongong 1.1.1.1 128 30
VMS/UCX (latest rel.) 128 128
MS Windows 95/98/NT 3.51 32 32
Windows NT 4.0/2000/XP/2003 128 128
補充:
通過TTL設定值我們可以找到某主機到某主機的最小跳躍次數,即路由轉發次數,如下,可以看到我的主機到百度的最小跳至少是11,因為ttl為10是顯示跳躍超限,說明數據包在傳給百度服務器的路上已經死了
root@ubuntu:/home/lwl# ping -t 11 www.baidu.com
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
^C 按Ctrl +C 退出ping
--- www.a.shifen.com ping statistics ---
79 packets transmitted, 0 received, 100% packet loss, time 79045ms
5.3 其他常用的網絡相關命令
telnet
telnet是TCP/IP協議族的一員,是網絡遠程登錄服務的標準協議,幫助用戶在本地計算機上連接遠程主機。
使用方式:telnet IP PORT
和ssh 的區別
端口區別:telnet是23 ssh是22
本質:telnet是明碼傳輸,ssh是加密傳輸
nc
驗證服務器端口有沒有開放
nc是NetCat的簡稱,在網絡調試工具中享有“瑞士軍刀”的美譽,此命令功能豐富、短小精悍、簡單實用,被設計成一款易用的網絡工具,可通過TCP/LJDP傳輸數據。
參數
- -l 用于指定nc將處于偵聽模式。指定該參數,則意味著nc被當作server,偵聽并接受連接,而非向其它地址發起連接。
- -p 暫未用到(老版本的nc可能需要在端口號前加-p參數,下面測試環境是centos6.6,nc版本是nc-1.84,未用到-p參數)
- -s 指定發送數據的源IP地址,適用于多網卡機
- -u 指定nc使用UDP協議,默認為TCP
- -v 輸出交互或出錯信息,新手調試時尤為有用
- -w 超時秒數,后面跟數字
常用示例
nc -l 9999 # 開啟一個本地9999的TCP協議端口,由客戶端主動發起連接,一旦連接必須由服務端發起關閉
nc -vw 2 129.204.197.215 11111 # 通過nc去訪問129.204.197.215主機的11111端口,確認是否存活;可不加參數
nc -ul 9999 # 開啟一個本地9999的UDP協議端口,客戶端不需要由服務端主動發起關閉
nc 129.204.197.215 9999 < test # 通過129.204.197.215的9999TCP端口發送數據文件
nc -l 9999 > zabbix.file # 開啟一個本地9999的TCP端口,用來接收文件內容
# 測試網速
A機器操作如下:
nc -l 9999 > /dev/null
# B機器開啟數據傳輸
nc 129.204.197.215 9999 </dev/zero
# A機器進行網絡監控
sar -n DEV 2 100000
在不熟悉公司的防火墻設置時,也可以通過監聽端口來確定指定的端口是否被封。
mtr連通性測試
mtr命令是Linux系統中的網絡連通性測試工具,也可以用來檢測丟包率。
使用方式:mtr baidu.com

其中的第2列為丟包率,可以用來判斷網絡中兩臺機器的連通質量。
模擬丟包:sudo tc qdisc add dev eth0 root netem loss 10%
云服務器選點:聲網做音視頻通話 節點選取測試
nslookup
這是一款檢測網絡中DNS服務器能否正確解析域名的工具命令,并且可以輸出。
使用方式: nslookup sina.com
[root@VM_0_ubuntu ~]# nslookup sina.com
Server: 183.60.83.19
Address: 183.60.83.19#53
Non-authoritative answer:
Name: sina.com
Address: 66.102.251.33
從輸出中可以看到,sina.com域名被正確解析到IP地址66.102.251.33。
nslookup www.0voice.com
traceroute
traceroute可以提供從用戶的主機到互聯網另一端的主機的路徑,雖然每次數據包由同一出發點到達同一目的地的路徑可能會不一樣,但通常來說大多數情況下路徑是相同的。
使用方式:traceroute sina.com
[root@VM_0_ubuntu ~]# traceroute sina.com
traceroute to sina.com (66.102.251.33), 30 hops max, 60 byte packets
1 100.119.162.130 (100.119.162.130) 1.462 ms 2.200 ms 3.004 ms
2 100.119.170.58 (100.119.170.58) 1.060 ms 1.457 ms 1.852 ms
3 10.200.135.213 (10.200.135.213) 0.596 ms 0.794 ms 10.200.135.197 (10.200.135.197) 0.678 ms
4 14.18.199.78 (14.18.199.78) 1.008 ms 14.18.199.58 (14.18.199.58) 0.986 ms 0.951 ms
5 * * *
6 113.96.6.42 (113.96.6.42) 7.938 ms 121.14.50.25 (121.14.50.25) 2.913 ms 113.96.6.18 (113.96.6.18) 7.852 ms
7 113.96.4.157 (113.96.4.157) 4.799 ms 113.96.0.114 (113.96.0.114) 9.306 ms 113.96.4.157 (113.96.4.157) 4.547 ms
8 202.97.67.46 (202.97.67.46) 1.633 ms 2.392 ms 202.97.94.138 (202.97.94.138) 24.012 ms
9 202.97.94.77 (202.97.94.77) 4.379 ms 202.97.94.102 (202.97.94.102) 11.375 ms 11.335 ms
10 202.97.51.134 (202.97.51.134) 160.060 ms 160.058 ms 160.048 ms
11 203.14.186.238 (203.14.186.238) 181.185 ms 181.146 ms 181.088 ms
12 218.30.41.245 (218.30.41.245) 157.970 ms 157.110 ms 157.156 ms
13 218.30.41.234 (218.30.41.234) 156.973 ms 159.204 ms 157.517 ms
14 66.102.251.33 (66.102.251.33) 157.370 ms * 168.266 ms
在輸出中記錄按序列號從1開始,每個記錄代表網絡一跳,每跳一次表示經過一個網關或者路由;我們看到每行有三個個時間,單位是毫秒,指的是這一跳需要的時間。
iptraf強大的網絡監控
iptraf是一個實時監控網絡流量的交互式的彩色文本屏幕界面。它監控的數據比較全面,可以輸出TCP連接、網絡接口、協議、端口、網絡包大小等信息,但是耗費的系統資源比較多,且需要管理員權限。
使用方式:sudo iptraf
在進入主界面之前可以選擇不同的選項,在不同的選項下可以查看不同維度的網絡信息。
安裝方法:
centos
yum -y install ncurses
yum -y install iptraf
ubuntu
sudo apt-get install iptraf
tcpdump
tcpdump是網絡狀況分析和跟蹤工具,是可以用來抓包的實用命令,使用前需要對TCP/IP有所熟悉,因為過濾使用的信息都是TCP/IP格式。
Ubuntu安裝:sudo apt-get install tcpdump
捕獲及停止條件
n -D 列舉所有網卡設備
n -i 選擇網卡設備
n -c 抓取多少條報文
n --time-stamp-precision 指定捕獲時的時間精度,默認微妙micro,可選納秒nano
n -s 指定每條報文的最大字節數,默認262144字節
練習:
tcpdump 抓取各種報文
tcpdump -D 顯示網卡設備
tcpdump -i eth0 抓取eth0的報文
tcpdump -i lo 抓取回環報文
tcpdump -i eth0 -c 2 抓取2條報文后退出
tcpdump -i eth0 -c 2 --time-stamp-precision=nano 默認按納秒
telnet 127.0.0.1 80 可以通過telnet 上去測試抓包,此時應用抓取lo
表達式
原語:名稱或數字,以及描述它的多個限定詞組成
限定詞:
Type:設置數字或者名稱所指示類型,例如host www.baidu.com
Dir:設置網絡出入方向,例如dst port 80
Proto: 指定協議類型,例如udp
原語運算:
與:&&或者and
或:||或者or
非:!或者not
例如:src or dst portrange 6000-8000 && tcp
練習:
tcpdump -i eth0 -c 10 host www.0voice.com and port 80
同時在另一個終端curl www.0voice.com
限定詞
Type:設置數字或者名稱所指示類型
- host、port
- net, 設定子網, net 192.168.0.0 mask 等價于net 192.168.0.0/24
- portrange,設置端口范圍,例如portrange 6000-8000
Dir:設置網絡出入方向
src、dst、src or dst、src and dst
ra、ta、addr1、addr2、addr3、addr4(僅對IEEE 802.11 Wireless Lan有效)
Proto:指定協議類型
ethr、fddi、tr、wlan、ip、ip6、arp、tcp、udp等
文件操作
-w 輸出結果至文件
-C 限制輸入文件的大小,超出以后綴1等數字的方式遞增。注意單位是1,000,000字節
-W 指定輸出文件的最大數量,到達后重新復寫第一個文件
-G 指定每個N秒就重新輸出至新文件,注意-w參數應基于strftime參數指定文件名
-r 讀取一個抓包文件
-V 將待讀取的多個文件名寫入一個文件中,通過讀取該文件同時讀取多個文件
練習:
tcpdump -c 2 -w a 保存2個包到a文件
tcpdump -r a 讀取a文件顯示
tcpdump -c 2 -w b 保存2個包到b文件
vim c 文件,把逐行寫入a、b,如下所示
img并保存。
tcpdump -V c 讀取多個文件
tcpdump -C 1 -W 3 abc 限制文件大小為1,000,000字節,輸出文件最大數量為3
tcpdump -G 3 -w def%M-%S
strftime參考:
%a 星期幾的簡寫
%A 星期幾的全稱
%b 月分的簡寫
%B 月份的全稱
%c 標準的日期的時間串
%C 年份的后兩位數字
%d 十進制表示的每月的第幾天
%D 月/天/年
%e 在兩字符域中,十進制表示的每月的第幾天
%F 年-月-日
%g 年份的后兩位數字,使用基于周的年
%G 年分,使用基于周的年
%h 簡寫的月份名
%H 24小時制的小時
%I 12小時制的小時
%j 十進制表示的每年的第幾天
%m 十進制表示的月份
%M 十時制表示的分鐘數
%n 新行符
%p 本地的AM或PM的等價顯示
%r 12小時的時間
%R 顯示小時和分鐘:hh:mm
%S 十進制的秒數
%t 水平制表符
%T 顯示時分秒:hh:mm:ss
%u 每周的第幾天,星期一為第一天 (值從0到6,星期一為0)
%U 第年的第幾周,把星期日做為第一天(值從0到53)
%V 每年的第幾周,使用基于周的年
%w 十進制表示的星期幾(值從0到6,星期天為0)
%W 每年的第幾周,把星期一做為第一天(值從0到53)
%x 標準的日期串
%X 標準的時間串
%y 不帶世紀的十進制年份(值從0到99)
%Y 帶世紀部分的十進制年份
%z,%Z 時區名稱,如果不能得到時區名稱則返回空字符。
%% 百分號
輸出時間格式
-t 不顯示時間戳
-tt 自1970年1月1日0點至今的秒數
-ttt 顯示鄰近兩行報文間經過的秒數
-tttt 帶日期的完整時間
-ttttt 自第一個抓取的報文起經歷的秒數
練習
sudo tcpdump -c 5 -t
sudo tcpdump -c 5 -tt
sudo tcpdump -c 5 -ttt
sudo tcpdump -c 5 -tttt
sudo tcpdump -c 5 -ttttt
分析信息詳情
-e 顯示數據鏈路層頭部
-q 不顯示傳輸層信息
-v 顯示網絡層頭部更多的信息,如TTL、id等
-n 顯示IP地址、數字端口代替hostname等
-S TCP信息以絕對序列號代替相對序列號
-A 以ASCII方式顯示報文內容,適用HTTP分析
-x 以16進制方式顯示報文內容,不顯示數據鏈路層
-xx 以16進制方式顯示報文內容,顯示數據鏈路層
-X 同時以16進制及ASCII方式顯示報文內容,不顯示數據鏈路層
-XX 同時以16進制及ASCII方式顯示報文內容,顯示數據鏈路層
練習
sudo tcpdump -r a -e
sudo tcpdump -r a -q
sudo tcpdump -r a -v
sudo tcpdump -r a -n
sudo tcpdump -r a -S
sudo tcpdump -r a -A
sudo tcpdump -r a -x
sudo tcpdump -r a -xx
sudo tcpdump -r a -X
sudo tcpdump -r a -XX
其他練習:
顯示來源IP或者目的IP為192.168.1.102的網絡通信:
sudo tcpdump -i eth0 host 192.168.1.102
顯示去往102.168.1.102的所有會話信息:
tcpdump -i eth1 'dst 192.168.1.102 and (port 21 or 20)'
顯示去往102.168.1.102的所有會話信息:
tcpdump -i eth0 'dst 192.168.1.102 and tcp and port 8080'
nmap
掃描某一主機打開的端口及端口提供的服務信息,通常用于查看本機有哪些端口對外提供服務,或者服務器有哪些端口對外開放。
使用方式:nmap -v -A localhost
比如我云服務器檢測的結果:
Initiating SYN Stealth Scan at 16:12
Scanning localhost (127.0.0.1) [1000 ports]
Discovered open port 22/tcp on 127.0.0.1
Discovered open port 80/tcp on 127.0.0.1
Discovered open port 3306/tcp on 127.0.0.1
Discovered open port 554/tcp on 127.0.0.1
Discovered open port 10009/tcp on 127.0.0.1
Discovered open port 10000/tcp on 127.0.0.1
Discovered open port 10004/tcp on 127.0.0.1
Discovered open port 1935/tcp on 127.0.0.1
Discovered open port 9000/tcp on 127.0.0.1
Discovered open port 10003/tcp on 127.0.0.1
Discovered open port 10001/tcp on 127.0.0.1
但實際能否進行連通還要看防火墻的設置
安裝
# ubuntu安裝
sudo apt install nmap
#centos安裝
yum install nmap
nmap localhost #查看主機當前開放的端口
nmap -p 1024-65535 localhost #查看主機端口(1024-65535)中開放的端口
nmap -PS 192.168.56.101 #探測目標主機開放的端口
nmap -PS 22,80,3306 192.168.56.101 #探測所列出的目標主機端口
nmap -O 192.168.56.101 #探測目標主機操作系統類型
nmap -A 192.168.56.101 #探測目標主機操作系統類型
lsof
lsof是系統管理/安全的尤伯工具。將這個工具稱之為lsof真實名副其實,因為它是指“列出打開文件(lists openfiles)”。而有一點要切記,在Unix中一切(包括網絡套接口)都是文件。
查看幫助文檔: lsof -h
你可以使用它來獲得你系統上設備的信息,你能通過它了解到指定的用戶在指定的地點正在碰什么東西,或者甚至是一個進程正在使用什么文件或網絡連接。具體可以使用man lsof查看幫助文檔。
關鍵選項
默認 : 沒有選項,lsof列出活躍進程的所有打開文件
組合 : 可以將選項組合到一起,如-abc,但要當心哪些選項需要參數
- -a : 結果進行“與”運算(而不是“或”)
- -l : 在輸出顯示用戶ID而不是用戶名
- -h : 獲得幫助
- -t : 僅獲取進程ID
- -U : 獲取UNIX套接口地址
- -F : 格式化輸出結果,用于其它命令??梢酝ㄟ^多種方式格式化,如-F pcfn(用于進程id、命令名、文件描述符、文件名,并以空終止)
ethtool
ethtool用于查看網卡的配置情況。
sudo apt install ethtool
命令使用格式:ethtool [option] interface
查看網卡:ethtool ens33 # PS在云主機檢測不到網卡信息

范例
(1)查看網卡的接口信息
ethtool eth1 #查看網絡接口eth1的信息
(2)關閉網卡eth1的自動協商
ethtool -s eth1 autoneg off
(3)修改網卡速率為 100Mb/s
ethtool -s eth4 speed 100
(4)查看網卡驅動信息
ethtool -i eth0
(5)查看網卡的一些工作統計信息
ethtool –S eth0
(6)停止和查看網卡的發送模塊TX的狀態
ethtool -A tx off eth0 #修改tx的狀態
ethtool -a eth0 #查看tx的狀態
(7)關閉網卡對收到的數據包的校驗功能
ethtool -K rx off eth0 #關閉校驗
ethtool –k eth0 #查看校驗啟動狀態
獲取網絡信息
顯示端口被某個程序占用
lsof -i:port
[root@VM_0_ubuntu msg_server]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 24614 root 10u IPv4 67976659 0t0 TCP *:http (LISTEN)
nginx 24615 root 10u IPv4 67976659 0t0 TCP *:http (LISTEN)
[root@VM_0_ubuntu msg_server]# lsof -i:8000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
msg_serve 17967 root 5u IPv4 18955252 0t0 TCP *:irdmi (LISTEN)
lsof -p 12 看進程號為12的進程打開了哪些文件
lsof -c abc 顯示abc進程現在打開的文件,可以使用less進行分頁,b 向后翻一頁,d 向后翻半頁
[root@VM_0_ubuntu msg_server]# lsof -c msg_server
顯示的部分內容
msg_serve 17967 root 3w REG 253,1 7005733 525212 /root/im/0voice_im/auto_setup/im_server/im-server-1/msg_server/log/default.log
msg_serve 17967 root 4w REG 253,1 0 564603 /root/im/0voice_im/auto_setup/im_server/im-server-1/msg_server/log/TEST.log
msg_serve 17967 root 5u IPv4 18955252 0t0 TCP *:irdmi (LISTEN)
lsof abc.txt 顯示打開文件abc.txt的進程
[root@VM_0_ubuntu msg_server]# lsof log/default.log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
msg_serve 17967 root 3w REG 253,1 7016015 525212 log/default.log
tail 21816 root 3r REG 253,1 7016015 525212 log/default.log
5.4 netstat的其他用途
此命令顯示網絡連接、端口信息等。
根據進程查找端口
(1)根據進程名查找進程ID
ps -elf | grep 進程
輸出
[root@VM_0_ubuntu ~]# ps -elf | grep nginx
0 S root 6875 2674 0 80 0 - 28178 pipe_w 11:02 pts/3 00:00:00 grep --color=auto nginx
1 S root 24614 1 0 80 0 - 8524 sigsus Jul27 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
5 S root 24615 24614 0 80 0 - 14563 ep_pol Jul27 ? 00:00:13 nginx: worker process
獲得進程號為 24614 (master process)
(2)根據進程ID查找進程開啟的端口
netstat -nap | grep 24614
ubuntu sudo 權限
[root@VM_0_ubuntu ~]# netstat -nap | grep 24614
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 24614/nginx: master
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 24614/nginx: master
tcp 0 0 0.0.0.0:8088 0.0.0.0:* LISTEN 24614/nginx: master
tcp 0 0 0.0.0.0:9080 0.0.0.0:* LISTEN 24614/nginx: master
tcp 0 0 0.0.0.0:444 0.0.0.0:* LISTEN 24614/nginx: master
tcp 0 0 0.0.0.0:10080 0.0.0.0:* LISTEN 24614/nginx: master
unix 3 [ ] STREAM CONNECTED 67976664 24614/nginx: master
unix 3 [ ] STREAM CONNECTED 67976665 24614/nginx: master
根據端口查找進程
(1)根據使用端口
netstat -nap | grep 8080
[root@VM_0_ubuntu ~]# netstat -nap | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 25901/./login_serve
獲得進程ID為25901
(2)根據進程ID查找進程的詳細信息
[root@VM_0_ubuntu ~]# ps -elf | grep 25901
0 R root 7646 2674 0 80 0 - 28178 - 11:06 pts/3 00:00:00 grep --color=auto 25901
0 S root 25901 1 0 80 0 - 42506 ep_pol Jul20 ? 00:10:33 ./login_server
6 其他工具
nmon性能監控
centos安裝
wget http://sourceforge.net/projects/nmon/files/nmon16e_mpginc.tar.gz
mkdir nmon16e_mpginc
tar -xvfz nmon16e_mpginc.tar.gz -C nmon16e_mpginc
cd nmon16e_mpginc
授權運行權限
chmod +x nmon_x86_64_centos7
使nmon在任何地方都能運行
mv nmon_x86_64_centos7 /usr/bin/nmon
ubuntu安裝
$ sudo apt-get install nmon
$ nmon

后臺監控
為了配合性能測試,我們往往需要將一個時間段內系統資源消耗情況記錄下來,這時可以使用命令在遠程窗口執行命令:
./nmon/ nmon_x86_rhel5 -f -N -m /nmon/log -s 30 -c 120
其中各參數表示:
- -f 按標準格式輸出文件:_YYYYMMDD_HHMM.nmon
- -N include NFS sections
- -m 切換到路徑去保存日志文件
- -s 每隔n秒抽樣一次,這里為30
- -c 取出多少個抽樣數量,這里為120,即監控=120*(30/60/60)=1小時
根據小時計算這個數字的公式為:c=h3600/s,比如要監控10小時,每隔30秒采樣一次,則c=103600/30=1200
該命令啟動后,會在nmon所在目錄下生成監控文件,并持續寫入資源數據,直至360個監控點收集完成——即監控1小時,這些操作均自動完成,無需手工干 預,測試人員可以繼續完成其他操作。如果想停止該監控,需要通過“#ps –ef|grep nmon”查詢進程號,然后殺掉該進程以停止監控。
定時任務
除配合性能測試的短期監控,我們也可以實現對系統的定期監控,作為運營維護階段的參考。定期監控實現如下:
(1)執行命令:#crontab –e
(2)在最后一行添加如下命令:
0 8 * * 1,2,3,4,5 /nmon/nmon_x86_rhel5 -f -N -m /nmon/log -s 30 -c 1200
表示:
周一到周五,從早上08點開始,監控10個小時(到18:00整為止),輸出到/nmon/log
測試指標可視化
nmon命令 生成的nmon可以通過工具進行可視化展示,一般可以使用nmonchart、nmon_analyser
nmonchart
nmonechart 使用Google charts 生成html報告
glances系統監控
安裝
#centos
yum install -y glances
#ubuntu
$ sudo apt-add-repository ppa:arnaud-hartmann/glances-stable
$ sudo apt-get update
$ sudo apt-get install glances
執行:glances

除了很多命令行選項之外,Glances 還提供了更多的可在其運行時開關輸出信息選項的快捷鍵,下面是一些例子:
a – 對進程自動排序
c – 按 CPU 百分比對進程排序
m – 按內存百分比對進程排序
p – 按進程名字母順序對進程排序
i – 按讀寫頻率(I/O)對進程排序
d – 顯示/隱藏磁盤 I/O 統計信息
f – 顯示/隱藏文件系統統計信息
n – 顯示/隱藏網絡接口統計信息
s – 顯示/隱藏傳感器統計信息
y – 顯示/隱藏硬盤溫度統計信息
l – 顯示/隱藏日志(log)
b – 切換網絡 I/O 單位(Bytes/bits)
w – 刪除警告日志
x – 刪除警告和嚴重日志
1 – 切換全局 CPU 使用情況和每個 CPU 的使用情況
h – 顯示/隱藏這個幫助畫面
t – 以組合形式瀏覽網絡 I/O
u – 以累計形式瀏覽網絡 I/O
q – 退出(‘ESC‘ 和 ‘Ctrl&C‘ 也可以
Glances 對于大多用戶而言是個在系統資源上提供過多信息的工具。但是如果你是一個想要僅從命令行就能快速獲取系統整體狀況的系統管理員,那這個工具絕對是你的必備利器。
w
顯示誰登錄了系統并執行了哪些程序。
[root@VM_0_ubuntu ~]# w -h
root pts/0 113.246.155.156 10:58 2.00s 0.23s 0.23s -bash
root pts/2 113.246.155.156 11:30 26.00s 0.06s 0.00s tail -f /data/rtc/room_server/log/roll.log
root pts/3 113.246.155.156 11:53 1:30 0.03s 0.03s -bash
日志監控工具
tail
tail -h
在實時日志上打印顏色,給每個狀態給上不同的顏色,INF綠色、WARN黃色、ERROR紅色
tail -f /data/rtc/room_server/log/roll.log | perl -pe 's/(INF)/\e[0;32m$1\e[0m/g,s/(WARN)/\e[0;33m$1\e[0m/g,s/(ERROR)/\e[1;31m$1\e[0m/g'
multitail
可同時開啟多視窗看log,適合用在看部署在很多機器上的項目的log -cS [color_scheme] : 可以選擇輸出的log的顏色,推薦使用goldengate,也可自定義(修改/etc/multitail.conf)
推薦一個零聲學院免費教程,個人覺得老師講得不錯,
分享給大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,
TCP/IP,協程,DPDK等技術內容,點擊立即學習:
服務器
音視頻
dpdk
Linux內核


浙公網安備 33010602011771號