學(xué)習(xí)性能優(yōu)化,如何模擬各種故障場景?
大家好,我是樹哥!
性能優(yōu)化這個專題,是每個想成為架構(gòu)師的小伙伴必須學(xué)習(xí)的知識。在學(xué)習(xí)性能優(yōu)化的過程中,我們要學(xué)會各種 Linux 命令和工具去檢測服務(wù)器的 CPU、內(nèi)存等資源。很多情況下,我們的 CPU、內(nèi)存資源都是很平穩(wěn)的,不利于我們學(xué)習(xí)這些性能檢測命令。
今天就介紹一個 Linux 系統(tǒng)壓力測試工具 stress,它可以模擬各種系統(tǒng)高負(fù)載的場景,方便我們進(jìn)行性能優(yōu)化學(xué)習(xí)!
什么是 stress?
stress 是一個 Linux 系統(tǒng)壓力測試工具,主要用來模擬系統(tǒng)系統(tǒng)高負(fù)載的場景,其可以對 CPU、內(nèi)存、IO 及磁盤進(jìn)行壓力測試。
安裝指南
在 CentOS8 系統(tǒng)中安裝 stress 可以用 rpm 方式安裝,只需執(zhí)行如下命令就可以成功完成安裝。
// 獲取安裝包
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/s/stress-1.0.4-16.el7.x86_64.rpm
// 安裝 stress 工具
rpm -ivh stress-1.0.4-16.el7.x86_64.rpm
安裝完成后可以運(yùn)行 stress --version 查看安裝版本。
[root@iZwz92ezhi90syoqbgjgn1Z ~]# stress --version
stress 1.0.4
如果可以正常運(yùn)行,說明 stress 安裝成功了。
使用指南
使用 stress 命令非常簡單,就是 stress 命令加上各種參數(shù)。這里我舉幾個例子,簡單介紹下 stress 命令常見的幾種使用方法。
模擬 CPU 消耗
運(yùn)行下面的命令,創(chuàng)建 4 個消耗 CPU 資源的進(jìn)程,并持續(xù) 600 秒。
stress -c 4 --timeout 600
隨后我們使用 watch -d uptime 命令持續(xù)監(jiān)控系統(tǒng)的平均負(fù)載情況。
21:55:10 up 7 min, 2 users, load average: 4.63, 1.32, 0.34
21:56:16 up 8 min, 2 users, load average: 6.63, 2.32, 0.84
可以看到隨著時間的推移,系統(tǒng)的平均負(fù)載越來越高,這說明我們的 stress 命令起效果了。
模擬內(nèi)存消耗
運(yùn)行下面的命令,創(chuàng)建 2 個消耗內(nèi)存的進(jìn)程,每個進(jìn)程占用 200M 內(nèi)存。
stress -m 2 --vm-bytes 200M
隨后我們使用 pidstat -r | grep stress 命令查看內(nèi)存的占用情況。
[root@iZwz92ezhi90syoqbgjgn1Z ~]# pidstat -r | grep stress
// -r 表示查看內(nèi)存使用情況
// VSZ 表示虛擬地址大小,虛擬內(nèi)存的使用 KB
22:00:18 UID PID minflt/s majflt/s VSZ RSS %MEM Command
22:00:18 0 1645 1249.67 0.00 212780 22368 0.29 stress
22:00:18 0 1646 1267.04 0.00 212780 79928 1.04 stress
可以看到 VSZ 這一列的數(shù)值為 212780KB,剛好就是 200MB 左右。
模擬磁盤寫入
運(yùn)行下面命令,可以模擬兩個進(jìn)程往當(dāng)前目錄寫入固定大小的臨時文件,臨時文件大小默認(rèn)為 1G。
stress -d 2
隨后我們用 pidstat 監(jiān)控磁盤,可以看到 kB_wr/s 列的數(shù)值較大,表示兩個 stress 進(jìn)程在做大量的寫入操作。
[root@iZwz92ezhi90syoqbgjgn1Z ~]# pidstat -d | grep stress
22:07:41 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
22:07:41 0 1730 0.00 15369.44 13980.27 849 stress
22:07:41 0 1731 0.00 15941.86 13876.48 976 stress
模擬大量 IO 操作
運(yùn)行下面命令,可以模擬 4 個進(jìn)程執(zhí)行大量的 sync () 操作。
stress -i 4 --timeout 600
使用 top 可以看到 stress 的 4 個進(jìn)程占用了大量的 CPU 資源。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1863 root 20 0 7976 96 0 R 100.0 0.0 0:12.75 stress
1864 root 20 0 7976 96 0 R 100.0 0.0 0:12.78 stress
1865 root 20 0 7976 96 0 R 100.0 0.0 0:12.76 stress
1862 root 20 0 7976 96 0 R 99.7 0.0 0:12.77 stress
使用 pidstat 查看進(jìn)程,正常情況下可以看到 stress 的 4 個進(jìn)程產(chǎn)生了大量的 %wait 時間。但由于我做測試的服務(wù)器用的是 SSD 盤,因此并沒有產(chǎn)生大量的 CPU wait 時間。
[root@iZwz92ezhi90syoqbgjgn1Z ~]# pidstat -u 5 1
Linux 4.18.0-348.7.1.el8_5.x86_64 (iZwz92ezhi90syoqbgjgn1Z) 22/08/22 _x86_64_ (4 CPU)
22:22:41 UID PID %usr %system %guest %wait %CPU CPU Command
22:22:46 0 1862 0.20 99.60 0.00 0.20 99.80 1 stress
22:22:46 0 1863 0.20 99.80 0.00 0.20 100.00 0 stress
22:22:46 0 1864 0.20 99.60 0.00 0.20 99.80 2 stress
22:22:46 0 1865 0.20 99.80 0.00 0.00 100.00 3 stress
要獲取 stress 工具的更多用法,直接輸入 stress --help 就可以獲取詳細(xì)信息了,如下所示。
-c, --cpu N 產(chǎn)生 N 個進(jìn)程,每個進(jìn)程都反復(fù)不停的計算隨機(jī)數(shù)的平方根
-i, --io N 產(chǎn)生 N 個進(jìn)程,每個進(jìn)程反復(fù)調(diào)用 sync () 將內(nèi)存上的內(nèi)容寫到硬盤上
-m, --vm N 產(chǎn)生 N 個進(jìn)程,每個進(jìn)程不斷分配和釋放內(nèi)存
--vm-bytes B 指定分配內(nèi)存的大小
--vm-stride B 不斷的給部分內(nèi)存賦值,讓 COW (Copy On Write) 發(fā)生
--vm-hang N 指示每個消耗內(nèi)存的進(jìn)程在分配到內(nèi)存后轉(zhuǎn)入睡眠狀態(tài) N 秒,然后釋放內(nèi)存,一直重復(fù)執(zhí)行這個過程
--vm-keep 一直占用內(nèi)存,區(qū)別于不斷的釋放和重新分配 (默認(rèn)是不斷釋放并重新分配內(nèi)存)
-d, --hadd N 產(chǎn)生 N 個不斷執(zhí)行 write 和 unlink 函數(shù)的進(jìn)程 (創(chuàng)建文件,寫入內(nèi)容,刪除文件)
--hadd-bytes B 指定文件大小
-t, --timeout N 在 N 秒后結(jié)束程序
--backoff N 等待 N 微妙后開始運(yùn)行
-q, --quiet 程序在運(yùn)行的過程中不輸出信息
-n, --dry-run 輸出程序會做什么而并不實際執(zhí)行相關(guān)的操作
--version 顯示版本號
-v, --verbose 顯示詳細(xì)的信息
總結(jié)
本文向大家介紹了一個常用的壓力測試工具 stress,它可以模擬 CPU、內(nèi)存、磁盤、IO 等操作,方便我們學(xué)習(xí)性能優(yōu)化命令。最后獻(xiàn)上 stress 工具的參數(shù)設(shè)置圖,大家可以收藏起來,方便后面使用的時候?qū)φ铡?/p>






