簡易的なLinuxサーバへの負荷のかけ方
初めに
今回は簡易的にLinuxサーバに負荷をかける方法を紹介します。監視機能のアラート設定を確認したい時などに一時的にサーバに負荷をかけたいときに活用することができます。Linuxサーバに負荷をかけるコマンドとして有名なstressコマンドがありますが色々なサイトに情報が記載されているためstressコマンドについては記載せず基本的なコマンドを使った簡易的に負荷をかける方法について記します。
ディスク使用量
ディスク使用量を一時的に増加させる単純な方法としては大きなファイルを作れば実現できます。ddコマンドを使えば大きなサイズのファイルが簡単に作ることが出来ます。
下記のコマンドのようにddコマンドで指定サイズのファイルを作成し、作成したファイルをコピーしてディスクの使用量を目標値になるまで増加させれば良いです。
#最初に大きなファイルを作る。
$ dd if=/dev/zero of=file1 bs=1M count=1024
# 必要量になるまで大きなファイルをコピーする。
$ cp file1 file2
# 不要になったらファイルを削除する。
$ rm file1
$ rm file2
メモリ使用量
メモリの使用量を増加させる簡単な方法はpythonやruby等のスクリプト言語をインタラクティブモードで起動して変数に大きいサイズの配列を代入してやれば簡単にメモリ使用量の操作が可能です。メモリ使用量の減少結果を確認したい場合は大きな配列が代入された変数に整数値を代入して配列用に取得したメモリ領域が解放されメモリ使用量の減少を確認することが出来ます。注意点としてはswap領域がサーバに設定されている場合、取得したメモリ領域がスワップアウトされメモリ使用量が思ったように上昇しない場合があります。そのため可能であればswap領域を解除してからメモリの使用量の増減を試したほうがメモリ使用量の増減操作が簡単になります。
$ python3
>>>a1 = [0] * (1000 * 1000* 130)
>>>a2 = [0] * (1000 * 1000* 130)
# 変数に0を代入して、使用メモリ量を下げる。
>>>a1 = 0
>>>a2 = 0
CPU使用率
CPU使用率を上げたい場合は単純にサーバのCPUの個数と同じ数の無限ループを実行するプログラムを起動すればよいです。ただしCPU使用率が100%になってしまうため決まったCPU使用率にしたい場合はこの方法では実現できません。決まったCPU使用率にしたい場合はcgroupを用いることでCPUの負荷の上限値を制限することが出来ます。cgroupはLinuxの機能の一つでCPU、メモリ、ストレージ等のリソースの使用に制限をかけることが出来る機能です。cgroupを用いればCPUの使用率に制限をかけ、目標のCPU使用率まで負荷をかけることが出来ます。cgroupにはv1とv2があり、CPUに制限をかける方法が少しだけ違います。例としてCPU2コアを持つLinuxサーバにCPU使用率を最大50%に制限する方法について記します。
cgroupの確認方法
cgroupを使う前にサーバのcgroupがv1なのかv2なのか調べる必要があります。調べる方法としては下記のコマンドを実行して表示された結果から調べることが出来ます。cgroup v2ではcgroup2fs
と出力され、cgroup v1ではtmpfs
と出力されます。
$ stat -fc %T /sys/fs/cgroup/
cgroup v1でのCPU使用率の制限設定
CPU使用率の制限設定は管理者権限を使用できるユーザで設定してください。
初めに/sys/fs/cgroup/cpu/
以下にtestグループ用のディレクトリを作成します。
$ sudo mkdir /sys/fs/cgroup/cpu/test
ディレクトリ作成後にCPUの制限をかけたいプロセスIDを登録します。今回はログインシェルのプロセスIDを登録します。
$ echo $$ | sudo tee -a /sys/fs/cgroup/cpu/test/tasks
cpu.cfs_period_usの値を確認します。cpu.cfs_period_usは1つのCPUに制限をかける間隔の単位時間となります。基本的に値は100000が表示されます。この値の単位はマイクロ秒です。
$ cat /sys/fs/cgroup/cpu/test/cpu.cfs_period_us
CPUの使用率を50%に制限する場合は100000の半分の値である50000ではなく50000 × コア数の値を設定します。今回は2コアで50%のため50000×2となるため100000を設定します。
$ echo 100000 | sudo tee /sys/fs/cgroup/cpu/test/cpu.cfs_quota_us
この状態でコア数分bashで無限ループを実行します。topコマンドでCPU使用率を確認するとCPU使用率が50%になっていることが確認できます。
$ while :; do true ; done &
$ while :; do true ; done &
動作確認終了後にtestグループを削除したい場合は登録したプロセスを停止して/sys/fs/cgroup/cpu/test
ディレクトリを削除すればよいです。今回の場合はターミナルを終了します。
$ exit
新規にターミナルを起動して/sys/fs/cgroup/cpu/test
の削除を実施すればtestグループの削除は完了です。/sys/fs/cgroup/cpu/test
を削除する際はrm
コマンドではなくrmdir
コマンドを使用してください。
$ sudo rmdir /sys/fs/cgroup/cpu/test
cgroup v2でのCPU使用率の制限設定
cgroup v1と同様にCPU使用率の制限設定は管理者権限を使用できるユーザで設定してください。
/sys/fs/cgroup/
以下にtestグループ用のディレクトリを作成します。
$ sudo mkdir /sys/fs/cgroup/test
制限値を設定する方法がcgroup v1と異なり/sys/fs/cgroup/test/cpu.maxに設定を行います。
制限値 間隔
の順番に値を設定します。制限値を設定方法はcgroup v1と同様で100000の半分の値である50000ではなく50000 × コア数の値を設定します。
$ echo "100000 100000" | sudo tee /sys/fs/cgroup/test/cpu.max
cgroup v1の時と同じようにログインシェルのプロセスIDを登録します。
$ echo $$ | sudo tee /sys/fs/cgroup/test/cgroup.procs
この状態でコア数分bashで無限ループを実行します。topコマンドでCPU使用率を確認するとCPU使用率が50%になっていることが確認できます。
$ while :; do true ; done &
$ while :; do true ; done &
作成したtestグループを削除する場合は、/sys/fs/cgroup/test
ディレクトリを削除すればよいです。
$ sudo rmdir /sys/fs/cgroup/test
余談 dockerを使ってCPU使用率に制限をかけた環境を作る
cgroupはコンテナ環境の基盤機能として使われているのでdockerを使ってCPU使用率を制限した環境が作れるだろうと思い、調べたところ--cpus
オプションを指定してコンテナを実行すればCPU使用率を制限したコンテナを簡単に実行できることが分かりました。--cpus
オプションに設定する値はCPUの制限数となります。詳細については省略しますが--cpus
オプションに設定する値は全コア数×制限したい使用率
を設定します。例えば2コアでCPU使用率を50%に設定したい場合は1を設定すればCPU使用率を50%に制限した環境が作れます。下記にCPU使用率に制限をかけたコンテナを起動するコマンドの例を記します。
$ docker run -it --rm --cpus 1 fedora:latest
参考
Linuxカーネルのコンテナ機能[3] ─cgroupとは?(その2)
Linuxカーネルのコンテナ機能 - cgroup v2から使うCPUの帯域幅制限(1)
Linux Nodeのcgroupバージョンを特定する
docker container run
Discussion