hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

stress-ngコマンドの使い方



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-

4 共通オプションの使い方

共通オプションは、全ての負荷試験で使うことができます。ここでは、CPU負荷(-c)を例に、共通オプションの使い方を説明します。

4.1 stress-ngコマンド実行時のメッセージ出力を抑止する方法(-q)

オプションを指定しないと、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

4.2 実行時間の指定方法(-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

4.3 指定したCPUで負荷テストを実行する方法(--taskset)

--tasksetは、負荷テストを実行するCPUを指定するオプションです。

4.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
4.3.1 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

4.4 スケジューリングポリシーの使い方(--sched)

--sched-prioは、rrやfifo(リアルタイムスケジューリングポリシー)のプロセスに優先度を設定するオプションです。リアルタイムの中で、1が最高優先度、99が最低優先度になります。other等(通常のスケジューリングポリシー)のプロセスには設定できないようです。

4.4.1 ケジューリングポリシーの確認方法

OSがサポートしているスケジューリングポリシーを確認します。スケジューリングポリシーとして、other,batch,idle,fifo,rrがあることがわかります。

[root@server ~]# stress-ng --sched which
Available scheduler options are: other batch idle fifo rr
4.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
4.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
4.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

4.5 プライオリティの使い方(--sched-prio)

4.5.1 プライオリティを1に指定した場合

プライオリティが1のプロセスを生成します。

[root@server ~]# stress-ng -c 1 --sched rr --sched-prio 1 -q &
[1] 11044

プロセスの状態を確認します。子プロセスのプライオリティが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
4.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

4.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

4.7 子プロセスの名前を親プロセスと同じ名前にする方法(-k)

stress-ngコマンドを実行すると、親プロセスと子プロセスが生成されます。このとき、親プロセスの名前はstress-ngですが、子プロセスの名前は負荷テストの種類毎の名前が付けられます。たとえば、CPU負荷テストの場合、子プロセスの名前はstress-ng-cpuとなります。-kオプションを指定すると、子プロセスの名前は親プロセスと同じstress-ngという名前になります。

4.7.1 オプション未指定の場合

stress-ngコマンドを実行します。

[root@server ~]# stress-ng -c 1 -q &
[1] 3176

プロセスの状態を確認します。子プロセスの名前(stress-ng-cpu)が親プロセスと違う名前(stress-ng)であることがわかります。

[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
4.7.2 オプション指定した場合

-kオプションを指定して、stress-ngコマンドを実行します。

[root@server ~]# stress-ng -c 1 -k -q &
[1] 3180

プロセスの状態を確認します。子プロセスと親プロセスの名前が同じあることがわかります。

[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

5 CPU負荷テスト(-c,--cpu)

5.1 CPU負荷を掛けるプロセス数の指定方法

5.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
5.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

5.2 CPU使用率を指定する方法(-l)

-lは、指定したCPU使用率の負荷をCPUに与えるオプションです。

5.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
5.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

6 CPUアフィニティ負荷テスト(--affinity)

--affinityは、プロセスが動作するCPUを次々に切り替えるオプションです。

[root@server ~]# stress-ng -k --affinity 1 -q &
[1] 11002

プロセスの状態を確認します。子プロセスが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

7 プロセス生成負荷のかけ方(-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技術ブログ