2011-01-10 45 views
4

我們使用appfabric作爲包含面向客戶的網站和管理網站的NHibernate asp.net應用程序的第二級緩存。它們都連接到相同的緩存,所以當管理員更新某些內容時,面向客戶的網站會更新。AppFabric緩存的本地緩存不適用於我們...我們做錯了什麼?

它似乎工作正常 - 我們在單獨的服務器上有一個CacheCLuster,一切正常,但我們希望啓用localcache以獲得更好的性能,但是,dosnt似乎正在工作。

我們已經啓用,像這樣...

bool UseLocalCache = 
    int LocalCacheObjectCount = int.MaxValue; 
    TimeSpan LocalCacheDefaultTimeout = TimeSpan.FromMinutes(3); 
    DataCacheLocalCacheInvalidationPolicy LocalCacheInvalidationPolicy = DataCacheLocalCacheInvalidationPolicy.TimeoutBased; 

     if (UseLocalCache) 
     { 
      configuration.LocalCacheProperties = 
       new DataCacheLocalCacheProperties(
        LocalCacheObjectCount, 
        LocalCacheDefaultTimeout, 
        LocalCacheInvalidationPolicy 
        ); 

      // configuration.NotificationProperties = new DataCacheNotificationProperties(500, TimeSpan.FromSeconds(300)); 
     } 

起初我們試圖使用超時失效政策(3mins)和我們的應用程序感覺就像是運行速度更快。但是,我們注意到,如果我們在管理網站中更改了某些內容,則會在活動網站中立即更新。由於我們使用超時而不是通知,這表明本地緩存並未被查詢(或者是,但總是缺失)。 。

的cache.GetType()Name返回 「LocalCache」 - 這樣的工廠做了一個本地緩存。

在我的開發環境(從vs2008本地運行的asp.net應用程序,在獨立的w2k8機器上運行的緩存集羣)中運行PS中的「Get-Cache-Statistics MyCache」,顯示了一些Request Counts。但是,在生產環境中,請求計數增加顯着。

我們試着按照這裏的方法來選擇緩存cliebt-server的流量...... http://blogs.msdn.com/b/appfabriccat/archive/2010/09/20/appfabric-cache-peeking-into-client-amp-server-wcf-communication.aspx但是日誌文件只有最初的頭文件 - 也就是說沒有任何的loggin。

我在SO或Google找不到任何東西。

我們做錯了什麼?我們是否安裝了AppFabric?我們是通過WebPlatform Installer安裝的 - 我想? (注意:運行ASp.net的IIS框不在yhe集羣中 - 它只是客戶端)。

任何洞察力很好地收到!

回答

0

您是否嘗試過使用nhibernate分析器? http://nhprof.com/

也有這樣的: http://mdcadmintool.codeplex.com/

這是管理和查看緩存的好方法。

這兩者都可能有助於調試問題。

+0

對不起,我應該說,是的,我們已經使用NH教授和NHProf是說,一切都是一個緩存命中 - 但我們有porblme是它似乎打到緩存集羣而不是本地緩存。 mdcaadmintool並沒有幫助我們,因爲它只會告訴我們緩存集羣中發生了什麼 - 而不是本地緩存,這將是我們的asp.net w3wp.exe的InProc。謝謝你的想法。 – Olly 2011-01-10 19:10:04

1

其中DataCache方法用於從緩存中讀取?無論本地緩存是否配置,DataCache中的幾個方法總是會對服務器造成衝擊。如果你想要利用本地緩存,你幾乎必須確保你只使用Get

這是我用AppFabric Caching最大的一點。他們沒有向你解釋任何這一點,所以當你開始依賴本地緩存時,你開始陷入這些小陷阱,因爲你不認爲你付出了與服務交談的懲罰,通過線路傳輸數據和反序列化對象,但你是。

最糟糕的是,我可以理解必須與服務通話以確保本地緩存代表最新數據。我甚至可以理解,將數據傳回,以便不進行多次呼叫。但我不明白的是,即使本地緩存中的實例經過驗證仍然是從緩存中返回的當前版本,但它們仍然將對象從線路反序列化而不是僅僅返回已經存在於內存中的實例。如果你的物體很大/很複雜,這會傷害很多。

1

後幾天的尋找到爲什麼我們得到這麼多的本地緩存未命中,我們終於解決了這天:

  1. 沒有與AppFabric的1.1版被固定在CU4本地緩存中的錯誤,看到http://support2.microsoft.com/kb/2800726/en-us
  2. 確保您的應用程序使用的Microsoft.ApplicationServer.Caching.Client.dll也已更新。我們在機器上安裝了CU4,但在我們的應用程序中從NuGet軟件包中獲得了沒有CU4的Client.dll。在我們的例子中,一個簡單的NuGet包更新使一切正常。

安裝CU4並確保Client.dll也被更新之後,由於本地緩存命中率的增加,我們減少了對AppFabric主機的讀取量。好極了!