stressコマンドの使い方
- 1 stressコマンドとは?
- 2 検証環境
- 3 stressコマンドのインストール方法
- 4 オプション一覧
- 5 CPUに負荷をかける方法(-c)
- 6 メモリ獲得/開放の負荷をかける方法(-m)
- 7 ハードディスクへの書き込み負荷をかける方法(-d,--hdd-bytes)
- 8 syncの使い方(-i)
- 9 共通オプションの使い方
- Z 参考情報
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つ起動する方法
-cは起動するstressプロセスの個数、-qは起動メッセージを表示しないようにするオプションです。stressプロセスを1つ起動してみます。
[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つ起動してみます。
[root@server ~]# stress -c 2 -q & [1] 5171
プロセスの状態を確認すると、親プロセスはwaitシステムコールを実行して子プロセスの終了を待っています。したがって、親プロセスのCPU使用率は0%となっています、一方、子プロセスは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 <プロセス数>)
-mは獲得するメモリ量を指定するオプションです。このオプションを指定すると、不定サイズのメモリの獲得/解放を繰り返すので、メモリ消費量(psコマンドのrssの値)がある時は30M、またある時は256Mになります(つまり「一定ではない」ということ)。獲得したメモリ量を維持したままにする場合は、--vm-hangオプション(6.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はメモリを獲得したら、そのままの状態を保ちます。 --vm-hangはメモリを獲得したら、そのままの状態を保つ時間(秒)を指定するオプションです。--vm-hang 0 と指定すると、メモリを解放せず獲得したままの状態になります。なお、獲得するメモリ量は256Mです。
[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 <獲得メモリ量>)
--vm-bytesは、指定したメモリ量を獲得するオプションです。--vm-hangオプションと併用することで、指定したメモリ量を解放せずに獲得したままの状態に保つことができます。
64Mのメモリを獲得するstressプロセスを1つ起動します。
[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)
-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技術ブログ