2017-07-07 8 views
0

Je cours un site Web avec IIS8 sur Windows Server 2012. J'essaie de déterminer ce qui cause une utilisation élevée du processeur par IIS (fréquemment 50% ou plus d'utilisation du processeur par IIS). Le serveur reçoit environ 40 demandes par seconde au cours de la journée, mais probablement seulement 1-2 URL par seconde qui nécessitent un traitement.IIS8 RewriteModule/URLRewrite Extrêmement lent

J'ai activé Request Tracing et j'ai constaté que certaines requêtes RewriteModule prenaient plus de 100 secondes (!) À terminer. J'ai du mal à déterminer comment cela est possible sur une machine avec un matériel plus que suffisant. La même structure d'URL est traitée via mod_rewrite sur Apache en moins d'une seconde.

Un exemple d'URL serait comme ceci:

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

La règle de réécriture d'accompagnement est:

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

Y at-il quelque chose dans la façon dont je définir l'URL de correspondance qui est à l'origine de traitement élevée temps? Certaines des URL correspondantes contiennent un nombre élevé de caractères si elles utilisent plusieurs catégories parent/enfant (jusqu'à 5, généralement 3-4).

Répondre

1

Le problème est définitivement dans votre expression rationnelle. Le meilleur moyen est de le diviser en différents modèles plus spécifiques.

Si ce n'est pas le cas, cette règle devrait garder les mêmes fonctionnalités et travailler plus vite:

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

J'ai supprimé \? inutiles contrôles dans votre regexp, car boniment l'intérieur <match url vérifie URL sans chaîne de requête, de sorte , il est redondant d'avoir ? contrôles dans votre expression rationnelle.

j'ai vérifié sur mon PC et il fonctionne nettement plus rapide, mais vous devez vérifier qu'il reste la même fonctionnalité

+0

j'ai posté mes changements que j'ai fait plus tard le vendredi, mais je l'ai accepté votre réponse, car elle suggère même un changement fondamental. –

0

Je l'ai fait de nombreux tests et changé la règle à ce qui suit. Cela a entraîné une baisse de la CPU à 1% et le temps de finalisation précédent de 100 secondes à environ 50 ms. Je ne comprends toujours pas comment cela est possible - c'est une machine 4 CPU/8-core avec 48 Go de RAM, et IIS8 a mis 100 secondes pour séparer une chaîne de 70 caractères et la comparer à la regex précédente. À moins que l'exemple précédent n'ait créé une boucle quasi infinie, je ne vois pas comment cela pourrait être aussi lent.

Nouvelle règle:

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