什么是“黑色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的問題,它是虛擬化技術發展中要解決的一個問題。虛擬化技術是雲計算發展的基石,所以我們覺得花時間學習它、研究它、思考它、分享它是有價值的。而且開發人員也越來越離不開它,因為未來的大多數程序都是運行在虛擬機中的。