2017-07-07 4 views
0

Ich betreibe eine Website mit IIS8 auf Windows Server 2012. Ich versuche herauszufinden, was eine hohe CPU-Auslastung durch IIS verursacht (häufig 50% oder mehr CPU-Auslastung durch IIS). Der Server erhält über den gesamten Tag ungefähr 40 Anfragen pro Sekunde, aber wahrscheinlich nur 1-2 URLs pro Sekunde, die verarbeitet werden müssen.IIS8 RewriteModule/URLRewrite Extrem langsam

Ich habe Request Tracing aktiviert und festgestellt, dass einige RewriteModule-Anfragen mehr als 100 Sekunden (!) Benötigen. Ich habe Probleme festzustellen, wie dies auf einer Maschine mit mehr als ausreichender Hardware möglich ist. Die exakt gleiche URL-Struktur wird in weniger als einer Sekunde über Apache in Apache verarbeitet.

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

Die begleitende Rewrite-Regel ist:

<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> 

Gibt es etwas in der Art und Weise, dass ich das Spiel URL bin definiert, die verursacht hohe Verarbeitungs

Ein URL Beispiel so sein würde Zeit? Einige der übereinstimmenden URLs enthalten eine große Anzahl an Zeichen, wenn sie viele Eltern/Kind-Kategorien verwenden (bis zu 5, in der Regel 3-4).

Antwort

1

Problem ist definitiv in Ihrem Regexp. Der beste Weg ist, es in verschiedene spezifischere Muster zu teilen.

Wenn es nicht der Fall ist, sollte diese Regel die gleiche Funktionalität halten und schneller arbeiten:

<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> 

ich unnötige \? Kontrollen in Ihrem regulären Ausdruck entfernt, da prasselt innerhalb <match url wird URL ohne Query-String-Überprüfung, so Es ist überflüssig, ? checks in Ihrem Regexp zu haben.

Ich habe auf meinem PC und es funktioniert auf jeden Fall schneller, aber Sie müssen überprüfen, verdoppeln, dass es die gleiche Funktionalität

+0

Ich habe meine Änderungen, die ich am Freitag später gemacht, aber ich akzeptierte Antwort, da sie die gleiche grundlegende Änderung vorschlägt. –

0

ich umfangreiche Tests haben und änderte die Regel auf die folgende bleibt. Dies führte dazu, dass die CPU auf 1% abfiel und die vorherige 100-Sekunden-Abschlusszeit auf ungefähr 50 ms fiel.

Ich verstehe immer noch nicht, wie das möglich ist - das ist ein 4 CPU/8-Kern-Maschine mit 48 GB RAM, und IIS8 brauchte 100 Sekunden, um eine Zeichenfolge mit 70 Zeichen auseinander zu ziehen und mit dem vorherigen Regex zu vergleichen. Wenn das vorherige Beispiel nicht irgendwie eine nahezu unendliche Schleife erzeugt hat, sehe ich nicht, wie es möglicherweise so langsam sein könnte.

Neue Regel:

<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>