2017-07-07 8 views
0

Windows Server 2012でIIS8を使用しているWebサイトを実行しています。IISでCPU使用率が高い原因(IISで50%以上のCPU使用率が高いことが多い)を特定しようとしています。サーバーは1日に約40件のリクエストを毎秒受け取りますが、処理を必要とする1秒あたり1-2個のURLしかないでしょう。IIS8 RewriteModule/URLRewrite非常に遅い

私は要求トレースを有効にして、完了するためにいくつかのRewriteModule要求が100秒(!)以上かかることがわかりました。十分なハードウェア以上のマシンでこれがどのように可能かを判断するのが難しいです。まったく同じURL構造は、Apache上のmod_rewrite経由で1秒未満で処理されます。

例のURLは次のようになります:

http://<domain-name>/Product/<Parent-Category>/<Child-Category1>/<Child-Category2>/<Child-Category3>/<Product-Name> 

添付書き換えルールがある:私は試合のURLを定義しています方法で何かが

<rule name="Rule" stopProcessing="true"> 
     <match url="^Product/([^/\?]+)/?([^/\?]+)?/?([^/\?]+)?/?([^/\?]+)?/?([^/\?]+)?/?([^/\?]+)?/?[\?]?(.+)?$"/> 
     <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/> 
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/> 
     </conditions> 
     <action type="Rewrite" url="/Product/index.php?a={R:1}&amp;b={R:2}&amp;c={R:3}&amp;d={R:4}&amp;e={R:5}&amp;f={R:6}&amp;{R:7}" appendQueryString="true"/> 
    </rule> 

があることが、高い処理を引き起こしています時間?一致するURLの中には、多くの親/子カテゴリ(最大5、通常は3-4)を使用する場合に、高い数の文字が含まれているものがあります。

答えて

1

問題はあなたの正規表現には間違いありません。最良の方法は、それを別のより具体的なパターンに分割しようとすることです。

それがない場合、このルールは同じ機能を維持し、より高速に動作するはずです:

<rule name="Rule" stopProcessing="true"> 
    <match url="^Product/([^/]+)/?([^/]+)?/?([^/]+)?/?([^/]+)?/?([^/]+)?/?([^/]+)?"/> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/> 
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/> 
    </conditions> 
    <action type="Rewrite" url="/Product/index.php?a={R:1}&amp;b={R:2}&amp;c={R:3}&amp;d={R:4}&amp;e={R:5}&amp;f={R:6}" appendQueryString="true"/> 
</rule> 

<match url内部のパタパタはそう、クエリ文字列なしでURLをチェックしているので、私は、あなたの正規表現に不要な\?チェックを削除正規表現で?個のチェックを行うのは冗長です。

私は自分のPC上でチェックし、それは間違いなく速く動作しますが、あなたはそれが私が広範なテストを行なったし、次のようにルールを変更し、同じ機能

+0

私は金曜日に、後に作られた私の変更を掲示し、それは同じ根本的な変化を示唆しているように私は、あなたの答えを受け入れました。 –

0

ままであることを再確認する必要があります。その結果、CPUは1%に低下し、前の100秒の完了時間は約50msになりました。これは可能です - これは48GBのRAMを備えた4 CPU/8コアマシンで、IIS8は70文字の文字列を分離してそれを前の正規表現と比較するのに100秒かかりました。前の例で何とか無限ループに近づけていない限り、どのように遅くなるかはわかりません。

新ルール:

<rule name="Rule" stopProcessing="true"> 
     <match url="^Product/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)?[/]?(.+)?$"/> 
     <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/> 
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/> 
     </conditions> 
     <action type="Rewrite" url="/Product/index.php?a={R:1}&amp;b={R:2}&amp;c={R:3}&amp;d={R:4}&amp;e={R:5}&amp;f={R:6}&amp;{R:7}" appendQueryString="true"/> 
    </rule>