我在Windows Server 2012上运行带有IIS8的网站。我试图确定IIS导致高CPU使用率的原因(IIS通常占用CPU的50%或更多)。服务器全天每秒接收大约40个请求,但每秒只需要1-2个URL需要处理。
我启用了“请求跟踪”,发现一些RewriteModule请求需要100多秒(!)才能完成。我很难确定在硬件足够多的机器上如何实现这一点。在不到一秒的时间内,通过Apache上的mod_rewrite处理完全相同的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使用许多父/子类别(最多5个,通常为3-4个),则它们包含大量字符。
答案 0 :(得分:1)
问题肯定在你的正则表达式中。最好的方法是尝试将其拆分为不同的更具体的模式。
如果不是这样,则此规则应保持相同的功能并更快地运行:
options = optimoptions('lsqnonlin', 'FunctionTolerance', 1e-10, 'FiniteDifferenceStepSize',1e-6)
我在正则表达式中删除了不必要的<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>
个检查,因为\?
内的模式正在检查没有查询字符串的网址,因此,在正则表达式中进行<match url
检查是多余的。
我检查了我的电脑,它的工作速度肯定更快,但您需要仔细检查它是否保持相同的功能
答案 1 :(得分:0)
我做了大量测试并将规则更改为以下内容。这导致CPU下降到1%,之前的100秒完成时间下降到大约50ms。
我仍然不明白这是怎么回事 - 这是一台带有48GB内存的4 CPU / 8核机器,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>