首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >servicestack.redis包装器性能差

servicestack.redis包装器性能差
EN

Stack Overflow用户
提问于 2015-05-26 21:00:22
回答 1查看 700关注 0票数 1

我们试图使用ServiceStack包装器在Redis中存储一些大缓冲区(每个8MB)。我们使用“RedisNativeClient.Set(string,byte[]值)”API来设置缓冲区。客户端和服务器都驻留在同一台计算机上。残废的持久性。我们目前正在使用ServiceStack的评估版本。

问题是,我们的性能非常差-大约60 MB/Sec。使用不同的c#包装器("Sider"),我们获得了更好的性能(~400 MB/Sec)。

我在测量中使用的代码:

代码语言:javascript
复制
 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);
        }

问题是什么?

谢谢你,伊坦。

EN

回答 1

Stack Overflow用户

发布于 2015-05-27 16:47:02

ServiceStack.Redis使用可重用缓冲池通过重用字节缓冲区池来减少内存压力。默认byte[]缓冲区的大小为1450字节,以适应以太网MTU数据包大小。虽然这种默认配置对于较小的有效载荷(<100 k)的正常用例是最优的,但对于较大的有效载荷(>1MB+),它看起来会慢一些。

基于此,对ServiceStack.Redis客户端进行了修改,使其不再使用缓冲池处理比500 k更大的有效负载,后者现在可以用RedisConfig.BufferPoolMaxSize进行配置,例如:

代码语言:javascript
复制
RedisConfig.BufferPoolMaxSize = 500000;

byte[]缓冲区的默认1450字节大小现在也可以通过以下方式进行配置:

代码语言:javascript
复制
RedisConfig.BufferLength = 1450;

这种更改现在提高了ServiceStack.Redis对于较大有效负载的吞吐量性能,如在RedisBenchmarkTests套件中看到的那样,它使用不同有效负载大小的基准测试,例如:

代码语言:javascript
复制
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结果:

代码语言:javascript
复制
ServiceStack.Redis 1K: Rate 4.7684, Total: 1ms
Sider 1K: Rate 0.4768, Total: 10ms

10K结果:

代码语言:javascript
复制
ServiceStack.Redis 10K: Rate 47.6837, Total: 1ms
Sider 10K: Rate 4.3349, Total: 11ms

100 000项结果:

代码语言:javascript
复制
ServiceStack.Redis 100K: Rate 26.4910, Total: 18ms
Sider 100K: Rate 20.7321, Total: 23ms

1MB结果:

代码语言:javascript
复制
ServiceStack.Redis 1MB: Rate 103.6603, Total: 46ms
Sider 1MB: Rate 70.1231, Total: 68ms

8MB结果:

代码语言:javascript
复制
ServiceStack.Redis 8MB: Rate 77.0646, Total: 495ms
Sider 8MB: Rate 84.3960, Total: 452ms

其中,对于较小的有效负载,ServiceStack.Redis的性能更快,对于大于8MB的有效负载,性能更接近。

此更改可从v4.0.41+ (即现在的可在MyGet上获得 )获得。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30468813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档