云计算之路-阿里云上:“黑色10秒钟”的新进展
什么是“黑色10秒钟”?
“黑色10秒钟”是一种故障特征,每次发生时都持续10秒钟。在这10秒钟期间,IIS只接收请求,不响应请求,等10秒钟一过,这些未响应的请求会一起响应。如果你在“黑色10秒钟”的第1秒访问网站,要等10秒钟之后才能看到页面。
“黑色10秒钟”发生的场景
问题发生于安装了Windows Server 2008 R2的阿里云云服务器上(宿主机是Linux/Xen),在Linux云服务器上不会出现(因为阿里云在Linux虚机的内核中禁用了CONFIG_PARAVIRT_SPINLOCKS)。
引发“黑色10秒钟”的原因
由于Linux内核Xen部分对SpinLock处理的bug(Linux 3.2.0-39.62已修复该bug,详见Linux内核bug引起的“黑色10秒钟”),只要在虚拟机中用到了SpinLock(http://en.wikipedia.org/wiki/Spinlock),并最终使用了xen的pv spinlock(pv=paravirtualization, http://en.wikipedia.org/wiki/Paravirtualization),进行了hypercall调用,就有引发“黑色10秒钟”的可能。
而在IIS 7.5的WAS(Windows Process Activation Service)中的确用到了SpinLock,可以从WAS进程的堆栈信息中知晓(见下图)。
“黑色10秒钟”的解决思路
1. 从虚拟机层面
对于Linux虚拟机,可以通过修改Linux内核(禁用CONFIG_PARAVIRT_SPINLOCKS)或者升级至Linux 3.2.0-39.62解决问题。
对于Windows虚拟机(Windows Server 2008 R2),除了微软,没有人可以让WAS不使用SpinLock,唯一可以寄希望的就是微软在Windows Server 2012的IIS8中放弃了SpinLock的使用(胡思乱想一下,也许微软的Hyper-V也面临过这个虚拟化的问题)。
2. 从宿主机层面
升级宿主机的Linux/Xen。
“黑色10秒钟”的解决尝试
昨天晚上,我们将虚拟机中的Windows换成了Windows Server 2012进行测试,惊喜地发现:
不见SpinLock的身影!在Windows Server 2012的IIS8中,WAS没有使用SpinLock。也就是说在Windows Server 2012中不会出现“黑色10秒钟”。
我们对“黑色10秒钟”问题的看法
“黑色10秒钟”问题不仅仅是阿里云的问题,不仅仅是Linux/Xen的问题,也不仅仅是Windows的问题,它是虚拟化技术发展中要解决的一个问题。虚拟化技术是云计算发展的基石,所以我们觉得花时间学习它、研究它、思考它、分享它是有价值的。而且开发人员也越来越离不开它,因为未来的大多数程序都是运行在虚拟机中的。