【調査・準備】Nginxのパフォーマンス計測に使うツールの調査とApacheBenchでの計測方法について

現在のプロジェクトでNginxのパフォーマンスチューニングを行っています。

パフォーマンスチューニングをするにあたり、**「どうやって行う？」「ツールは使う？」** などを調査したので、それらの情報を本記事でまとめておきたいと思います。

## 【結論】最終的に使うことにしたツールと計測方法
ツール：ApachBench
計測方法：`ab -n 100 -c 10 -s 100 http://localhost:{$ポート番号}/`

## 【調査】どのツールでパフォーマンス計測を行うか？
参考にした書籍「ハイパフォーマンスHTTPサーバ Nginx入門」では以下のツールが紹介されていました。

> 1.httperf：OSS。LinuxOS専用。
2.Autobench：httperfのPerlラッパー。テストのメカニズム、詳細レポート作成方法を改良してある。
3.OpenWeLoad：上記2つよりも小規模のOSSロードテストツール。Windows、Linuxで動作可能。
\>参照：P111 3.4.2 パフォーマンステスト

原理としてはどれも **大量のリクエストを処理した際の結果を見ている** です。
また、ツールによって動作できるOSが異なるため **計測したい環境のOSが何を使用しているか** 確認が必要です。


## 【環境構築】ローカルで実行環境を構築してみる
各ツールを使う場合、**環境構築にどの程度時間が必要なのか**を知るために実行環境を構築してみました。

#### 1. Autobench：途中で断念
1. 公式サイトからインストール
    Autobench：http://www.xenoclast.org/autobench
1. `make`コマンドを使用するため、make.exeをインストール
    http://gnuwin32.sourceforge.net/packages/make.htm
1. サイト参考にmakeコマンドを実行
    →Windowsでは使用できないコマンド（別途ソフトのインストールが必要）があり、断念。

>▼autobench/インストール
http://kimoota.wiki.fc2.com/wiki/autobench%2F%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
▼Nginxのパフォーマンステストの方法とチューニングのメモ
https://raichel.hatenablog.com/entry/2015/11/23/Nginx%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E6%96%B9%E6%B3%95%E3%81%A8%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0


#### 2. OpenWebLoad：セキュリティが不安なので使用しない
sourceforge（様々なソフトウェアをインストールできるサイト）でインストールが可能でした。しかし、**「2002年以降更新が入っていないこと」「sourceforge自体のセキュリティが不安」「Githubにも元ソースが無いため、どれだけ使用されているのか判断できない」** 等々の理由から断念しました。

>▼公式
http://openwebload.sourceforge.net/#install
▼sourceforge OpenWebLoad
https://sourceforge.net/projects/openwebload/files/
▼オープンソースソフトウェアの老舗サイト「SourceForge」はいかにして堕ちていったのか
https://gigazine.net/news/20150722-sourceforge/

また、sourceforgeの後継であるOSDNにもダウンロードページがありましたが、こちらの更新も2002年以降されていないようです。

>▼OSDN OpenWebLoad
https://ja.osdn.net/projects/sfnet_openwebload/

#### 3. ApacheBench：決定！
書籍で紹介されていたツールが全滅だったため、改めて他ツールが無いか調査。 **ApacheBenchはNginxの計測でも使える** という情報があったため、今回はApacheBenchを使うことにしました。

1. Windows版のApache HTTP Serverをインストールする
    https://www.apachehaus.com/cgi-bin/download.plx#MODULES24VS17
1. この中の「Apache 2.4.x OpenSSL 1.1.1 VS17 Apache 2.4.54 x64」をインストール。
公式サイトにある通り、SHAで改ざんされていないことをチェックする。
1. 安全が確認できた後にzipを解凍。binフォルダーにexeファイルがある。
1.  環境変数のPathにbinディレクトリまでのパスを追加
1. `ab -V`コマンドを実行して実行可能であることを確認

>▼手順参考
https://eatsmart.hatenablog.com/entry/2019/08/26/063826
▼Apache Haus Downloads
https://www.apachehaus.com/cgi-bin/download.plx#MODULES24VS17


## 【計測】ローカルの開発環境で測定してみる
最終的には以下のコマンドで実行しました。

``` powershell
ab -n 100 -c 10 -s 100 http://localhost:7780/
```

**▼最終的な設定値**
-n：リクエスト数：100
-c：一度に実行する複数のリクエストの数：20
-s：ソケットがタイムアウトするまで待機する最大秒数：100

実行する際のオプションについては公式サイトに記載されています。
>ab - Apache HTTP server benchmarking tool
https://httpd.apache.org/docs/2.4/programs/ab.html

#### 以下、試行錯誤の記録

###### 1.とりあえず実行してみる

``` powershell
# httpでアクセス
> ab -n 100 -c 10 http://localhost/
apr_socket_connect(): 対象のコンピューターによって拒否されたため、接続できませんでした。   (730061)

# httpsでアクセス
> ab -n 100 -c 10 https://localhost/
SSL not compiled in; no https support
```

###### 2.接続方法を確認
以下のサイトを参考に接続方法を確認したところ「TCP」で接続しようとしていることが分かりました。

>▼abコマンド（ApacheBench）がapr_socket_connect(): 対象のコンピューターによって拒否されたため、接続できませんでした。 (730061)
https://ah-2.com/g1/2015/07/30/ab_connect_error.html

###### 3.ポートを指定して計測
「TCP接続の場合はポートの指定が必要」という内容を過去に見た覚えがあるので、ポート指定をして再度実行してみると結果が出力されました。

``` powershell
> ab -n 100 -c 10 http://localhost:7780/
This is ApacheBench, Version 2.3 <$Revision: 1901567 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done


Server Software:        nginx/1.21.3
Server Hostname:        localhost
Server Port:            7780
...(以下略)
```

###### 4.オプション「一度に実行する複数のリクエストの数」を決める
>-c：一度に実行する複数のリクエストの数

`-c`は、**本番環境の同時接続数**を参考に決めることにしました。
確認したところ、平均20ほどだったため、`-c 20`とします。

試しに計測を実行すると、以下の結果が出力されました。

```powershell
Benchmarking localhost (be patient)...apr_pollset_poll: The timeout specified has expired (70007)
```
原因はタイムアウトでした。

###### 5.タイムアウトまでの時間を設定する
>-s：ソケットがタイムアウトするまで待機する最大秒数

ローカル環境の動作が重いことを考慮して、少し長めの`-s 100`を設定しました。

## さいごに
今回はNnginxのパフォーマンス計測に使うツールの調査とApacheBenchでの計測方法についてまとめました。
測定する際のパラメータやオプションを決めれば、後は「計測→設定値変更→計測...」の繰り返しです。
早速やっていきたいと思います。

それでは！

##### 参考サイト
>【初心者向け】ApacheBench入門
https://dev.classmethod.jp/articles/ab-tutorial/