在云上真是無奇不有,昨天偶然間發現在IIS的應用程序池回收設置中,僅僅設置了一下基于虛擬內存限制的回收,就引發了CPU有規律的波動。在這篇博文中,我們將向大家匯報一下云計算之路上的這個小發現。
在之前我們使用阿里云云服務器(虛擬機)遇到一個左右為難的情況:
- 如果開啟虛擬內存頁面交換文件,會造成CPU占用高,在高并發情況下會引發CPU 100%、系統無響應的故障,詳見云計算之路-阿里云上:啟用Windows虛擬內存引發的CPU 100%故障。
- 如果關閉虛擬內存頁面交換文件,在某種因素引起的短時間虛擬內存不夠用的情況下,會造成Windows自動重啟,詳見云計算之路-阿里云上:禁用Windows虛擬內存引發的重啟。
當時通過增加物理內存(8G->16G)臨時解決了問題,但這不是長久之計,不僅誰為這個額外的成本買單是個問題(阿里云的內存性價比本來就不高),而且即使16G內存也不能保證不會出現虛擬內存不夠用的情況。
于是,我們把焦點轉向了如何在8G內存的情況下避開這個問題。我們的應用程序所用的單個w3wp進程在訪問高峰期會消耗2G左右的內存,由于設置了Web Garden使用了2個工作者進程,所以在訪問高峰期總共大約消耗5G左右的內存。這樣可能在瞬間大并發與GC回收的雙重條件下,會出現虛擬內存不夠用的情況。針對這樣的情況,我們采取了兩個措施:
- 取消Web Garden,只用1個w3wp。
- 設置應用程序池回收策略,在w3wp進程消耗的內存達到一定值時,強制進行回收。
應用程序池回收策略設置見下圖:
從上圖可以看出,回收策略就是當w3wp進程消耗的虛擬內存超過6G時,強制回收。
當我們這樣設置后,在Windows性能監視器中發現了一個很奇怪的現象(當時w3wp只占用500M不到的內存),見下圖:
CPU占用過一會兒就跳上去,而且跳動時會造成系統響應速度慢,打開頁面時都能感覺到。
而只要我們一取消應用程序池回收中的這個虛擬內存設置,CPU就立即恢復正常。
只要加上虛擬內存設置,CPU就又開始跳。
你說奇怪不奇怪,如果在阿里云虛擬機中,虛擬內存的確與CPU占用存在某種關聯,但現在僅僅是設置了虛擬內存限制,并沒有觸發這個限制。
我們想到現在,唯一能有點說得通的猜想就是:設置了虛擬內存限制之后,IIS會定期檢查w3wp進程的虛擬內存占用情況,檢查時會調用虛擬內存相關的Win32 API,這個調用最終轉入虛擬機的底層實現(Xen)時出了問題,從而造成CPU波動。
聯想到啟用虛擬頁面交換文件也會造成CPU波動的情況,我們猜想阿里云所用的Xen虛擬機在對Windows虛擬內存的虛擬化實現方面可能存在某種bug。
文章列表