負荷テストツールstress-ngを使ってみる

はじめに

システムの負荷テストやパフォーマンステストを行いたい場面で役立つstress-ngについて試してみる。

stress-ngは、CPU、メモリ、ディスク、ネットワークなど様々なリソースに対して負荷をかけることができる多機能な負荷テストツールである。

環境

Windows 11 Professional
WSL2 Ubuntu 24.04 LTS

stress-ngとは

stress-ngは、システムの様々なコンポーネントに負荷をかけてストレステストを実行するツールである。
元々のstressコマンドの進化版で、より多くの負荷テストパターンと詳細な制御が可能である。

できること

  • CPU負荷: 計算集約的な処理でCPUに負荷をかける
  • メモリ負荷: メモリアロケーションや読み書きでメモリに負荷をかける
  • ディスク負荷: ファイルI/Oでディスクに負荷をかける
  • ネットワーク負荷: ネットワーク通信で負荷をかける

インストール

sudo apt install stress-ng

使用例

基本的な使用法

# 基本構文
stress-ng [オプション] [ストレッサー] [引数] [--timeout 時間]

CPU負荷

# 1つのCPUコアに100%負荷をかける(10秒間)
stress-ng --cpu 1 --timeout 10s

# 4つのCPUコアに負荷をかける(60秒間)
stress-ng --cpu 4 --timeout 60s

# CPU負荷を20%に制限して実行
stress-ng --cpu 1 --cpu-load 20 --timeout 30s

メモリ負荷

# 1GB のメモリに負荷をかける(30秒間)
stress-ng --vm 1 --vm-bytes 1G --timeout 30s

# 複数のメモリワーカーで負荷をかける
stress-ng --vm 4 --vm-bytes 512M --timeout 60s

ディスク負荷テスト

# ディスクI/O負荷をかける(10秒間)
stress-ng --hdd 1 --timeout 10s

# 特定のサイズでファイルI/O負荷
stress-ng --hdd 1 --hdd-bytes 100M --timeout 30s

複合負荷テスト

# CPU、メモリ、ディスクに同時に負荷をかける
stress-ng --cpu 2 --vm 1 --vm-bytes 512M --hdd 1 --timeout 60s

オプション一覧

基本オプション

オプション説明
--timeout N実行時間を指定(秒、分、時、日)--timeout 60s, --timeout 5m
--verbose詳細な情報を出力--verbose
--quietエラー以外の出力を抑制--quiet
--helpヘルプメッセージを表示--help
--versionバージョン情報を表示--version

CPU関連オプション

オプション説明
--cpu NCPUストレッサーのワーカー数--cpu 4
--cpu-load PCPU使用率をP%に制限--cpu-load 50
--cpu-method MCPU負荷の計算方法を指定--cpu-method pi

メモリ関連オプション

オプション説明
--vm N仮想メモリストレッサーのワーカー数--vm 2
--vm-bytes B各ワーカーが使用するメモリサイズ--vm-bytes 1G
--vm-method Mメモリアクセスパターンを指定--vm-method write64

ディスク関連オプション

オプション説明
--hdd Nディスクストレッサーのワーカー数--hdd 1
--hdd-bytes B各ワーカーが書き込むデータサイズ--hdd-bytes 100M
--temp-path P一時ファイルの保存パス--temp-path /tmp

統計・ログ関連オプション

オプション説明
--metrics詳細な統計情報を表示--metrics
--metrics-brief簡潔な統計情報を表示--metrics-brief
--log-file Fログファイルに出力--log-file stress.log

制御オプション

オプション説明
--dry-run実際には実行せずテスト--dry-run
--aggressiveより積極的な負荷をかける--aggressive
--sequentialストレッサーを順次実行--sequential

使ってみる

実際にstress-ngを使ってシステムに負荷をかけてみる。

実際のCPU負荷テスト

# CPU1コアに負荷をかけて10秒間実行
stress-ng --cpu 1 --timeout 10s --verbose

実行結果

ログ
stress-ng: debug: [19194] invoked with 'stress-ng --cpu 1 --timeout 10s --verbose' by user 1002 'kbushi'
stress-ng: debug: [19194] stress-ng 0.17.06
stress-ng: debug: [19194] system: Linux kbushi 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64, gcc 13.2.0, glibc 2.39
stress-ng: debug: [19194] RAM total: 31.0G, RAM free: 25.6G, swap free: 8.0G
stress-ng: debug: [19194] temporary file path: '/home/kbushi', filesystem type: ext2 (218682997 blocks available)
stress-ng: debug: [19194] 24 processors online, 24 processors configured
stress-ng: info:  [19194] setting to a 10 secs run per stressor
stress-ng: debug: [19194] CPU data cache: L1: 32K, L2: 1024K, L3: 98304K
stress-ng: debug: [19194] cache allocate: shared cache buffer size: 98304K
stress-ng: info:  [19194] dispatching hogs: 1 cpu
stress-ng: debug: [19194] starting stressors
stress-ng: debug: [19194] 1 stressor started
stress-ng: debug: [19195] cpu: [19195] started (instance 0 on CPU 2)
stress-ng: debug: [19195] cpu: using method 'all'
stress-ng: debug: [19195] cpu: [19195] exited (instance 0 on CPU 2)
stress-ng: debug: [19194] cpu: [19195] terminated (success)
stress-ng: debug: [19194] metrics-check: all stressor metrics validated and sane
stress-ng: info:  [19194] skipped: 0
stress-ng: info:  [19194] passed: 1: cpu (1)
stress-ng: info:  [19194] failed: 0
stress-ng: info:  [19194] metrics untrustworthy: 0
stress-ng: info:  [19194] successful run completed in 7.85 secs

実際のメモリ負荷テスト

# 512MBのメモリに負荷をかけて30秒間実行
stress-ng --vm 1 --vm-bytes 512M --timeout 30s --verbose
ログ
stress-ng: debug: [19291] invoked with 'stress-ng --vm 1 --vm-bytes 512M --timeout 30s --verbose' by user 1002 'kbushi'
stress-ng: debug: [19291] stress-ng 0.17.06
stress-ng: debug: [19291] system: Linux kbushi 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64, gcc 13.2.0, glibc 2.39
stress-ng: debug: [19291] RAM total: 31.0G, RAM free: 25.6G, swap free: 8.0G
stress-ng: debug: [19291] temporary file path: '/home/kbushi', filesystem type: ext2 (218682984 blocks available)
stress-ng: debug: [19291] 24 processors online, 24 processors configured
stress-ng: info:  [19291] setting to a 30 secs run per stressor
stress-ng: debug: [19291] CPU data cache: L1: 32K, L2: 1024K, L3: 98304K
stress-ng: debug: [19291] cache allocate: shared cache buffer size: 98304K
stress-ng: info:  [19291] dispatching hogs: 1 vm
stress-ng: debug: [19291] starting stressors
stress-ng: debug: [19291] 1 stressor started
stress-ng: debug: [19292] vm: [19292] started (instance 0 on CPU 6)
stress-ng: debug: [19292] vm: using method 'all'
stress-ng: debug: [19292] vm: [19292] exited (instance 0 on CPU 16)
stress-ng: debug: [19291] vm: [19292] terminated (success)
stress-ng: debug: [19291] metrics-check: all stressor metrics validated and sane
stress-ng: info:  [19291] skipped: 0
stress-ng: info:  [19291] passed: 1: vm (1)
stress-ng: info:  [19291] failed: 0
stress-ng: info:  [19291] metrics untrustworthy: 0
stress-ng: info:  [19291] successful run completed in 27.84 secs

統計情報付きでの実行

# 詳細な統計情報と共にCPU負荷テスト
stress-ng --cpu 2 --timeout 60s --metrics-brief
ログ
stress-ng: info:  [20411] setting to a 1 min, 0 secs run per stressor
stress-ng: info:  [20411] dispatching hogs: 2 cpu
stress-ng: metrc: [20411] stressor       bogo ops real time  usr time  sys time   bogo ops/s     bogo ops/s
stress-ng: metrc: [20411]                           (secs)    (secs)    (secs)   (real time) (usr+sys time)
stress-ng: metrc: [20411] cpu              237944     55.61    111.25      0.00      4278.53        2138.89
stress-ng: info:  [20411] skipped: 0
stress-ng: info:  [20411] passed: 2: cpu (2)
stress-ng: info:  [20411] failed: 0
stress-ng: info:  [20411] metrics untrustworthy: 0
stress-ng: info:  [20411] successful run completed in 55.62 secs

実行結果例では以下の情報が表示される

  • テスト実行にかかった時間
  • 実行された操作の回数
  • 秒間の操作数

システム監視と併用

別のターミナルでtophtopコマンドを実行しながらstress-ngを動かすと、リアルタイムでCPU使用率の変化を確認できる。

# ターミナル1: システム監視
top

# ターミナル2: 負荷テスト実行
stress-ng --cpu 4 --timeout 120s

負荷制限機能

# CPU使用率を50%に制限して負荷テスト
stress-ng --cpu 2 --cpu-load 50 --timeout 60s --verbose

参考

おわりに

stress-ngは、システムの負荷テストやパフォーマンステストに使えるツールとなっている。

CPU、メモリ、ディスク、ネットワークなど様々なリソースに対して細かく制御された負荷をかけることができ、システムの安定性や性能の限界を調べるのに役立つ。

特に、負荷制限機能(--cpu-load)を使うことで、システムを完全に停止させることなく段階的にテストを実施できるところもよい。

開発環境でのテストやシステム運用前の動作確認に業務でも活用できたらよいなあ。
Apache JMeterも今度使ってみたい。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。