我在Windows 2012上运行一个带有IIS8的网站。我正在试图确定什么是IIS造成的高CPU使用率(通常是IIS占用了50%或更多CPU )。服务器一天内每秒接收大约40个请求,但可能每秒只有1-2个URL需要处理。
我启用了请求跟踪,发现一些RewriteModule请求花费了超过100秒(!)来完成。我很难确定这在一台拥有超过足够硬件的机器上是如何可能的。在不到一秒钟的时间内,通过Apache上的mod_rewrite处理完全相同的URL结构。
一个示例URL如下所示:
http://<domain-name>/Product/<Parent-Category>/<Child-Category1>/<Child-Category2>/<Child-Category3>/<Product-Name>伴随的重写规则是:
<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}&b={R:2}&c={R:3}&d={R:4}&e={R:5}&f={R:6}&{R:7}" appendQueryString="true"/>
</rule>在定义匹配URL的方式中,是否存在导致处理时间较长的问题?一些匹配的urls包含大量字符,如果它们使用许多父/子类别(最多5个,通常为3-4)。
发布于 2017-07-09 18:27:59
问题肯定在你的正则表达式中。最好的方法是尝试将其分割成不同的更具体的模式。
如果不是这样的话,这个规则应该保持相同的功能,并且工作得更快:
<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}&b={R:2}&c={R:3}&d={R:4}&e={R:5}&f={R:6}" appendQueryString="true"/>
</rule>我在您的regexp中删除了不必要的\?检查,因为<match url中的patter是在没有查询字符串的情况下检查URL,所以在regexp中进行?检查是多余的。
我检查了我的个人电脑,它的工作速度肯定更快,但您需要再次检查它是否保持相同的功能。
发布于 2017-07-10 13:18:39
我进行了广泛的测试,并将规则更改为以下内容。这导致CPU下降到1%,而之前的100秒钟完成时间下降到大约50 in。
我仍然不明白这是怎么可能的--这是一台4 CPU/8核机器,内存为48 it,IIS8花了100秒钟将一个70个字符串拆开,并将其与以前的正则表达式进行比较。除非前面的例子以某种方式创建了一个近乎无限的循环,否则我看不出它怎么会那么慢。
新规则:
<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}&b={R:2}&c={R:3}&d={R:4}&e={R:5}&f={R:6}&{R:7}" appendQueryString="true"/>
</rule>https://stackoverflow.com/questions/44972191
复制相似问题