我正在开发一个与 IIS 7.5-10.0(Windows Server 2008 R2 - Windows Server 2016)配合使用的 C/C++ 应用程序(服务)。它可以添加Web应用程序并将其与应用程序池绑定或按需删除应用程序和池。我们的客户在使用我们的网站时会使用这些网络应用程序。目前,每个 Web 服务器上的 IIS ApplicationHost.config 文件(大约 2.5 MB)中大约有 2000-2500 个独特的 Web 应用程序和关联的应用程序池。
每个网络服务器为大约一百个应用程序提供服务,CPU 工作负载通常在 5% 到 15% 之间,一切正常,直到添加新应用程序或删除现有应用程序为止。此后,CPU 工作负载跃升到 100%,并保持高水平几秒钟。此时服务器上的所有内容都被卡住了,我们的客户开始抱怨。
我们使用Intel Xeon CPU(最多10核)和SSD RAID,但在这种情况下它无助于我们提高性能。此时 CPU 队列大约是正常情况的 5 到 10 倍,因此即使是现代 CPU 也无法应对。
我注意到这种行为的原因是,每次更改(添加或删除 Web 应用程序或池)其配置后,IIS 都会通知 Web 应用程序(w3wp.exe)的所有工作实例。每个工作的 w3wp.exe 实例都会在 nativerd.dll 线程内执行某些操作(我猜它们会重新读取 IIS 配置以响应全局通知)并加载 CPU 2-5%。但通常一个Web服务器上有大约一百个,所以冻结几秒钟是肯定的,因为CPU过载了200-500%。
需要说的是,所有这些发布的网络应用程序都是第三方软件,所以我没有它们的源代码,我无法更改它们。我只是在写一个服务应用程序。
是否可以禁用对 w3wp.exe 进程的这些通知? 这些过程与添加了一个 Web 应用程序或池这一事实无关。他们是孤立的,毕竟不会互相影响。
在这种情况下你能给我一些建议吗?
也许有一些方法可以优化ApplicationHost.config的大小或重新组织其结构?
提前致谢,抱歉我的英语不好。
这么长时间没有回复,可能现在已经排序了,但对于阅读本文的其他人来说,请尝试在每次写入应用程序主机文件之间添加延迟。
在 IIS 中进行任何影响 ApplicationHost.config 的配置更改后,我们遇到了同样的问题,即 IIS 应用程序池的 CPU 使用率激增。我们运行的应用程序池不到一百个,但我们的 ApplicationHost.config 文件超过 3MB,我们发现可以通过手动删除不再在服务器上运行的旧应用程序中剩余的配置元素来显着缩小文件。现在文件大小为 200KB,ApplicationHost.config 更改对 CPU 的影响可以忽略不计。
理论上,如果可能的话,通过将配置从 ApplicationHost.config 移至 web.config 文件中应该可以获得类似的效果。