2009-07-15 50 views
3

我使用enyim爲我們的網站實現了一個緩存界面和memffered供應商。在測試中效果很好,直到我們加載測試,它將w3wp.exe的CPU高達100%。我們有一個配置屬性來將緩存提供者切換回到dotnet的API,並且CPU回到5-7%。有沒有人經歷類似的?Enyim memcached供應商CPU秒殺

回答

4

每次通過enyim將某些內容存儲在memcached中時,.NET運行時將對存儲的對象執行二進制序列化。並且在你檢索時進行反序列化。對於某些類型(字符串,字節[]等),enyim實現了更具體和更輕量級的序列化,但大多數類型都是由標準BinaryFormatter序列化的。這是處理器密集型的。

當您的代碼寫入ASP.NET中的內存緩存時,它尤其痛苦。您可能會有代碼認爲從緩存獲取內容是免費的。您可能會一次又一次地從緩存中獲取它。當我們切換到memcached時,我們遇到了類似的問題。如果你做一些分析,你可能會發現你從緩存中進行了很多次讀取。

我們對enyim客戶的經驗非常積極。我們在大約10個節點上的ASP.NET服務器場中運行memcached,並且它非常穩定。對於某些形式的數據(經常訪問),我們更喜歡 內存 ASP.NET的進程內緩存。

+0

能否請你解釋memchanged供應商是什麼?我認爲memcached只在內存中,沒有序列化到磁盤。謝謝! – Jacko 2010-08-08 13:52:19

+1

正確,memcached完全在內存中。但是,當您通過網絡將.NET對象發送到您的memcached服務器時,您必須將您的內存中的演示文稿轉換爲有線演示文稿。序列化並不總是磁盤,它意味着將您的對象(圖)轉換爲串行表示(即字節序列)。噢,在我說「我們更喜歡內存緩存」的地方,我應該說「我們更喜歡進程內緩存」 – 2010-08-13 12:38:28

0

一定要檢查您的序列化和反序列化代碼以進行適當的對象或流處理。

我有完全相同的w3p.exe刺激到99%的症狀,並且確信它是Enyim/Membase驅動程序錯誤,但事實並非如此。這是我們的,這是因爲我們忘記了的MemoryStream在我們的JSON助手類反序列化JSON的每個對象後的Dispose():

public static T DeserializeToObject<T>(this string json) 
    { 
     byte[] byteArray = Encoding.ASCII.GetBytes(json); 
     MemoryStream stream = new MemoryStream(byteArray); 

     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 
     T returnObject = (T)serializer.ReadObject(stream); 
     stream.Close(); 
     stream.Dispose(); // we forgot this line! 
     return returnObject; 
    }