我使用enyim为我们的网站实现了缓存接口和memchanged提供程序。在我们进行负载测试之前,它非常适合测试,它将w3wp.exe的CPU压缩到接近100%。我们有一个配置属性可以将缓存提供程序切换回dotnet的API,CPU可以恢复到5-7%。有没有人经历过类似的事情?
答案 0 :(得分:4)
每次通过enyim在memcached中存储内容时,.NET运行时将对存储的对象执行二进制序列化。并在检索时进行反序列化。对于某些类型(string,byte []和更多),enyim实现了更具体和轻量级的序列化,但大多数类型由标准BinaryFormatter序列化。这是处理器密集型的。
当您的代码写入ASP.NET中的内存缓存时,尤其会受到伤害。您可能会有一些代码认为从缓存中获取内容是免费的。您可以一次又一次地从缓存中获取它。当我们切换到memcached时,我们遇到了类似的问题。如果你进行一些分析,你可能会发现你从缓存中疯狂地进行了许多读取。
我们对enyim客户的经验非常积极。我们在大约10个节点上的ASP.NET服务器场中运行memcached,它非常稳定。对于某些形式的数据(经常访问),我们更喜欢ASP.NET中的 in-memory 进程内缓存。
答案 1 :(得分:0)
请务必检查序列化和反序列化代码以获取正确的对象或流处理。
我有完全相同的w3p.exe达到99%的症状,并且认为它确实是一个Enyim / Membase驱动程序错误,但事实并非如此。这是我们的,因为我们在反序列化JSON帮助程序类中的每个JSON对象后忘记了MemoryStream的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;
}