微软的坑:Url重写竟然会引起IIS内核模式缓存不工作

摘要:
谁能想到URL重写会影响http。sys处于内核模式?谁在平时关注http如果最近“黑1秒”的问题没有解决,估计十年后就找不到sys的缓存了。禁用kernelmodecache的URL重写规则后,使用浏览器访问URL,然后Ctrl+F5刷新两次,然后运行命令netshhttpshowcachestate:从上图中可以看出,http.sys已成功缓存请求的内容。目前,我只想到两种方法:1.放弃IISURLRewriteModule,但没有找到更好的选择。

万万没有想到!当初为了解决使用负载均衡时记录客户端IP地址的问题,在IIS URL Rewrite Module中增加了一条URL重写规则(详见迁入阿里云后遇到的Request.UserHostAddress记录IP地址问题):3

微软的坑:Url重写竟然会引起IIS内核模式缓存不工作第1张微软的坑:Url重写竟然会引起IIS内核模式缓存不工作第2张
<rewrite>
    <allowedServerVariables>
        <add name="REMOTE_ADDR" />
    </allowedServerVariables>
    <globalRules>
        <rule name="HTTP_X_Forwarded_For-to-REMOTE_ADDR" enabled="true">
            <match url=".*" />
            <serverVariables>
                <set name="REMOTE_ADDR" value="{HTTP_X_Forwarded_For}" />
            </serverVariables>
            <action type="None" />
            <conditions>
                <add input="{HTTP_X_Forwarded_For}" pattern="^$" negate="true" />
            </conditions>
        </rule>
    </globalRules>
</rewrite>
View Code

这竟然造成http.sys的内核模式缓存(kernel mode caching)被IIS URL Rewrite Module禁用,禁用理由是重写规则中用到了影响缓存安全的服务器变量(cache unsafe server variable)——{HTTP_X_forwarded_For}。

URL重写竟然能影响到处于内核模式的http.sys,谁能想到?微软想到了,而且做到了!

当知道这个真相后,真的很恼火!平时谁会注意http.sys的缓存是否正常工作,如果不是因为最近在解决“黑色1秒”问题,估计再过十年也不会发现。

那我们是怎么发现的呢?借助于Windows性能监视器(Performance Monitor)。

针对http.sys kernel mode cache的性能监视器

在添加了HTTP Service的三个监测项目——TotalUrisCached, UriCachedHits, UriCacheMisses之后发现,TotalUrisCached与UriCachedHits值一直是0,而UriCacheMisses的值巨大无比,一看就知道kernel mode caching出问题了。

后来发现一个命令可以更轻松地进行检测:

netsh http show cachestate

微软的坑:Url重写竟然会引起IIS内核模式缓存不工作第4张

如果出现上图的画面,说明kernel mode caching没干活。

当我们禁用了让kernel mode caching罢工的URL重写规则后,用浏览器访问一个网址,然后Ctrl+F5刷新2次(10秒内被访问2次就会被http.sys缓存),然后运行命令netsh http show cachestate:

netsh http show cachestate

从上图中可以看出请求的内容被http.sys成功缓存了。

那内核模式缓存失效会带来什么影响呢?

谁都知道这会影响了网站的处理性能,而对我们来说还有一个重大影响——在“黑色1秒”问题的排查过程中,它让我们作出了错误的判断,以为“黑色1秒”期间http.sys进程卡住了(依据缓存没工作),详见“黑色30秒”走了,“黑色1秒”来了,真相也许大白了。现在看来,如果解决了http.sys缓存问题,“黑色1秒”期间IIS日志中很可能有缓存输出的记录,如果真是这样,那引发“黑色1秒”的环节可能在WAS(Windows Process Activation Service),这将把我们带向不同的问题排查方向。

那如何解决这个问题呢?

目前只想到两个方式:

1. 弃用IIS URL Rewrite Module,但目前未找到更好的选择。

2. 让阿里云修改SLB的转发规则,将http headers中的REMOTE_ADDR修改为真实的客户端IP。

3. 修改代码,不通过Request.UserHostAddress获取IP。

【最终选择的解决方法】

写了两个扩展方法:

微软的坑:Url重写竟然会引起IIS内核模式缓存不工作第1张微软的坑:Url重写竟然会引起IIS内核模式缓存不工作第7张
namespace System.Web
{
    public static class HttpRequestExtension
    {
        //针对WebForm
        public static string GetUserIp(this HttpRequest request)
        {
            var ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if(string.IsNullOrEmpty(ip))
            {
                ip = request.UserHostAddress;
            }
            return ip;
        }

        //针对MVC
        public static string GetUserIp(this HttpRequestBase request)
        {
            var ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (string.IsNullOrEmpty(ip))
            {
                ip = request.UserHostAddress;
            }
            return ip;
        }
    }
}
View Code

然后将代码中所有调用Request.UserHostAddress的地方改为调用扩展方法Request.GetUserIp()。

【参考资料】

URL Rewrite Module 1.1 for IIS 7

Working with HTTP.SYS or Kernel Mode Caching in Internet Information Services 6.0

URL Rewrite Module Configuration Reference

微软的坑:Url重写竟然会引起IIS内核模式缓存不工作第8张

免责声明:文章转载自《微软的坑:Url重写竟然会引起IIS内核模式缓存不工作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mdadm 创建md 删除md步骤来电科技:基于Flink+Hologres的实时数仓演进之路下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【WPF学习】第五十二章 动画性能

  通常,为用户界面应用动画只不过是创建并配置正确的动画和故事板对象。但在其他情况下,特别是同时发生多个动画时,可能需要更加关注性能。特定的效果更可能导致这些问题——例如,那些涉及视频、大位图以及多层透明等的效果通常需要占用更多CPU开销。如果不谨慎实现这类效果,运行它们使可能造成明显抖动,或者会从其他同时运行的应用程序抢占CPU时间。   幸运的是,WP...

04-浏览器缓存机制 / 前端标签中设置不缓存 / CDN缓存

先来个大体总结: 一、概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: 感谢https://www.cnblogs.com/chengxs/p/10396066.html的好文 1、HTTP请求(Request)报文...

转:IIS 应用程序池 内存 自动回收

原文地址:https://www.cnblogs.com/guohu/p/5209209.html IIS可以设置定时自动回收,默认回收是1740分钟,也就是29小时。IIS自动回收相当于服务器IIS重启,应用程序池内存清空,所有数据被清除,相当于IIS重启,在度量快速开发平台服务器端,为了减小数据库负担,内存中暂存了很多信息,不适合频繁的回收,因为回收会...

二、NOSQL之Memcached缓存服务实战精讲第一部

1.Memcached是一套数据缓存系统或软件。 用于在动态应用系统中缓存数据库的数据,减少数据库的访问压力,达到提升网站系统性能的目的;Memcached在企业应用场景中一般是用来作为数据库的cache服务使用;(但不是专门干这个,还可以干别的,主要是干这个,知道就好) 1)linux有特性,系统内存没有用完,利用这些内存就会缓存起来,所以剩余的内存为...

【Java虚拟机4】Java内存模型(硬件层面的并发优化基础知识--缓存一致性问题)

前言 今天学习了Java内存模型第一课的视频,讲了硬件层面的知识,还是和大学时一样,醍醐灌顶。老师讲得太好了。 Java内存模型,感觉以前学得比较抽象。很繁杂,抽象。 这次试着系统一点跟着2个老师学习一下。 学习Java内存模型目的: 1.高并发情况下,java内存模型是怎么提供支持的? 2.一个对象创建后,在内存中的布局? 为什么在聊JVM内存模型、ha...

Robots.txt 协议—百度之星

题目描述 搜 索引擎是靠 Web Robot (又称 Spider )来收集互联网上浩如烟海的网页的。 Spider 就像一个旅行家一般,不知疲倦地奔波于万维网的空间,将遇到的页面收集下来供搜索引擎索引。对于一个网站的管理员来说,如果希望搜索引擎只收录自己指定的 内容,或者指定某些不希望搜索引擎访问的内容,该如何去做呢?他需要的就是 Robots Excl...