2009-07-15 10 views
3

Ich habe eine Caching-Schnittstelle und memchanged Provider für unsere Website mit Enyim implementiert. Funktioniert gut in Tests, bis wir Test zu laden, wo es die CPU von w3wp.exe auf fast 100% erhöht. Wir haben eine Konfigurationseigenschaft, um den Caching-Provider zurück zu dotnet's API zu schalten und die CPU geht auf 5-7% zurück. Hat jemand Ähnliches erlebt?Enyim Memcached Provider CPU-Spike

Antwort

4

Jedes Mal, wenn Sie etwas in Memcached über Enyim speichern, führt die .NET-Laufzeit eine binäre Serialisierung für das gespeicherte Objekt aus. Und Deserialisierung beim Abrufen. Für einige Typen (string, byte [] und einige mehr) implementiert enyim eine spezifischere und leichtere Serialisierung, aber die meisten Typen werden vom Standard BinaryFormatter serialisiert. Dies ist prozessorintensiv.

Es tut besonders weh, wenn Ihr Code in den In-Memory-Cache in ASP.NET geschrieben wird. Sie werden wahrscheinlich Code haben, der denkt, dass das Holen von etwas aus dem Cache frei ist. Sie können es aus dem Cache wieder und wieder und wieder abrufen. Wir hatten vergleichbare Probleme, als wir zu memcached wechselten. Wenn Sie ein Profiling durchführen, werden Sie wahrscheinlich feststellen, dass Sie viele Lesevorgänge aus dem Cache ausführen.

Unsere Erfahrungen mit dem enyim-Kunden waren sehr positiv. Wir führen memcached in einer ASP.NET-Serverfarm auf etwa 10 Knoten und es ist sehr stabil. Für einige Arten von Daten (auf die sehr oft zugegriffen wird) bevorzugen wir das In-Memory In-Prozess-Caching von ASP.NET.

+0

Können Sie mir bitte erklären, was ein memchanged Anbieter ist? Ich dachte Memcached war nur im Speicher, keine Serialisierung auf Platte. Vielen Dank! – Jacko

+1

Korrekt, memcached ist vollständig im Speicher. Wenn Sie jedoch .NET-Objekte über das Netzwerk an Ihren Memcached-Server senden, müssen Sie Ihre In-Memory-Präsentation in eine Drahtdarstellung konvertieren. Serialisierung ist nicht immer auf Platte, es bedeutet, Ihre Objekte (ein Graph) in eine serielle Präsentation (d. H. Eine Sequenz von Bytes) umzuwandeln. Oh, und wo ich sagte "Wir bevorzugen das In-Memory-Caching", hätte ich sagen sollen: "Wir bevorzugen das In-Process-Caching" –

+0

Wie verwalten Sie die Lebensdauer des Memcached-Clients? Hast du ein Singleton für die Anwendung? Rufen Sie Disponse darauf an? Ich jage ein Problem nach, das meiner Ansicht nach mit meiner unkorrekten Handhabung des Objektlebenszyklus des Kunden und der Suche nach Best Practices zu tun hat. Vielen Dank! – kdawg

0

Stellen Sie sicher, dass Sie auch Ihren Serialisierungs- und Deserialisierungscode auf ordnungsgemäße Entsorgung des Objekts oder Streams überprüfen.

Ich hatte die gleiche w3p.exe Spiking zu 99% Symptome, und dachte sicher, es war ein Enyim/Membase-Treiber Bug, aber es war nicht. Es war bei uns, und es war, weil wir() des Memory nach Deserialisieren jedes JSON-Objekt in unserer JSON Helfer Klasse zu Entsorgen vergessen zu:

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; 
    } 
+2

Die Anweisung 'using' ruft Dispose für Sie auf (und der gesamte Code für den Stream wird gut eingerückt). http://msdn.microsoft.com/en-us/library/yh598w02.aspx – Webveloper