文章出處

在云上真是無奇不有,昨天偶然間發現在IIS的應用程序池回收設置中,僅僅設置了一下基于虛擬內存限制的回收,就引發了CPU有規律的波動。在這篇博文中,我們將向大家匯報一下云計算之路上的這個小發現。

在之前我們使用阿里云云服務器(虛擬機)遇到一個左右為難的情況:

當時通過增加物理內存(8G->16G)臨時解決了問題,但這不是長久之計,不僅誰為這個額外的成本買單是個問題(阿里云的內存性價比本來就不高),而且即使16G內存也不能保證不會出現虛擬內存不夠用的情況。

于是,我們把焦點轉向了如何在8G內存的情況下避開這個問題。我們的應用程序所用的單個w3wp進程在訪問高峰期會消耗2G左右的內存,由于設置了Web Garden使用了2個工作者進程,所以在訪問高峰期總共大約消耗5G左右的內存。這樣可能在瞬間大并發與GC回收的雙重條件下,會出現虛擬內存不夠用的情況。針對這樣的情況,我們采取了兩個措施:

  1. 取消Web Garden,只用1個w3wp。
  2. 設置應用程序池回收策略,在w3wp進程消耗的內存達到一定值時,強制進行回收。

應用程序池回收策略設置見下圖:

從上圖可以看出,回收策略就是當w3wp進程消耗的虛擬內存超過6G時,強制回收。

當我們這樣設置后,在Windows性能監視器中發現了一個很奇怪的現象(當時w3wp只占用500M不到的內存),見下圖:

CPU占用過一會兒就跳上去,而且跳動時會造成系統響應速度慢,打開頁面時都能感覺到。

而只要我們一取消應用程序池回收中的這個虛擬內存設置,CPU就立即恢復正常。

只要加上虛擬內存設置,CPU就又開始跳。

你說奇怪不奇怪,如果在阿里云虛擬機中,虛擬內存的確與CPU占用存在某種關聯,但現在僅僅是設置了虛擬內存限制,并沒有觸發這個限制。

我們想到現在,唯一能有點說得通的猜想就是:設置了虛擬內存限制之后,IIS會定期檢查w3wp進程的虛擬內存占用情況,檢查時會調用虛擬內存相關的Win32 API,這個調用最終轉入虛擬機的底層實現(Xen)時出了問題,從而造成CPU波動。

聯想到啟用虛擬頁面交換文件也會造成CPU波動的情況,我們猜想阿里云所用的Xen虛擬機在對Windows虛擬內存的虛擬化實現方面可能存在某種bug。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()