我们试图使用ServiceStack包装器在Redis中存储一些大缓冲区(每个8MB)。我们使用“RedisNativeClient.Set(string,byte[]值)”API来设置缓冲区。客户端和服务器都驻留在同一台计算机上。残废的持久性。我们目前正在使用ServiceStack的评估版本。
问题是,我们的性能非常差-大约60 MB/Sec。使用不同的c#包装器("Sider"),我们获得了更好的性能(~400 MB/Sec)。
我在测量中使用的代码:
public void SimpleTest()
{
Stopwatch sw;
long ms1, ms2, interval;
int nBytesHandled = 0;
int nBlockSizeBytes = 8000000;
int nMaxIterations = 5;
byte[] pBuffer = new byte[(int)(nBlockSizeBytes)];
// Create Redis Wrapper
ServiceStack.Redis.RedisNativeClient m_serviceStackRedisClient = new ServiceStack.Redis.RedisNativeClient();
// Clear DB
m_serviceStackRedisClient.FlushAll();
sw = Stopwatch.StartNew();
ms1 = sw.ElapsedMilliseconds;
for (int i = 0; i < nMaxIterations; i++)
{
m_serviceStackRedisClient.Set("eitan" + i.ToString(), pBuffer);
nBytesHandled += nBlockSizeBytes;
}
ms2 = sw.ElapsedMilliseconds;
interval = ms2 - ms1;
// Calculate rate
double dMBPerSEc = nBytesHandled / 1024.0 / 1024.0 / ((double)interval / 1000.0);
Console.WriteLine("Rate {0:N4}", dMBPerSEc);
}问题是什么?
谢谢你,伊坦。
发布于 2015-05-27 16:47:02
ServiceStack.Redis使用可重用缓冲池通过重用字节缓冲区池来减少内存压力。默认byte[]缓冲区的大小为1450字节,以适应以太网MTU数据包大小。虽然这种默认配置对于较小的有效载荷(<100 k)的正常用例是最优的,但对于较大的有效载荷(>1MB+),它看起来会慢一些。
基于此,对ServiceStack.Redis客户端进行了修改,使其不再使用缓冲池处理比500 k更大的有效负载,后者现在可以用RedisConfig.BufferPoolMaxSize进行配置,例如:
RedisConfig.BufferPoolMaxSize = 500000;byte[]缓冲区的默认1450字节大小现在也可以通过以下方式进行配置:
RedisConfig.BufferLength = 1450;这种更改现在提高了ServiceStack.Redis对于较大有效负载的吞吐量性能,如在RedisBenchmarkTests套件中看到的那样,它使用不同有效负载大小的基准测试,例如:
public void Run(string name, int nBlockSizeBytes, Action<int,byte[]> fn)
{
Stopwatch sw;
long ms1, ms2, interval;
int nBytesHandled = 0;
int nMaxIterations = 5;
byte[] pBuffer = new byte[nBlockSizeBytes];
// Create Redis Wrapper
var redis = new RedisNativeClient();
// Clear DB
redis.FlushAll();
sw = Stopwatch.StartNew();
ms1 = sw.ElapsedMilliseconds;
for (int i = 0; i < nMaxIterations; i++)
{
fn(i, pBuffer);
nBytesHandled += nBlockSizeBytes;
}
ms2 = sw.ElapsedMilliseconds;
interval = ms2 - ms1;
// Calculate rate
double dMBPerSEc = nBytesHandled / 1024.0 / 1024.0 / (interval / 1000.0);
Console.WriteLine(name + ": Rate {0:N4}, Total: {1}ms", dMBPerSEc, ms2);
}运行在Ubuntu中的MacBook Pro和redis服务器的结果:
1K结果:
ServiceStack.Redis 1K: Rate 4.7684, Total: 1ms
Sider 1K: Rate 0.4768, Total: 10ms10K结果:
ServiceStack.Redis 10K: Rate 47.6837, Total: 1ms
Sider 10K: Rate 4.3349, Total: 11ms100 000项结果:
ServiceStack.Redis 100K: Rate 26.4910, Total: 18ms
Sider 100K: Rate 20.7321, Total: 23ms1MB结果:
ServiceStack.Redis 1MB: Rate 103.6603, Total: 46ms
Sider 1MB: Rate 70.1231, Total: 68ms8MB结果:
ServiceStack.Redis 8MB: Rate 77.0646, Total: 495ms
Sider 8MB: Rate 84.3960, Total: 452ms其中,对于较小的有效负载,ServiceStack.Redis的性能更快,对于大于8MB的有效负载,性能更接近。
此更改可从v4.0.41+ (即现在的可在MyGet上获得 )获得。
https://stackoverflow.com/questions/30468813
复制相似问题