介紹如何在 Linux 系統上使用 stress-ng
負載測試工具,產生 CPU、記憶體等資源滿載的狀況。
stress-ng
stress-ng
與舊的 stress
都可以用來產生系統負載,但新的 stress-ng
功能較豐富,所以這裡我們只介紹 stress-ng
的使用方式。
stress-ng
支援多種產生系統負載的方式,包含 CPU 的浮點運算、整數運算、位元運算與控制流程等,可以用來測試系統在高負載的狀況下的穩定性。
stress-ng
必須小心使用,某些測試可能會造成設計不良的硬體過熱,另外也可能讓系統過載而難以停止負載測試。安裝 stress-ng
若在 Ubuntu Linux 中可以使用 apt
來安裝 stress-ng
套件:
# 安裝 stress-ng 套件
sudo apt install stress-ng
Stressors
stress-ng
會使用各種不同的 stressors 來產生不同性質的系統負載,stressor 的種類非常多,包含:cpu
、cpu-cache
、device
、io
、interrupt
、filesystem
、memory
、network
、os
、pipe
、scheduler
與 vm
。
我們可以使用以下指令查詢 stress-ng
所有支援的 stressors:
# 查詢支援的 stressors stress-ng --stressors
af-alg affinity aio aiol apparmor atomic bigheap bind-mount branch brk bsearch cache cap chdir chmod chown chroot clock clone context copy-file cpu cpu-online crypt cyclic daemon dccp dentry dev dir dirdeep dnotify dup dynlib enosys epoll eventfd exec fallocate fanotify fault fcntl fiemap fifo file-ioctl filename flock fork fp-error fstat full funccall futex get getdent getrandom handle hdd heapsort hrtimers hsearch icache icmp-flood inode-flags inotify io iomix ioport ioprio itimer kcmp key kill klog lease link locka lockbus lockf lockofd longjmp lsearch madvise malloc matrix mcontend membarrier memcpy memfd memrate memthrash mergesort mincore mknod mlock mmap mmapaddr mmapfixed mmapfork mmapmany mq mremap msg msync netdev netlink-proc nice nop null numa oom-pipe opcode open personality physpage pipe poll procfs pthread ptrace pty qsort quota radixsort rawdev rdrand readahead remap rename resources revio rlimit rmap rtc schedpolicy sctp seal seccomp seek sem sem-sysv sendfile shm shm-sysv sigfd sigfpe sigio sigpending sigpipe sigq sigsegv sigsuspend sleep sock sockdiag sockfd sockpair softlockup spawn splice stack stackmmap str stream swap switch symlink sync-file sysinfo sysfs tee timer timerfd tlb-shootdown tmpfs tree tsc tsearch udp udp-flood unshare urandom userfaultfd utime vecmath vfork vforkmany vm vm-addr vm-rw vm-splice wait wcs xattr yield zero zlib zombie
若要查詢指定類別之下有哪些 stressors 可用,可以使用 --class
參數指定類別名稱,再加上一個問號(?
),例如若要查詢 vm
類別下的 stressors,就可以執行:
# 查詢 vm 類別的 stressors stress-ng --class vm?
class 'vm' stressors: bigheap brk madvise malloc mlock mmap mmapaddr mmapfixed mmapfork mmapmany mremap msync physpage shm shm-sysv stack stackmmap swap tmpfs userfaultfd vm vm-addr vm-rw vm-splice
關於這些 stressors 的詳細用法與說明,可以參考 stress-ng
的線上手冊:
# 查詢 stress-ng 線上手冊
man stress-ng
使用者可以依據需求,組合各種 stressors 創造出適合的負載環境,以下是一些常見的組合範例。
測試 CPU 滿載狀況
若要產生 2 個 CPU 核心滿載的狀況,可以使用 2 個 CPU stressors:
# 產生 CPU 滿載狀況(2 CPU stressors、持續 30 秒) stress-ng --cpu 2 --timeout 30s
stress-ng: info: [31788] dispatching hogs: 2 cpu stress-ng: info: [31788] successful run completed in 30.02s
事實上 CPU 的 stressors 種類非常多,單純指定 --cpu
參數的話,會輪流使用各種 CPU 類型的 stressors,若要明確測試指定的 CPU 負載類型,可以指定要使用的 stressor。
測試 zlib 壓縮、解壓縮
使用 2 個 zlib
stressors 壓縮與解壓縮隨機資料,進行 CPU 負載測試:
# 以 2 個 zlib stressors 壓縮、解壓縮資料,產生 CPU 滿載狀況 stress-ng --zlib 2 --timeout 30s
使用 zlib
壓縮與解壓縮資料時,除了 CPU 之外,同時也會產生快取(cache)與記憶體(memory)的負載。
測試矩陣運算
使用 2 個 matrix
stressors 產生各種矩陣運算,進行 CPU 負載測試:
# 以兩個 matrix stressors 進行矩陣運算,產生 CPU 滿載狀況 stress-ng --matrix 2 --timeout 30s
記憶體測試
以 8 個 vm stressors 使用 80% 的可用記憶體(1 個 stressor 使用 10% 可用記憶體)執行記憶體測試,持續 1 小時:
# 使用 8 個 vm stressors 執行記憶體測試 # 總共使用 80% 的可用記憶體,持續 1 小時 stress-ng --vm 8 --vm-bytes 80% -t 1h
I/O 測試
以 2 個 iomix stressors 使用 10% 磁碟空間(1 個 stressor 使用 5% 磁碟空間)執行 I/O 測試,持續 10 分鐘:
# 使用 2 個 iomix stressors 執行混合 I/O, # 使用 10% 磁碟空間,持續 10 分鐘 stress-ng --iomix 2 --iomix-bytes 10% -t 10m
輪流執行 8 個 io 類型的 stressors,每個類型持續 5 分鐘,並產生執行時間報表:
# 輪流執行 8 個 io 類型的 stressors,每個類型持續 5 分鐘 # 並產生執行時間報表 stress-ng --sequential 8 --class io -t 5m --times
混合多種 Stressors
我們也可以混合不同的 stressors 來使用,例如一個 zlib
與一個 matrix
:
# 以 1 個 zlib 與 1 個 matrix stressors stress-ng --zlib 1 --matrix 1 --timeout 30s
FFT 計算測試
以 2 個 FFT 的 stressors,執行 5000 個 bogo 運算,產出報表:
# 以 2 個 FFT 的 stressors,執行 5000 個 bogo 運算,產出報表 stress-ng --cpu 2 --cpu-method fft --cpu-ops 5000 --metrics-brief
混合測試
使用 4 個各種類的 stressors 持續 5 分鐘:
# 使用 4 個各種類的 stressors 持續 5 分鐘 stress-ng --all 4 --timeout 5m
每一種 stressors 輪流執行,每個持續 10 分鐘:
# 每一種 stressors 輪流執行,每個持續 10 分鐘 stress-ng --sequential 0 -t 10m
在所有的 CPU 上執行各種 CPU stressors,持續 1 小時:
# 在所有的 CPU 上執行各種 stressors,持續 1 小時 stress-ng --cpu 0 --cpu-method all -t 1h