hana_shinのLinux技術ブログ

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

stressコマンドの使い方



1 stressコマンドとは?

CPU,ディスク,メモリに負荷をかけるツールです。たとえば、CPU使用率を100%にしたりすることができます。なお、stressコマンドより多くの種類の負荷テストを実行できるstress-ngコマンドというのもあります。stress-ngコマンドについては、stress-ngコマンドの使い方 - 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数を確認します。搭載CPUは4個であることがわかります。

[root@server ~]# cat /proc/cpuinfo |grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

3 stressコマンドのインストール方法

netcatパッケージはepelリポジトリにあるので、まず、epelリポジトリをインストールします。

[root@server ~]# yum -y install epel-release

次に、stressパッケージをインストールします。

[root@server ~]# yum -y install stress

stress コマンドの版数を確認します。版数は次のとおりです。

[root@server ~]# stress --version
stress 1.0.4

4 オプション一覧

[root@server ~]# stress --help
`stress' imposes certain types of compute stress on your system

Usage: stress [OPTION [ARG]] ...
 -?, --help         show this help statement
     --version      show version statement
 -v, --verbose      be verbose
 -q, --quiet        be quiet
 -n, --dry-run      show what would have been done
 -t, --timeout N    timeout after N seconds
     --backoff N    wait factor of N microseconds before work starts
 -c, --cpu N        spawn N workers spinning on sqrt()
 -i, --io N         spawn N workers spinning on sync()
 -m, --vm N         spawn N workers spinning on malloc()/free()
     --vm-bytes B   malloc B bytes per vm worker (default is 256MB)
     --vm-stride B  touch a byte every B bytes (default is 4096)
     --vm-hang N    sleep N secs before free (default none, 0 is inf)
     --vm-keep      redirty memory instead of freeing and reallocating
 -d, --hdd N        spawn N workers spinning on write()/unlink()
     --hdd-bytes B  write B bytes per hdd worker (default is 1GB)

Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s

Note: Numbers may be suffixed with s,m,h,d,y (time) or B,K,M,G (size).

5 CPUに負荷をかける方法(-c)

5.1 stressプロセスを1つ起動する方法

stressプロセスを1つ起動してみます。 -cは起動するstressプロセスの個数、-qは起動メッセージを表示しないようにするオプションです。

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

psコマンドでプロセスの状態を確認します。●が親プロセス、★が子プロセスになります。 子プロセスのCPU使用率が100%であることがわかります。 親プロセスはwaitシステムコールを実行して、子プロセスの終了を待ちます。 したがって、親プロセスのCPU使用率は0%です。 なお、親プロセス、子プロセスともにCPU1で動作していることがわかります。

[root@server ~]# ps -C stress -o comm,pid,ppid,%cpu,psr
COMMAND             PID    PPID %CPU PSR
stress             5119    3195  0.0   1 ●
stress             5120    5119  100   1 ★

子プロセスの状態を確認します。 子プロセスは常にrand()を実行していることがわかります。

[root@server ~]#  ltrace -ttT -p 5120
20:20:26.184179 rand()                                                                      = 708528584 <0.002008>
20:20:26.186668 rand()                                                                      = 834074004 <0.001082>
20:20:26.188304 rand()                                                                      = 1150782216 <0.001273>
-snip-

あと始末をします(stressコマンドの終了)。

[root@server ~]# pkill stress
[1]+  Terminated              stress -c 1 -q

5.2 stressプロセスを2つ起動する方法

次に、stressプロセスを2つ起動してみます。 -cは起動するstressプロセスの個数、-qは起動メッセージを表示しないオプションです。

[root@server ~]#  stress -c 2 -q &
[1] 5171

プロセスの状態を確認します。●が親プロセス、★が子プロセスになります。 親プロセスはwaitシステムコールを実行して、子プロセスの終了を待ちます。 子プロセスが2つ起動されていることがわかります。 さらに、子プロセはCPU使用率が約98%であることがわかります。

[root@server ~]# ps -C stress -o comm,pid,ppid,%cpu,psr
COMMAND             PID    PPID %CPU PSR
stress             5171    3195  0.0   2  ●
stress             5172    5171 98.2   3 ★
stress             5173    5171 98.3   1 ★

あと始末をします。(stressコマンドの終了)。

[root@server ~]# pkill stress
[1]+  Terminated              stress -c 2 -q
[root@server ~]#

6 メモリに負荷をかける方法(-m)

6.1 メモリの獲得/解放を繰り返す負荷を与える場合(-m <プロセス数>)

不定サイズのメモリ獲得/解放を繰り返すので、メモリ消費量(psコマンドのrssの値)が ある時は30M、またある時は256M、といった表示になります(つまり「一定ではない」ということ)。 獲得したメモリ量を維持し続けたい場合は、--vm-hangオプション(4.2章)を使います。

[root@server ~]# stress -m 1 -q &
[1] 5439

消費メモリ(★印)を確認します。この時点では約140M程度を消費している。

[root@server ~]# ps -C stress -o command,pid,ppid,rss
COMMAND                         PID    PPID   RSS
stress -m 1 -q                 5439    3195  1148
stress -m 1 -q                 5440    5439 140824

適当な時間をおいて、再度psコマンドを実行します。 この時点では約50M程度を消費していることがわかります。

[root@server ~]# ps -C stress -o command,pid,ppid,rss
COMMAND                         PID    PPID   RSS
stress -m 1 -q                 5439    3195  1148
stress -m 1 -q                 5440    5439 50604

6.2 メモリを獲得したままの状態にしたい場合(--vm-hang)

6.1はメモリの獲得、解放を確認しました。 6.2はメモリを獲得したら、そのままの状態を保ちます。stressプロセスは、nanosleepを呼び出してスリープします。 獲得するメモリ量は256Mです。メモリを獲得したままの時間は--vm-hangのパラメータに指定します。 --vm-hang 0 だと永遠にメモリを解放せず、獲得したままの状態になります。

[root@server ~]# stress -m 1 --vm-hang 0 -q &
[1] 5645

stressが獲得したメモリ量を確認します。256M獲得したことがわかります(★印)。

[root@server ~]# ps -LC stress -o comm,pid,ppid,rss
COMMAND             PID    PPID   RSS
stress             5645    3195  1152
stress             5646    5645 262560 ★

時間をおいて、再度、psコマンドを実行します。 stressが獲得したメモリ量が256Mのままであることがわかります(★印)。

[root@server ~]#  ps -LC stress -o comm,pid,ppid,rss
COMMAND             PID    PPID   RSS
stress             5645    3195  1152
stress             5646    5645 262560 ★

6.3 指定した量のメモリを獲得したい場合(--vm-bytes <獲得メモリ量>)

デフォルトだと256Mのメモリを獲得しますが、--vm-bytes を使うことで指定したメモリ量を獲得することができます。

stressを1つ起動します。このとき、プロセスが獲得するメモリサイズに64Mを指定します。

[root@server ~]# stress -m 1 --vm-bytes 67108864 --vm-hang 0 -q &
[1] 5834

メモリ使用量を確認してみます。64M(★)獲得していることがわかる。

[root@server ~]# ps -C stress -o command,pid,ppid,rsz,rss
[COMMAND                         PID    PPID   RSZ   RSS
stress -m 1 --vm-bytes 6710    5834    3195  1144  1144
stress -m 1 --vm-bytes 6710    5835    5834 66056 66056 ★

次に、128Mのメモリを獲得したままのstressプロセスを1つ起動します。

[root@server ~]# stress -m 1 --vm-bytes 134217728 --vm-hang 0 -q &
[2] 5853

メモリ使用量を確認してみます。 1回目に起動しstressプロセスは64M、2回目に起動したstressプロセスは128Mのメモリを獲得したままになっていることがわかります。

[2] 5853
[root@server ~]# ps -C stress -o command,pid,ppid,rsz,rss
COMMAND                         PID    PPID   RSZ   RSS
stress -m 1 --vm-bytes 6710    5834    3195  1144  1144
stress -m 1 --vm-bytes 6710    5835    5834 66056 66056 ★1回目に起動した子プロセス
stress -m 1 --vm-bytes 1342    5853    3195  1056  1056
stress -m 1 --vm-bytes 1342    5854    5853 131808 131808 ★2回目に起動した子プロセス

7 ハードディスクに負荷をかける方法(-d,--hdd-bytes)

7.1 hdd-bytesの意味について

hdd-bytesは、ファイルに書き込むバイト数を表します。 たとえば、hdd-bytesに5を指定すると、ファイルをオープンして5バイト書き込みます。 このとき、ファイルには1バイトづつ書き込んでいきます。 書き込みが完了すると、別のファイルをオープンして、同様のことを繰り返します。 以下のようにstraceコマンドを使うと、その時の様子がわかります。 なお、straceコマンドの使い方は、straceコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# strace -ttT -f stress -d 1 --hdd-bytes 5
-snip-
[pid  2112] 19:03:52.464647 open("./stress.nNJKfS", O_RDWR|O_CREAT|O_EXCL, 0600) = 3 <0.000076>
[pid  2112] 19:03:52.464815 unlink("./stress.nNJKfS") = 0 <0.000030>
[pid  2112] 19:03:52.464903 write(3, "n", 1) = 1 <0.000027>
[pid  2112] 19:03:52.464979 write(3, "{", 1) = 1 <0.000038>
[pid  2112] 19:03:52.465066 write(3, "6", 1) = 1 <0.000017>
[pid  2112] 19:03:52.465130 write(3, "\\", 1) = 1 <0.000060>
[pid  2112] 19:03:52.465259 write(3, "\n", 1) = 1 <0.000028>
[pid  2112] 19:03:52.465369 close(3)    = 0 <0.000068>
[pid  2112] 19:03:52.465516 open("./stress.rp7cxi", O_RDWR|O_CREAT|O_EXCL, 0600) = 3 <0.000123>
[pid  2112] 19:03:52.465729 unlink("./stress.rp7cxi") = 0 <0.000049>
[pid  2112] 19:03:52.465859 write(3, "n", 1) = 1 <0.000099>
[pid  2112] 19:03:52.466051 write(3, "{", 1) = 1 <0.000029>
[pid  2112] 19:03:52.466186 write(3, "6", 1) = 1 <0.000032>
[pid  2112] 19:03:52.466295 write(3, "\\", 1) = 1 <0.000058>
[pid  2112] 19:03:52.466421 write(3, "\n", 1) = 1 <0.000018>
[pid  2112] 19:03:52.466495 close(3)    = 0 <0.000060>
-snip-

7.2実行例

-dオプションを使ってファイルへの書き込みをするプロセスを3つ起動します。 そして、 各プロセスは5バイトの書き込みを繰り返します。 -qは起動メッセージを表示しないオプションです。

[root@server ~]# stress -d 3 --hdd-bytes 5 -q &
[1] 2134

プロセスの状態を確認します。 ●が親プロセス、★が子プロセスです。子プロセスがファイルに書き込みをしていています。 また、親プロセスはCPU3で動作しています。 子プロセスは、それぞれCPU1,CPU2,CPU0で動作しています。

[root@server ~]# ps -C stress -o comm,pid,ppid,psr
COMMAND            PID   PPID PSR
stress            2134   1786   3 ●
stress            2135   2134   1 ★
stress            2136   2134   2 ★
stress            2137   2134   0 ★

pkillコマンドを使って、stressコマンドを終了します。

[root@server ~]# pkill stress
[1]+  Terminated              stress -d 3 --hdd-bytes 5 -q

8 syncの使い方(-i)

-iオプションは、syncを繰り返し実行することによる負荷をかけるプションです。

[root@server ~]# stress -i 1 -q &
[1] 2405

プロセスの状態を確認してみます。 ●は親プロセスです。do_wait カーネル関数を呼び出して、スリープしていることがわかります。

[root@server ~]# ps -C stress -o comm,pid,ppid,psr,wchan
COMMAND            PID   PPID PSR WCHAN
stress            2405   1786   1 do_wait ●
stress            2406   2405   2 -   ★

次に、straceコマンドを使って、子プロセスが何を実行しているかを確認してみます。 子プロセスはsyncシステムコールを繰り返し実行していることがわかります。

[root@server ~]# strace -ttT -p 2406
strace: Process 2406 attached
19:32:28.705745 sync()                  = 0 <0.000837>
19:32:28.707012 sync()                  = 0 <0.000574>
19:32:28.707826 sync()                  = 0 <0.000237>
-snip-

pkillコマンドを使って、stressコマンドを終了します。

[root@server ~]# pkill stress
[1]+  Terminated              stress -i 1 -q

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

9.1 タイムアウトを指定する方法(-t)

指定した時間を経過するとstressコマンドを終了させるオプションです。 5秒経過したら、stressコマンドを終了してみます。

[root@server ~]# date;stress -c 1 -q -t 5;date
2021年 12月 20日 月曜日 19:39:43 JST
2021年 12月 20日 月曜日 19:39:48 JST

次は、10秒経過したら、stressコマンドを終了してみます。

[root@server ~]# date;stress -m 1 -q -t 10;date
2021年 12月 20日 月曜日 19:41:55 JST
2021年 12月 20日 月曜日 19:42:05 JST

9.2 dry-runの使い方(-n)

stressコマンドがどのような負荷をかけるかを調べるときに使うオプションです。 実際には、負荷をかけるようなことはしません。

CPU負荷をかけるプロセスを1つ生成してみます。

[root@server ~]# stress -n -c 1
stress: info: [2556] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
stress: info: [2556] successful run completed in 0s

IO負荷をかけるプロセスを2つ生成してみます。

[root@server ~]# stress -n -i 2
stress: info: [2558] dispatching hogs: 0 cpu, 2 io, 0 vm, 0 hdd
stress: info: [2558] successful run completed in 0s

メモリ負荷をかけるプロセスを3つ生成してみます。

[root@server ~]# stress -n -m 3
stress: info: [2561] dispatching hogs: 0 cpu, 0 io, 3 vm, 0 hdd
stress: info: [2561] successful run completed in 0s

HDD負荷をかけるプロセスを4つ生成してみます。

[root@server ~]# stress -n -d 4
stress: info: [2573] dispatching hogs: 0 cpu, 0 io, 0 vm, 4 hdd
stress: info: [2573] successful run completed in 0s

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ