パフォーマンスの測定について

iRuleには同じ処理を実行するにもさまざまな書き方があります。たとえば、複数の条件の中からある条件を満たした場合に、特定のアクションを実行するiRuleです。この処理を実行するには、if, elseif, elseの連携でもできますし、switchコマンドも使えます。また、Data Groupのmatchclassコマンドでも、同様の処理が可能です。

では、それぞれの処理にはどれぐらいのCPU負荷がかかるのでしょうか?処理のパフォーマンスを測定できるのかという質問は、これまでにもよくいただいています。
実はあるiRuleコマンドで、ルールの実行でかかったCPUのクロックサイクルが計れます。つまりルール処理でCPUが何回利用されたかというデータが取れます。このコマンドを使って全体のCPU使用率を推定できるので、非常に便利です。

「Timing on」コマンド

このコマンドは「timing on」というものです。使い方は2つあります。ルール全体のCPUクロックサイクルを計るには、全てのイベントの前に「timing on」のコマンドを入力します。

timing on
when HTTP_REQUEST {
  # リクエスト処理  
}
when HTTP_RESPONSE {
  # レスポンス処理
}

また、特定のイベントのみを計るには、イベント宣言に「timing on」を入れます:

when HTTP_REQUEST timing on {   
   # リクエスト処理  
}  
when HTTP_RESPONSE {
   # レスポンス処理
}
上記の使い方では、HTTP_REQUESTが利用するCPUクロックサイクルが計れますが、HTTP_RESPONSEは計れません。

「クロックサイクルの表示」

「timing on」をiRuleに入力したら、次は実際に検証を行い、iRule使用時のクロックサイクルを表示させます。これはBIG-IPのCLIでしかできませんので、CLIにログインしてください。ログイン後、下記のbigpipeコマンドで表示できます。

bigpipe rule <ルール名> show all
上記コマンドの表示は下記のとおりです。

RULE rule_name
 +-> HTTP_REQUEST 729 total 0 fail 0 abort
 | Cycles (min, avg, max) = (3693, 3959, 53936)
 +-> HTTP_RESPONSE 729 total 0 fail 0 abort
 | Cycles (min, avg, max) = (4299, 5239, 66929)
上記のように、表示はイベント別になります。最小、平均、最大のクロックサイクルの順で3つの数字が表示されます。基本的には平均数字を使いますので、より正確な結果を出すためにはルール検証で同じトラフィックを複数回実施してデータを確認することを推奨します。クロックサイクルの最大値は平均の10倍以上となるのが通常です。ルールの一回目の実行ではスクリプトをコンパイルする処理が入りますが、この処理結果が最大値に入っていることがその理由です。

最大値を現実的な数字にするために、ルールの一回目の実行をしてから、統計データをリセットできます。次のコマンドが利用できます。

bigpipe rule <ルール名> stats reset
しかしOSのスケジューラによる処理オーバヘッドもありますので、上記のようにリセットを行っても最大値はいつも平均値に比べて多少大きい数字になります。

CPU使用率の推定

では次にこのデータを使用して、DevCentralにあるExcelのスプレッドシートでCPU使用率を推定します。Excelのスプレッドシートは下記からダウンロードできます。

http://devcentral.f5.com/downloads/techtips/F5DevCentral_iRulesRuntimeCalculator.zip

シートに各イベントの最小、平均、最大のクロックサイクルを入力すると、ルール実行でかかる1リクエストあたりの処理時間(遅延)、CPU使用率、毎秒処理可能なリクエストを推定します。なおこの数字はBIG-IPの各プラットフォームに搭載されているCPUの処理能力に依存しますので、シートのCycles/Secを入力する必要もあります。この数字は次のコマンドをBIG-IPのCLIで実行すると調べられます。

cat /proc/cpuinfo | grep "cpu MHz"
上記の数字はMHz単位となっていますので、表示された数字に1,000,000を掛けることでシートに入力する数字が計算できます。例えばBIG-IP 1500で実行した場合、表示した数字が「2500.132」となりますので、シートに「2,500,132,000」を入力します。

最後に

上記のコマンドやツールによって、より早いルールを作成できますので、是非お試しください。なお、timingコマンド自体は、多少のCPU負荷がかかりますので、運用する前にコマンドをiRuleから削除するのをお忘れなく!

※F5ネットワークスジャパンでは、サンプルコードについて検証を実施していますが、お客様の使用環境における動作を保証するものではありません。実際の使用にあたっては、必ず事前にテストを実施することを推奨します。