いまさらですが、Apache KeepAliveの話
ふとKeepAliveなプロセスが大量の立ち上がっている状況下での負荷試験をしたくなりました。
KeepAlive OFFであれば、1リクエストは1プロセスが対応し、レスポンスを返すと待機プロセスとなり、別のリクエストに割当可能になります。
ONであればレスポンス返却後、タイムアウト値秒だけ待ってから待機プロセスになります。
この待っているときは別のリクエスト(別のTCP接続)に割当不可です。
KeepAlive ON,タイムアウト15秒で 秒間30アクセス場合
最悪450プロセス消費することになり、少ないアクセス数でもプロセスが跳ね上がります。
こういった状況下での負荷試験ってどうやってやるんだろう思ってました。
使っていた負荷試験ツールJmeterはHttpSamperはどうもTCP接続を使い回すみたいで、KeepAlive ONでもプロセス数は伸びない・・・
こちらを参考すると世の中にそんなツールはないらしく
abに自作パッチ当てましたという匠な話でした。
というわけJmeterさわってみました。
まずはソースのダウンロード
eclipse使う人は
こちらとか参考にどうぞ。
org.apache.jmeter.protocol.http.sampler.HTTPSamplerはHttpURLConnectionを使っていてTCP接続時を使い回そうとする。(めんどくさそうだ)
org.apache.jmeter.protocol.http.sampler.HTTPSampler2はHttpClientを使っていてTCP接続の使い回しはPoolを使って別途実装しているので、Poolから常に見つからなかったかのようにしてしてやればよし。
つまり
org.apache.jmeter.protocol.http.sampler.HTTPSampler2の571行目を以下のようにします。
HttpClient httpClient = map.get(hc);
if ( httpClient == null )
{
新規接続
} else{
何もしない
}
↓
HttpClient httpClient = map.get(hc);
if ( true )
{
新規接続
} else{
何もしない
}
尚、最近は、
サービスの主たる処理結果であるHTML要求は接続数稼ぎたいので、KeepAliveOFF
画像等要求は時間を短くしたいので、画像等専用サーバを立てて ONって形が多いみたいです。
facebook 画像:ON HTML:OFF
yahoo 画像:ON HTML:OFF
mixi 画像:ON HTML:OFF
google 画像:ON HTML:ON
amazon 画像:ON HTML:OFF
rakuten 画像:ON HTML:OFF
ふとKeepAliveなプロセスが大量の立ち上がっている状況下での負荷試験をしたくなりました。
KeepAlive OFFであれば、1リクエストは1プロセスが対応し、レスポンスを返すと待機プロセスとなり、別のリクエストに割当可能になります。
ONであればレスポンス返却後、タイムアウト値秒だけ待ってから待機プロセスになります。
この待っているときは別のリクエスト(別のTCP接続)に割当不可です。
KeepAlive ON,タイムアウト15秒で 秒間30アクセス場合
最悪450プロセス消費することになり、少ないアクセス数でもプロセスが跳ね上がります。
こういった状況下での負荷試験ってどうやってやるんだろう思ってました。
使っていた負荷試験ツールJmeterはHttpSamperはどうもTCP接続を使い回すみたいで、KeepAlive ONでもプロセス数は伸びない・・・
こちらを参考すると世の中にそんなツールはないらしく
abに自作パッチ当てましたという匠な話でした。
というわけJmeterさわってみました。
まずはソースのダウンロード
eclipse使う人は
こちらとか参考にどうぞ。
org.apache.jmeter.protocol.http.sampler.HTTPSamplerはHttpURLConnectionを使っていてTCP接続時を使い回そうとする。(めんどくさそうだ)
org.apache.jmeter.protocol.http.sampler.HTTPSampler2はHttpClientを使っていてTCP接続の使い回しはPoolを使って別途実装しているので、Poolから常に見つからなかったかのようにしてしてやればよし。
つまり
org.apache.jmeter.protocol.http.sampler.HTTPSampler2の571行目を以下のようにします。
HttpClient httpClient = map.get(hc);
if ( httpClient == null )
{
新規接続
} else{
何もしない
}
↓
HttpClient httpClient = map.get(hc);
if ( true )
{
新規接続
} else{
何もしない
}
尚、最近は、
サービスの主たる処理結果であるHTML要求は接続数稼ぎたいので、KeepAliveOFF
画像等要求は時間を短くしたいので、画像等専用サーバを立てて ONって形が多いみたいです。
facebook 画像:ON HTML:OFF
yahoo 画像:ON HTML:OFF
mixi 画像:ON HTML:OFF
google 画像:ON HTML:ON
amazon 画像:ON HTML:OFF
rakuten 画像:ON HTML:OFF