壓力測試神器stress-ng
- 2019 年 10 月 7 日
- 筆記
工欲成其事,必先善其器,CentOS 7的EPEL源包含了2個壓力測試工具,一個是標準的stress, 另外一個是更強大的stress-ng,可以幫助模擬產生各種cpu壓力。
安裝

stress
stress參數和用法都很簡單:
-c,–cpu:代表進程個數(每個進程會佔用一個cpu,當超出cpu個數時,進程間會互相爭用cpu)
-t,–timeout:測試時長(超出這個時間後自動退出)
-i,–io:表示調用sync(),它表示通過系統調用 sync() 來模擬 I/O 的問題;
但這種方法實際上並不可靠,因為 sync() 的本意是刷新內存緩衝區的數據到磁盤中,以確保同步。
如果緩衝區內本來就沒多少數據,那讀寫到磁盤中的數據也就不多,也就沒法產生 I/O 壓力。
這一點,在使用 SSD 磁盤的環境中尤為明顯,很可能你的 iowait 總是 0,卻單純因為大量的系統調用,導致了系統CPU使用率 sys 升高。
這種情況,推薦使用 stress-ng 來代替 stress。
比如, 從下面可以看出經過30秒的壓力後,系統負載從0.00提升至0.57。

由於stress的壓力模型非常簡單,所以無法模擬任何複雜的場景,舉個例子,在stress壓測過程中,如果用top命令去觀察,會發現所有的cpu壓力都在用戶態,內核態沒有任何壓力:

stress-ng
stress-ng完全兼容stress, 並且在此基礎上通過幾百個參數,可以產生各種複雜的壓力, 比如:
產生2個worker做圓周率算法壓力:

產生2個worker從迭代使用30多種不同的壓力算法,包括pi, crc16, fft等等。

產生2個worker調用socket相關函數產生壓力

產生2個worker讀取tsc產生壓力

除了能夠產生不同類型的壓力,strss-ng還可以將壓力指定到特定的cpu上,比如下面的命令將壓力指定到cpu 0,2,3,6:

應用場景1 CPU 密集型進程(使用CPU的進程)
使用2顆CPU [root@nginx ~]# stress --cpu 2 --timeout 600 [root@nginx ~]# uptime 10:33:44 up 28 min, 4 users, load average: 1.99, 1.39, 0.81 [root@nginx ~]# mpstat -P ALL 5 1 Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle Average: all 50.05 0.00 0.08 0.00 0.00 0.00 0.00 0.00 0.00 49.87 Average: 0 0.07 0.00 0.17 0.00 0.00 0.01 0.00 0.00 0.00 99.75 Average: 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: 2 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: 3 0.08 0.00 0.15 0.01 0.00 0.01 0.00 0.00 0.00 99.76 [root@nginx sysstat-12.1.5]# pidstat -u 5 1.通過uptime可以觀察到,系統平均負載很高,通過mpstat觀察到2個CPU使用率很高,平均負載也很高,而iowait為0,說明進程是CPU密集型的; 2.是由進程使用CPU密集導致系統平均負載變高、CPU使用率變高; 3.可以通過pidstat查看是哪個進程導致CPU使用率較高
應用場景2 I/O 密集型進程(等待IO的進程)
對IO進行壓測(使用stress觀測到的iowait指標可能為0,所以使用stress-ng) [root@nginx ~]# stress-ng -i 4 --hdd 1 --timeout 600 [root@nginx ~]# uptime 11:11:12 up 1:05, 4 users, load average: 4.35, 4.11, 3.65 [root@nginx ~]# mpstat -P ALL 5 Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle Average: all 0.20 0.00 13.04 38.70 0.00 1.33 0.00 0.00 0.00 46.73 Average: 0 0.07 0.00 6.63 40.96 0.00 3.72 0.00 0.00 0.00 48.62 Average: 1 0.19 0.00 20.14 26.77 0.00 0.04 0.00 0.00 0.00 52.85 Average: 2 0.27 0.00 13.81 45.15 0.00 0.88 0.00 0.00 0.00 39.89 Average: 3 0.27 0.00 11.22 42.20 0.00 0.80 0.00 0.00 0.00 45.51 [root@nginx sysstat-12.1.5]# pidstat -u 5 1.可以通過uptime觀察到,系統平均負載很高,通過mpstat觀察到CPU使用很低,iowait很高,一直在等待IO處理,說明此進程是IO密集型的; 2.是由進程頻繁的進行IO操作,導致系統平均負載很高而CPU使用率不高的情況;
場景三:大量進程的場景(等待CPU的進程->進程間會爭搶CPU)
模擬16個進程,本機是4核 [root@nginx ~]# stress -c 16 --timeout 600 [root@nginx ~]# uptime 11:23:24 up 1:18, 4 users, load average: 15.10, 8.98, 6.04 [root@nginx ~]# mpstat -P ALL 5 Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle Average: all 99.92 0.00 0.08 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: 0 99.87 0.00 0.13 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: 1 99.96 0.00 0.04 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: 2 99.90 0.00 0.10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: 3 99.93 0.00 0.07 0.00 0.00 0.00 0.00 0.00 0.00 0.00 [root@nginx sysstat-12.1.5]# pidstat -u 5 1 Linux 3.10.0-957.21.3.el7.x86_64 (nginx) 07/10/2019 _x86_64_ (4 CPU) 11:23:07 AM UID PID %usr %system %guest %wait %CPU CPU Command 11:23:12 AM 0 23613 25.15 0.00 0.00 75.25 25.15 1 stress 11:23:12 AM 0 23614 24.95 0.00 0.00 75.45 24.95 0 stress 11:23:12 AM 0 23615 25.15 0.00 0.00 75.25 25.15 0 stress 11:23:12 AM 0 23616 24.95 0.00 0.00 74.65 24.95 0 stress 11:23:12 AM 0 23617 25.15 0.00 0.00 74.85 25.15 1 stress 11:23:12 AM 0 23618 24.75 0.00 0.00 75.25 24.75 1 stress 11:23:12 AM 0 23619 24.75 0.00 0.00 75.85 24.75 2 stress 11:23:12 AM 0 23620 24.55 0.00 0.00 75.65 24.55 2 stress 11:23:12 AM 0 23621 25.35 0.00 0.00 74.85 25.35 3 stress 11:23:12 AM 0 23622 25.35 0.00 0.00 74.45 25.35 3 stress 11:23:12 AM 0 23623 25.15 0.00 0.00 75.65 25.15 1 stress 11:23:12 AM 0 23624 25.35 0.00 0.00 74.45 25.35 3 stress 11:23:12 AM 0 23625 24.55 0.00 0.00 75.45 24.55 2 stress 11:23:12 AM 0 23626 24.95 0.00 0.00 75.45 24.95 0 stress 11:23:12 AM 0 23627 24.75 0.00 0.00 75.65 24.75 3 stress 11:23:12 AM 0 23628 24.55 0.00 0.00 75.05 24.55 2 stress 11:23:12 AM 0 23803 0.20 0.40 0.00 0.80 0.60 2 watch 11:23:12 AM 0 24022 0.00 0.20 0.00 0.00 0.20 2 pidstat 1.通過uptime觀察到系統平均負載很高,通過mpstat觀察到CPU使用率也很高,iowait為0,說明此進程是CPU密集型的,或者在進行CPU的爭用; 2.通過pidstat -u觀察到wait指標很高,則說明進程間存在CPU爭用的情況,可以判斷系統中存在大量的進程在等待使用CPU; 3.大量的進程,超出了CPU的計算能力,導致的系統的平均負載很高;
場景四:單進程多線程(大量線程造成上下文切換,從而造成系統負載升高)
模擬10個線程,對系統進行基準測試 [root@nginx ~]# sysbench --threads=10 --time=300 threads run 可以看到平均1分鐘的系統再升高 [root@nginx ~]# uptime 16:43:41 up 6:38, 4 users, load average: 4.82, 2.10, 0.84 可以看到sys(內核態)對CPU的使用率比較高,iowait無(表示沒有進程間的爭用) [root@nginx ~]# mpstat -P ALL 5 Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle Average: all 23.92 0.00 68.92 0.00 0.00 0.00 0.00 0.00 0.00 7.16 Average: 0 24.11 0.00 68.77 0.00 0.00 0.00 0.00 0.00 0.00 7.12 Average: 1 24.02 0.00 68.41 0.00 0.00 0.00 0.00 0.00 0.00 7.56 Average: 2 23.74 0.00 69.40 0.00 0.00 0.01 0.00 0.00 0.00 6.85 Average: 3 23.79 0.00 69.10 0.00 0.00 0.00 0.00 0.00 0.00 7.10 可以看到無進程間的上下文切換(默認是進程間的) [root@nginx ~]# pidstat -w 3 04:45:46 PM UID PID cswch/s nvcswch/s Command 04:45:49 PM 0 9 2.67 0.00 rcu_sched 04:45:49 PM 0 11 0.33 0.00 watchdog/0 04:45:49 PM 0 12 0.33 0.00 watchdog/1 04:45:49 PM 0 14 0.67 0.00 ksoftirqd/1 04:45:49 PM 0 17 0.33 0.00 watchdog/2 04:45:49 PM 0 22 0.33 0.00 watchdog/3 04:45:49 PM 0 556 19.67 0.00 xfsaild/dm-0 04:45:49 PM 0 21287 0.33 0.00 sshd 04:45:49 PM 0 26834 1.00 0.00 kworker/u256:0 04:45:49 PM 0 30955 1.00 0.00 kworker/2:2 04:45:49 PM 0 31207 1.67 0.00 kworker/0:2 04:45:49 PM 0 31778 2.00 0.00 kworker/3:1 04:45:49 PM 0 32262 0.33 0.00 pidstat 04:45:49 PM 0 32263 1.00 0.00 kworker/1:1 04:45:49 PM 0 32350 0.33 0.00 kworker/3:0 可以看到存在大量的非自願上下文切換(表示線程間爭用引起的上下文切換,造成系統負載升高) [root@nginx ~]# pidstat -w -t 3 04:48:35 PM UID TGID TID cswch/s nvcswch/s Command 04:48:41 PM 0 32597 - 1.67 0.33 sysbench 04:48:41 PM 0 - 32597 1.67 0.33 |__sysbench 04:48:41 PM 0 - 32598 8932.67 63606.33 |__sysbench 04:48:41 PM 0 - 32599 10554.00 52275.33 |__sysbench 04:48:41 PM 0 - 32600 10941.00 49976.67 |__sysbench 04:48:41 PM 0 - 32601 9393.67 50796.33 |__sysbench 04:48:41 PM 0 - 32602 10196.67 50815.33 |__sysbench 04:48:41 PM 0 - 32603 9538.67 54755.00 |__sysbench 04:48:41 PM 0 - 32604 10112.33 50476.67 |__sysbench 04:48:41 PM 0 - 32605 9135.67 53922.00 |__sysbench 04:48:41 PM 0 - 32606 10506.33 55677.00 |__sysbench 04:48:41 PM 0 - 32607 10346.33 55691.67 |__sysbench