こんにちは、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オプション無くてこけます
コマンドの詳細説明
上記コマンドの詳細について、パイプごとで分割して説明していきます。
-
top b -n 1 -o %MEM
topコマンド1回分の実行結果を、メモリ使用率で降順にソートして出力しています。 -
grep httpd
Apacheのプロセスのみに絞るようgrepしています。 -
awk '{print $10}'
上記の結果から、メモリ使用率の数値だけを切り出して出力しています。 -
awk '{av += $1; row += 1} END {printf(av /= row)}'
メモリ使用率の合計値をプロセス数で割り平均値を算出し、その結果を出力しています。 -
awk '{printf("%1.3f\n", $1 / 100)}'
平均値がパーセント値になっているので、小数点以下3桁までの数値に直します。 -
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の最大同時接続数の適正値を算出するワンライナーコマンドの紹介でした。
ただし、設置されているコンテンツの種類やサーバの環境によって正確な適正値は異なりますので、参考程度にしていただけたらと思います。
運用サービス課 課長
運用・監視の設計から導入まで、運用サービスを担当してます。
運用監視やセキュリティ関連の話題に興味があるので、そのあたりのブログを多めで投稿していきたいと思ってます。
LINK
クラウドベリージャム:プロフィールページ