Apache

Apacheの適切な最大同時接続数を算出するワンライナーコマンド

こんにちは、SRE課の栩野です。

今回は、Apacheの適切な最大同時接続数を算出するワンライナーコマンドの小ネタです。

下記AWSのナレッジページに、EC2(Linux)インスタンスでのApache最大同時接続数の適正値算出方法が紹介されているので、この内容を元にワンライナーで算出コマンドを作ってみました。

ちなみにApacheのMPMはprefork想定の内容になっています。

EC2 Linux インスタンスのメモリ不足エラーを防ぐために Apache ウェブサーバーのメモリ割り当てを調整するにはどうすればよいですか?

ワンライナーコマンド

コマンドの詳細説明は一旦後回しにして、実際のコマンドは以下になります。
搭載するメモリ量によって計算式が多少異なるので、メモリ4GB越えパターンと4GB以下パターンの2種類あります。

// メモリ4GB越えパターン
top -b -n 1 -o %MEM |grep httpd |awk '{print $10}' |awk '{av += $1; row += 1} END {printf(av /= row)}' |awk '{printf("%1.3f\n", $1 / 100)}' |awk '{print(0.9 / $1)}'

// メモリ4GB以下パターン
top -b -n 1 -o %MEM |grep httpd |awk '{print $10}' |awk '{av += $1; row += 1} END {printf(av /= row)}' |awk '{printf("%1.3f\n", $1 / 100)}' |awk '{print(0.8 / $1)}'

※古いtopだと-oオプション無くてこけます

コマンドの詳細説明

上記コマンドの詳細について、パイプごとで分割して説明していきます。

  1. top b -n 1 -o %MEM
    topコマンド1回分の実行結果を、メモリ使用率で降順にソートして出力しています。

  2. grep httpd
    Apacheのプロセスのみに絞るようgrepしています。

  3. awk '{print $10}'
    上記の結果から、メモリ使用率の数値だけを切り出して出力しています。

  4. awk '{av += $1; row += 1} END {printf(av /= row)}'
    メモリ使用率の合計値をプロセス数で割り平均値を算出し、その結果を出力しています。

  5. awk '{printf("%1.3f\n", $1 / 100)}'
    平均値がパーセント値になっているので、小数点以下3桁までの数値に直します。

  6. awk '{print(0.9 / $1)}'
    最後に、90%(0.9)の値から、上記の結果を割った値を算出します。
    この90%の値は、搭載メモリが4GBを超える場合は90%、4GB以下の場合は80%(0.8)となります。

実際に実行してみる

実際に検証機にて、上記のコマンドを実行してみます。
搭載メモリ1GBの小スペックなサーバなので、4GB以下パターンのコマンドを実行します。

# top -b -n 1 -o %MEM |grep httpd |awk '{print $10}' |awk '{av += $1; row += 1} END {printf(av /= row)}' |awk '{printf("%1.3f\n", $1 / 100)}' |awk '{print(0.8 / $1)}'
114.286

114.286という算出結果が出ました。何となくぽい結果
実際に設定する際は、後ろの数値は切り捨てて、114に丸めて設定します。

ちなみに、上記コマンドはWEBサービスのみが稼働しているインスタンスでの実行を想定しており、もしMySQL等他のアプリケーションもサーバ上で稼働している場合は、90%(0.9)もしくは80%(0.8)の値から、その他のアプリケーションで利用するメモリの合計使用率を引いてあげます。

例として、メモリ使用率4GB以下のサーバでMySQLが稼働しており、topコマンドの結果で8.3%メモリを使用している場合は、80から8.3を引いた結果が71.7になるので、少数に直して下記のコマンドになります。

top -b -n 1 -o %MEM |grep httpd |awk '{print $10}' |awk '{av += $1; row += 1} END {printf(av /= row)}' |awk '{printf("%1.3f\n", $1 / 100)}' |awk '{print(0.717 / $1)}'

適正値が算出できたら、あとはApacheの設定ファイルにて設定値を調整して再起動します。

MaxClients            114
ServerLimit           114

さいごに

以上がApacheの最大同時接続数の適正値を算出するワンライナーコマンドの紹介でした。
ただし、設置されているコンテンツの種類やサーバの環境によって正確な適正値は異なりますので、参考程度にしていただけたらと思います。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA