yes, stress コマンド

この記事は [Linux コマンド 全部オレ Advent Calendar 2017](https://adventar.org/calendars/2630) の18日目の記事です。

# yes

```
NAME
       yes - output a string repeatedly until killed

SYNOPSIS
       yes [STRING]...
       yes OPTION

DESCRIPTION
       Repeatedly output a line with all specified STRING(s), or 'y'.

       --help display this help and exit

       --version
              output version information and exit

       GNU coreutils online help: <http://www.gnu.org/software/coreutils/> Report yes translation
       bugs to <http://translationproject.org/team/>
```
指定した文字列をひたすら出力するコマンド。負荷試験やインタラクティブに「y/N」を求められる場面で利用する。

## CPU 負荷をかける

```
[sinsengumi ~]$ yes > /dev/null
[sinsengumi ~]$ top
top - 11:04:00 up 11 days, 19:39,  3 users,  load average: 0.70, 0.34, 0.17
Tasks:  99 total,   2 running,  97 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  : 99.3 us,  0.7 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
```

標準出力を `/dev/null` にリダイレクトしないと、1 CPU を使い切るほどは負荷はかからない。
（`/dev/null` にリダイレクトすると、画面描写が無いので超高速で、CPU が働きまくるらしい）

論理 CPU が複数ある場合は、バックグラウンドで複数動かせばよい。

## メモリに負荷をかける

```
[sinsengumi ~]$ /dev/null < $(yes)

[sinsengumi ~]$ free -h -s 3
              total        used        free      shared  buff/cache   available
Mem:           3.7G        275M        2.1G        624K        1.3G        3.1G
Swap:          4.0G          0B        4.0G

              total        used        free      shared  buff/cache   available
Mem:           3.7G        349M        2.1G        624K        1.3G        3.0G
Swap:          4.0G          0B        4.0G

              total        used        free      shared  buff/cache   available
Mem:           3.7G        646M        1.8G        624K        1.3G        2.7G
Swap:          4.0G          0B        4.0G

              total        used        free      shared  buff/cache   available
Mem:           3.7G        953M        1.5G        624K        1.3G        2.4G
Swap:          4.0G          0B        4.0G

              total        used        free      shared  buff/cache   available
Mem:           3.7G        1.2G        1.2G        624K        1.3G        2.1G
Swap:          4.0G          0B        4.0G
```
3秒間隔で free すると available がどんどん減っていくのがわかる。

ちなみに、ずっとやっているとスワップ領域まで使い始めるかと思ったが、その前に以下のようなエラーが出て止まってしまった。

```
-bash: xrealloc: cannot allocate 18446744071562067968 bytes (1392640 bytes allocated)
```

# stress

```
NAME
       stress - tool to impose load on and stress test systems

SYNOPSIS
       stress [OPTION [ARG]] ...

DESCRIPTION
       `stress' imposes certain types of compute stress on your system
```
Switch User.

## CPU（ユーザ）に負荷をかける

`--cpu` で起動するプロセス数を指定する。中身は `sqrt` 関数を実行している。

```
[sinsengumi ~]$ stress --cpu 2
stress: info: [20622] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd

[sinsengumi ~]$ top
top - 11:34:10 up 11 days, 20:09,  3 users,  load average: 0.87, 0.38, 0.25
Tasks: 100 total,   3 running,  97 sleeping,   0 stopped,   0 zombie
%Cpu0  : 99.7 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3881668 total,  2231112 free,   284220 used,  1366336 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used.  3239072 avail Mem

   PID USER        PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 20677 sinsengumi  20   0    7260     96      0 R  99.3  0.0   0:14.71 stress
 20678 sinsengumi  20   0    7260     96      0 R  99.3  0.0   0:14.67 stress
```

## CPU（システム）に負荷をかける

`--io` で起動するプロセス数を指定する。中身は `sync` コマンドを実行している。

```
[sinsengumi ~]$ stress --io 2
stress: info: [20890] dispatching hogs: 0 cpu, 2 io, 0 vm, 0 hdd

[sinsengumi ~]$ top
top - 11:38:34 up 11 days, 20:13,  3 users,  load average: 0.79, 0.48, 0.33
Tasks: 100 total,   3 running,  97 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,100.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,100.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3881668 total,  2232128 free,   283160 used,  1366380 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used.  3240240 avail Mem

   PID USER        PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 20941 sinsengumi  20   0    7260     96      0 R  96.8  0.0   0:11.72 stress
 20942 sinsengumi  20   0    7260     96      0 R  96.8  0.0   0:11.83 stress
```

## メモリーに負荷をかける

`--vm` で起動するプロセス数を指定する。中身は `malloc`, `free` 関数を繰り返し実行している。
`--vm-bytes` で確保するメモリを指定する。また、デフォルトでは `malloc`, `free` を繰り返すので、`--vm-keep` を指定すると、`free` を行わず確保したままにしてくれる。

```
[sinsengumi ~]$ stress --vm 2 --vm-bytes 1G --vm-keep
stress: info: [21808] dispatching hogs: 0 cpu, 0 io, 2 vm, 0 hdd

[sinsengumi ~]$ top
top - 11:55:40 up 11 days, 20:30,  3 users,  load average: 0.00, 0.08, 0.20
Tasks:  99 total,   1 running,  98 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3881668 total,   130672 free,  2383972 used,  1367024 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used.  1139364 avail Mem

   PID USER        PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 21809 sinsengumi  20   0 1055840 1.000g    184 S   0.0 27.0   0:00.48 stress
 21810 sinsengumi  20   0 1055840 1.000g    184 S   0.0 27.0   0:00.47 stress
```

## ディスク IO（CPU wait）に負荷をかける

`--io` で起動するプロセス数を指定する。中身は `write`, `unlink` 関数を繰り返し実行している。
デフォルトでは、各プロセス 1GB ずつ書き込みを行う。

```
[sinsengumi ~]$ stress --hdd 2
stress: info: [22803] dispatching hogs: 0 cpu, 0 io, 0 vm, 2 hdd

[sinsengumi ~]$ top
top - 12:06:17 up 11 days, 20:41,  3 users,  load average: 0.52, 0.84, 0.63
Tasks: 111 total,   3 running, 108 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.3 us, 52.4 sy,  0.0 ni,  6.1 id, 41.2 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.3 us, 58.4 sy,  0.0 ni,  3.4 id, 37.8 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3881668 total,  2693320 free,   114276 used,  1074072 buff/cache
KiB Swap:  4194300 total,  4088112 free,   106188 used.  3518900 avail Mem

   PID USER        PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 22804 sinsengumi  20   0    8164   1120    120 R  46.2  0.0   0:03.15 stress
 22805 sinsengumi  20   0    8164   1120    120 D  45.2  0.0   0:03.32 stress

[sinsengumi ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        40G  5.3G   35G  14% /
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  624K  1.9G   1% /run
[sinsengumi ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        40G  7.3G   33G  19% /
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  624K  1.9G   1% /run
```