在雲上真是無奇不有,昨天偶然間發如今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。