バックエンドエンジニアをしていると、Webサイトの負荷テストをしたくなることは珍しくありません。負荷テストを行うと、サーバーのアーキテクチャがどれくらい安定しているかを把握でき、ある程度はプログラムの性能も確認できます。代表的なツールには ab や JMeter などがあります。手作業で負荷テストをする人はいないと思います(笑)。今日は、機能が充実していながらシンプルな HTTP 負荷テストツール Siege を紹介します。コマンドラインから実行でき、Webサイトや API の負荷への耐性を測定できます。ただし、性能テストには多くの側面があるので、負荷テストに通ったからといって完璧だとは限らないことにも注意してください!

Siege のインストールはとても簡単です。Mac なら brew、Ubuntu なら apt-get を使えます。
brew install siege
よくある要件は、N 個のスレッドを同時に動かし、それぞれのスレッドが M 回アクセスするというものです。さらに、アクセスごとに一定の秒数の間隔を空けることもできます。このようにしてサーバーやWebサイトの負荷耐性をテストできます。次のコマンドを参考にしてください。

siege -c 100 -r 200 -d1 “http://google.com.tw”

  • -c 100 は、100 個のスレッドが同時に実行されることを意味します
  • -r 200 は、各スレッドが 200 回リクエストを送ることを意味します
  • -d1 は、各スレッドのリクエストを 1 秒間隔で送ることを意味します。-d だけを指定すると、間隔はランダムになります。

上のように、Siege は実行の経過と、各 HTTP リクエストに対するレスポンスを表示します。ここでは、レスポンス時間が遅くなる傾向がないか、404 や 500 などの異常が発生していないかを確認できます。サーバーのメモリや CPU などの変化も確認できます。ただし、レスポンス時間の低下(やその他の異常)が必ずしもプログラムの問題とは限らない点に注意してください。このように頻繁にアクセスすると、ファイアウォールがリクエストをブロックしたり、IP アドレスを直接遮断したりすることも多いため、原因は自分で判断する必要があります。

テスト対象によっては、GET 以外の HTTP メソッド(POST、PUT など)を使う必要があります。たとえば API の場合です。Siege のドキュメントには書かれていませんが、実は簡単に指定できます。

siege -c 10 -r 10 "http://yahoo.com.tw/ POST"
siege -c 10 -r 10 "http://yahoo.com.tw/ DELETE"

URL の後ろにメソッドを付けるだけです。ただし、URL の末尾は必ずスラッシュで終わらせてください。たとえば、次のような書き方はエラーになります。

siege -c 10 -r "http://yahoo.com.tw POST"

また、バックエンドに処理させるためにデータを送る必要がある場合もあります。その場合は、HTTP メソッドの後ろに直接書くことができます。たとえば次のようになります。

siege -c 10 -r 'http://yahoo.com.tw POST {"name": "karl"}'

GET の場合は、URL にそのまま付けることができます。たとえば次のようになります。

siege -c 10 -r 'http://yahoo.com.tw?name=karl'

テストが終わると、次のような結果が参考として表示されます。テストに要した合計時間、成功(失敗)したトランザクションの数、平均レスポンス時間などが含まれます。

Transactions: 200 hits
Availability: 100.00 %
Elapsed time: 9.57 secs
Data transferred: 0.00 MB
Response time: 0.42 secs
Transaction rate: 20.90 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 8.74
Successful transactions: 200
Failed transactions: 0
Longest transaction: 1.10
Shortest transaction: 0.27