- 1 stress-ngコマンドとは?
- 2 検証環境
- 3 パッケージのインストール方法
- 4 オプション一覧
- 5 共通オプションの使い方
- 6 CPU負荷テスト(-c,--cpu)
- 7 CPUアフィニティ負荷テスト(--affinity)
- 8 プロセス生成負荷をかける方法(-f)
- Z 参考情報
1 stress-ngコマンドとは?
CPU,ディスク,メモリ等に負荷をかけるツールです。stressコマンドに比べ、負荷テストの種類が多いです。なお、stressコマンドの使い方は、stressコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。
2 検証環境
CentOS版数は以下のとおりです。
[root@server ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
カーネル版数は以下のとおりです。
[root@server ~]# uname -r 3.10.0-1160.el7.x86_64
仮想マシンの搭載CPU数は4個です。
[root@server ~]# lscpu -a --extended CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE 0 0 0 0 0:0:0:0 yes 1 0 1 1 1:1:1:1 yes 2 0 2 2 2:2:2:2 yes 3 0 3 3 3:3:3:3 yes
3 パッケージのインストール方法
stress-ngはepelリポジトリにあるので、まず、epel-releaseパッケージをインストールします。
[root@server ~]# yum -y install epel-release
次に、stress-ngパッケージをインストールします。
[root@server ~]# yum -y install stress-ng
stress-ngコマンドの版数を確認します。
[root@server ~]# stress-ng -V stress-ng, version 0.07.29
4 オプション一覧
オプションは以下のとおりです。非常に多くのオプションがあるので、一部のみを引用します。
[root@server ~]# stress-ng -h stress-ng, version 0.07.29 Usage: stress-ng [OPTION [ARG]] General control options: --aggressive enable all aggressive options -a N, --all N start N workers of each stress test -b N, --backoff N wait of N microseconds before work starts --class name specify a class of stressors, use with --sequential -n, --dry-run do not run -h, --help show help -snip-
5 共通オプションの使い方
共通オプションは、全ての負荷試験で使うことができます。ここでは、CPU負荷(-c)を例に、共通オプションの使い方を説明します。
5.1 stress-ngコマンド実行時のメッセージ出力を抑止する方法(-q)
-qは、stress-ngコマンド実行時のメッセージ出力を抑止するオプションです。オプションを指定しないと、stress-ngコマンド実行時、以下のようなメッセージが出力されます。なお、stress-ngコマンドは、ctrl+Cを押下することで終了することができます。
[root@server ~]# stress-ng -c 1 stress-ng: info: [3109] defaulting to a 86400 second run per stressor stress-ng: info: [3109] dispatching hogs: 1 cpu
-qオプションを指定すると、stress-ngコマンド実行時に出力されるメッセージが出力されなくなります。
[root@server ~]# stress-ng -c 1 -q
5.2 stress-ngコマンドの実行時間を指定する方法(-t <時間>)
-tはstress-ngコマンドの実行時間を指定するオプションです。時間の後に指定するサフィックスは、s(秒),m(分),d(時),d(日)を指定することができます。たとえば、5sは5秒、5mは5分を表します。以下は、CPU負荷試験を5秒実行している例です。
[root@server ~]# date;stress-ng -c 1 -t 5s;date 2022年 3月 21日 月曜日 19:47:13 JST stress-ng: info: [3115] dispatching hogs: 1 cpu stress-ng: info: [3115] successful run completed in 5.00s 2022年 3月 21日 月曜日 19:47:18 JST
5.3 指定したCPUで負荷テストを実行する方法(--taskset)
--tasksetは、負荷テストを実行するCPUを指定するオプションです。
5.3.1 CPU=0で実行する方法
CPU負荷を与えるプロセスをCPU=0で実行してみます。
[root@server ~]# stress-ng -c 1 --taskset 0 -q & [1] 3143
プロセスの状態を確認します。親プロセス(PID=3143)はwaitシステムコールを実行して、子プロセス(PID=3144)の終了を待っています。do_waitはwaitシステムコールの延長で呼び出すカーネル関数です。そして、親プロセス、子プロセスともにcpu=0で動作していてることがわかります。また、子プロセスはCPU使用率が97%程度であることがわかります。
[root@server ~]# ps -C stress-ng,stress-ng-cpu -o comm,pid,ppid,%cpu,psr,wchan COMMAND PID PPID %CPU PSR WCHAN stress-ng 3143 1533 0.0 0 do_wait stress-ng-cpu 3144 3143 96.8 0 -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng
5.3.2 CPU=3で実行する方法
CPU負荷を与えるプロセスをCPU=3で実行してみます。
[root@server ~]# stress-ng -c 1 --taskset 3 -q & [1] 3152
プロセスの状態を確認します。親プロセス(PID=3152)はwaitシステムコールを実行して、子プロセス(PID=3153)の終了を待っています。そして、親プロセス、子プロセスともにcpu=3で動作していてることがわかります。また、子プロセスはCPU使用率が93%程度であることがわかります。
[root@server ~]# ps -C stress-ng,stress-ng-cpu -o comm,pid,ppid,%cpu,psr,wchan COMMAND PID PPID %CPU PSR WCHAN stress-ng 3152 1533 0.0 3 do_wait stress-ng-cpu 3153 3152 92.8 3 -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -c 1 --taskset 3 -q
5.4 スケジューリングポリシーの使い方(--sched)
--sched-prioは、rrやfifo(リアルタイムスケジューリングポリシー)のプロセスに優先度を指定するオプションです。リアルタイムの中で、1が最高優先度、99が最低優先度になります。other等(通常のスケジューリングポリシー)のプロセスには設定できないようです。
5.4.1 ケジューリングポリシーの確認方法
OSがサポートしているスケジューリングポリシーを確認します。スケジューリングポリシーとして、other,batch,idle,fifo,rrがあることがわかります。
[root@server ~]# stress-ng --sched which Available scheduler options are: other batch idle fifo rr
5.4.2 otherポリシーのプロセスを生成する方法
otherポリシーのプロセスを生成します。
[root@server ~]# stress-ng -c 1 --sched other -q & [1] 3159
プロセスの状態を確認します。otherポリシーで動作していることがわかります。otherポリシーは、TS(タイムシェアリング)のことです。
[root@server ~]# ps -C stress-ng,stress-ng-cpu -o comm,pid,ppid,cls,wchan COMMAND PID PPID CLS WCHAN stress-ng 3159 1533 TS do_wait stress-ng-cpu 3160 3159 TS -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -c 1 --sched other -q
5.4.3 rrポリシーのプロセスを生成する方法
rrポリシーのプロセスを生成します。
[root@server ~]# stress-ng -c 1 --sched rr -q & [1] 3165
プロセスの状態を確認します。rrポリシーで動作していることがわかります。
[root@server ~]# ps -C stress-ng,stress-ng-cpu -o comm,pid,ppid,cls,wchan COMMAND PID PPID CLS WCHAN stress-ng 3165 1533 RR do_wait stress-ng-cpu 3166 3165 RR -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -c 1 --sched rr -q
5.4.4 fifoポリシーのプロセスを生成する方法
fifoポリシーのプロセスを生成します。
[root@server ~]# stress-ng -c 1 --sched fifo -q & [1] 3169
プロセスの状態を確認します。fifoポリシーで動作していることがわかります。
[root@server ~]# ps -C stress-ng,stress-ng-cpu -o comm,pid,ppid,cls,wchan COMMAND PID PPID CLS WCHAN stress-ng 3169 1533 FF do_wait stress-ng-cpu 3170 3169 FF -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -c 1 --sched fifo -q
5.5 プライオリティの使い方(--sched-prio)
5.5.1 プライオリティを1にする方法
プライオリティが1のプロセスを生成します。
[root@server ~]# stress-ng -c 1 --sched rr --sched-prio 1 -q & [1] 11044
プロセスの状態を確認します。子プロセスのプライオリティ(RTPRIO)が1であることがわかります。
[root@server ~]# ps -C stress-ng,stress-ng-cpu -o comm,pid,ppid,cls,rtprio,wchan COMMAND PID PPID CLS RTPRIO WCHAN stress-ng 11044 1533 RR 1 do_wait stress-ng-cpu 11045 11044 RR 1 -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -c 1 --sched rr --sched-prio 1 -q
5.5.2 プライオリティを99にする方法
プライオリティが99のプロセスを生成します。
[root@server ~]# stress-ng -c 1 --sched rr --sched-prio 99 -q & [1] 11050
プロセスの状態を確認します。子プロセスのプライオリティが99であることがわかります。
[root@server ~]# ps -C stress-ng,stress-ng-cpu -o comm,pid,ppid,cls,rtprio,wchan COMMAND PID PPID CLS RTPRIO WCHAN stress-ng 11050 1533 RR 99 do_wait stress-ng-cpu 11051 11050 RR 99 -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -c 1 --sched rr --sched-prio 99 -q
5.6 負荷テストの種類を表示する方法(--stressors)
--stressorsは負荷テストの種類を表示するオプションです。たとえば、以下の実行結果の中にcpuという負荷テストがあります。CPU負荷テストは、CPU使用率を指定したり、CPU負荷を与える方法(--cpu-method)を選択することができます。CPU負荷を与える方法には、rand()関数の呼び出しや単純な無限ループといった処理を選択することができます。
[root@server ~]# stress-ng --stressors af-alg affinity aio aiol apparmor atomic bigheap bind-mount brk bsearch cache cap chdir chmod chown chroot clock clone context copy-file cpu cpu-online crypt daemon dccp dentry dir dirdeep dnotify dup epoll eventfd exec fallocate fanotify fault fcntl fiemap fifo filename flock fork fp-error fstat full futex get getdent getrandom handle hdd heapsort hsearch icache icmp-flood inotify io iomix ioprio itimer kcmp key kill klog lease link locka lockbus lockf lockofd longjmp lsearch madvise malloc matrix membarrier memcpy memfd mergesort mincore mknod mlock mmap mmapfork mmapmany mq mremap msg msync netlink-proc nice nop null numa oom-pipe opcode open personality pipe poll procfs pthread ptrace pty qsort quota rdrand readahead remap rename resources rlimit rmap rtc schedpolicy sctp seal seccomp seek sem sem-sysv sendfile shm shm-sysv sigfd sigfpe sigpending sigq sigsegv sigsuspend sleep sock sockfd sockpair spawn splice stack stackmmap str stream switch symlink sync-file sysfs sysinfo tee timer timerfd tlb-shootdown tmpfs tsc tsearch udp udp-flood unshare urandom userfaultfd utime vecmath vfork vforkmany vm vm-rw vm-splice wait wcs xattr yield zero zlib zombie
5.7 親プロセスと子プロセスの名前を同じにする方法(-k)
-kは親プロセスと子プロセスを同じ名前にするオプションです。stress-ngコマンドを実行すると、親プロセスと子プロセスが生成されます。このとき、親プロセスの名前はstress-ngですが、子プロセスの名前は負荷テストの種類毎の名前が付けられます。たとえば、CPU負荷テストの場合、子プロセスの名前はstress-ng-cpuとなります。
5.7.1 オプション未指定の場合
stress-ngコマンドを実行します。
[root@server ~]# stress-ng -c 1 -q & [1] 3176
psコマンドでプロセスの状態を確認します。親プロセス(stress-ng)と子プロセス(stress-ng-cpu)の名前が異なることがわかります。
[root@server ~]# ps -C stress-ng,stress-ng-cpu -o comm,pid,ppid,wchan COMMAND PID PPID WCHAN stress-ng 3176 1533 do_wait stress-ng-cpu 3177 3176 -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -c 1 -q
5.7.2 オプション指定した場合
-kオプションを指定して、stress-ngコマンドを実行します。
[root@server ~]# stress-ng -c 1 -k -q & [1] 3180
psコマンドでプロセスの状態を確認します。親プロセスと子プロセスの名前が同じであることがわかります。
[root@server ~]# ps -C stress-ng,stress-ng-cpu -o comm,pid,ppid,wchan COMMAND PID PPID WCHAN stress-ng 3180 1533 do_wait stress-ng 3181 3180 -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -c 1 -k -q
6 CPU負荷テスト(-c,--cpu)
6.1 CPU負荷を掛けるプロセス数の指定方法
6.1.1 プロセスを1つ生成する方法
CPU負荷をかけるプロセスを1つ生成します。
[root@server ~]# stress-ng -k -c 1 -q & [1] 11019
プロセスの状態を確認します。子プロセス(PID=11020)が1つ生成されたことがわかります。
[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu,wchan COMMAND PID PPID PSR %CPU WCHAN stress-ng 11019 1533 3 0.0 do_wait stress-ng 11020 11019 3 100 -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -k -c 1 -q
6.1.2 プロセスを2つ生成する方法
CPU負荷をかけるプロセスを2つ生成します。
[root@server ~]# stress-ng -k -c 2 -q & [1] 11024
プロセスの状態を確認します。子プロセス(PID=11025,11026)が2つ生成されたことがわかります。
[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu,wchan COMMAND PID PPID PSR %CPU WCHAN stress-ng 11024 1533 2 0.0 do_wait stress-ng 11025 11024 3 108 - stress-ng 11026 11024 2 108 -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -k -c 2 -q
6.2 CPU使用率を指定する方法(-l)
-lは、指定したCPU使用率の負荷をCPUに与えるオプションです。
6.2.1 CPU使用率を10%にする方法
CPU使用率10%のプロセスを1つ生成してみます。
[root@server ~]# stress-ng -k -c 1 -l 10 -q & [1] 11030
プロセスの状態を確認します。子プロセスのCPU利用率が13.3%であることがわかります。おおよそ指定したCPU使用率であることがわかります。
[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu,wchan COMMAND PID PPID PSR %CPU WCHAN stress-ng 11030 1533 3 0.0 do_wait stress-ng 11031 11030 0 13.3 poll_schedule_timeout
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -k -c 1 -l 10 -q
6.2.2 CPU使用率を30%にする方法
CPU使用率30%のプロセスを1つ生成してみます。
[root@server ~]# stress-ng -k -c 1 -l 30 -q & [1] 11034
プロセスの状態を確認します。子プロセスのCPU利用率が36.5%であることがわかります。おおよそ指定したCPU使用率であることがわかります。
[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu,wchan COMMAND PID PPID PSR %CPU WCHAN stress-ng 11034 1533 1 0.0 do_wait stress-ng 11035 11034 2 36.5 poll_schedule_timeout
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [1]+ 終了 stress-ng -k -c 1 -l 30 -q
7 CPUアフィニティ負荷テスト(--affinity)
--affinityはプロセスが動作するCPUを次々と切り替えるオプションです。
[root@server ~]# stress-ng -k --affinity 1 -q & [1] 11002
psコマンドを実行して、プロセスの状態を確認します。子プロセスがCPU=0で動作していることがわかります。
[root@server ~]# ps -C stress-ng,stress-ng-affinity -o comm,pid,ppid,psr,%cpu,wchan COMMAND PID PPID PSR %CPU WCHAN stress-ng 11002 1533 1 0.3 do_wait stress-ng 11003 11002 0 94.6 -
再度psコマンドを実行して、プロセスの状態を確認します。今度は、子プロセスがCPU=2で動作していることがわかります。
[root@server ~]# ps -C stress-ng,stress-ng-affinity -o comm,pid,ppid,psr,%cpu,wchan COMMAND PID PPID PSR %CPU WCHAN stress-ng 11002 1533 1 0.1 do_wait stress-ng 11003 11002 2 98.2 -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -k --affinity 1 -q
8 プロセス生成負荷をかける方法(-f)
-fは生成する子プロセスの数を指定するオプションです。ここでは、子プロセスを2つ生成してみます。
[root@server ~]# stress-ng -k -f 2 -q & [1] 80061
プロセスの状態を確認します。子プロセスが2つ生成されていることがわかります。
[root@server ~]# ps -C stress-ng,stress-ng-cpu -o comm,pid,ppid,wchan COMMAND PID PPID WCHAN stress-ng 80061 1533 do_wait stress-ng 80062 80061 - stress-ng 80063 80061 -
stress-ngコマンドを終了します。
[root@server ~]# pkill stress-ng [root@server ~]# [1]+ 終了 stress-ng -k -f 2 -q
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ