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
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.
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;
}
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
- 1. Wo finde ich Dokumentation für enyim und memcached?
- 2. memcached Überwachung
- 3. memcached Speicherverbrauch
- 4. Memcached seltsames Problem!
- 5. Wie memcached von codeigniter
- 6. MemCached-Client mit Delphi
- 7. spymemcached (Java Memcached Client)
- 8. Mehrere Caches in Memcached
- 9. memcached Caches Anfrage?
- 10. Ansätze für Memcached-Sitzungen
- 11. Sonderbare Memcached Problem
- 12. Lua memcached binäres Protokoll
- 13. Memcached chunk limit
- 14. pecl memcached unter Windows
- 15. memcached Authentifizierungs-Remoteverbindungen
- 16. Wie SQLAlchemy Memcached verwenden?
- 17. Bilder in Memcached zwischenspeichern
- 18. Unable Aktion Provider zu werfen Aktion Provider
- 19. AngularJS Provider Abhängigkeitsinjektion - mit $ Login Provider
- 20. Einstellung Memcached Konstanten in PHP
- 21. play framework 2.0 support memcached?
- 22. Memcached vs SQL Server-Cache
- 23. Doctrine Result Caching mit Memcached
- 24. Vorteile von mehreren Memcached-Instanzen
- 25. Racksitzungsschlüssel zu lang für Memcached
- 26. memcached-session-manager auf AWS
- 27. Kann Memcached komplexe Objekte speichern?
- 28. Installation von Memcache und Memcached
- 29. als Objektspeicher in Rails Memcached
- 30. PHP Memcached Sitzungen Replikat Problem
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
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" –
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