我正在开发适用于IIS 7.5-10.0(Windows Server 2008 R2 - Windows Server 2016)的C / C ++应用程序(服务)。它可以添加Web应用程序并将其与应用程序池绑定,也可以按需删除应用程序和池。我们的客户在使用我们的网站时会使用这些Web应用程序。目前,我们在每台Web服务器上的IIS ApplicationHost.config文件中有大约2000-2500个唯一的Web应用程序和相关的应用程序池(大约2.5 MB)。
每个Web服务器提供大约一百个应用程序,CPU工作负载通常在5到15%之间,一切正常,直到添加新应用程序或删除现有应用程序。之后,CPU工作负载会上升到100%并保持高电平几秒钟。此时服务器上的所有内容都被卡住了,我们的客户开始抱怨。
我们正在使用英特尔至强CPU(最多10个内核)和SSD RAID,但在这种情况下,它无助于我们提高性能。在这些时刻,CPU队列大约是其正常情况的5到10倍,因此即使是现代CPU也无法应对它。
我注意到这种行为的原因是IIS在每次更改(添加或删除Web应用程序或池)其配置后通知Web应用程序的所有工作实例(w3wp.exe)。每个正在运行的w3wp.exe实例都在nativerd.dll线程中执行某些操作(我猜他们会在全局通知的反应中重新读取IIS配置)并将CPU加载2-5%。但通常在Web服务器上大约有一百个,因此可以保证冻结几秒钟,因为CPU超载了200-500%。
需要说所有这些发布的网络应用程序都是第三方软件,因此我没有他们的源代码,我无法改变它们。我只是在写一个服务应用程序。
是否可以禁用这些w3wp.exe进程的通知? 这些过程与添加了一个或多个Web应用程序或池的事实无关。它们是孤立的,毕竟不会相互影响。
在这种情况下,你能告诉我什么吗?
也许有一些优化ApplicationHost.config大小或重新组织其结构的方法?
提前致谢并抱歉我的英语。