在云上真是无奇不有,昨天偶然间发如今IIS的应用程序池回收设置中,仅仅设置了一下基于虚拟内存限制的回收,就引起了CPU有规律的波动。在这篇博文中,咱们将向你们汇报一下云计算之路上的这个小发现。html
在以前咱们使用阿里云云服务器(虚拟机)遇到一个左右为难的状况:服务器
当时经过增长物理内存(8G->16G)临时解决了问题,但这不是长久之计,不只谁为这个额外的成本买单是个问题(阿里云的内存性价比原本就不高),并且即便16G内存也不能保证不会出现虚拟内存不够用的状况。并发
因而,咱们把焦点转向了如何在8G内存的状况下避开这个问题。咱们的应用程序所用的单个w3wp进程在访问高峰期会消耗2G左右的内存,因为设置了Web Garden使用了2个工做者进程,因此在访问高峰期总共大约消耗5G左右的内存。这样可能在瞬间大并发与GC回收的双重条件下,会出现虚拟内存不够用的状况。针对这样的状况,咱们采起了两个措施:高并发
应用程序池回收策略设置见下图:post
从上图能够看出,回收策略就是当w3wp进程消耗的虚拟内存超过6G时,强制回收。性能
当咱们这样设置后,在Windows性能监视器中发现了一个很奇怪的现象(当时w3wp只占用500M不到的内存),见下图:阿里云
CPU占用过一下子就跳上去,并且跳动时会形成系统响应速度慢,打开页面时都能感受到。云计算
而只要咱们一取消应用程序池回收中的这个虚拟内存设置,CPU就当即恢复正常。htm
只要加上虚拟内存设置,CPU就又开始跳。blog
你说奇怪不奇怪,若是在阿里云虚拟机中,虚拟内存的确与CPU占用存在某种关联,但如今仅仅是设置了虚拟内存限制,并无触发这个限制。
咱们想到如今,惟一能有点说得通的猜测就是:设置了虚拟内存限制以后,IIS会按期检查w3wp进程的虚拟内存占用状况,检查时会调用虚拟内存相关的Win32 API,这个调用最终转入虚拟机的底层实现(Xen)时出了问题,从而形成CPU波动。
联想到启用虚拟页面交换文件也会形成CPU波动的状况,咱们猜测阿里云所用的Xen虚拟机在对Windows虚拟内存的虚拟化实现方面可能存在某种bug。