草庐IT

performance - redis (StackExchange.Redis) 发布性能差?

coder 2023-07-18 原文

我正在尝试使用 Redis 发布/订阅在应用程序之间高速传输数据(每秒 25000 条消息)。

我已经测试如下:

拓扑:

1 个发布者、1 个订阅者和 Redis 服务器。所有都托管在同一台电脑上。

电脑硬件:

CPU: Intel(R) Core(TM) I7-4578U CPU@3.00GHz 内存:16.0GB

代码:

Stopwatch sw = new Stopwatch();
sw.Start();
while (_started)
{
    //db.PublishAsync(RawMessagesCapturedMsg.TopicGroupName, redisValue);
    db.Publish(RawMessagesCapturedMsg.TopicGroupName, redisValue);
    totalRedisMsg++;
    if (totalRedisMsg % 10000 == 0)
    {
        Console.WriteLine("totalRedisMsg: {0} @ {1}, time used(ms): {2}",
            totalRedisMsg, DateTime.Now, sw.ElapsedMilliseconds);
    }
}
sw.Stop();

结果:

如结果所示,发布10k条消息大约需要6秒。

我想确认是redis(或者StackExchange.Redis)的实际性能吗?还是我的测试有问题?

更新:

根据接受的答案,我发现原因是我的消息大小太大 (300kB)。

最佳答案

要检查的事情:

  1. CPU 负载是多少?满了吗?否则,您可能会遇到带宽或延迟问题。
  2. 消息的大小是多少?乘以转移 你看到的速率,它是否与你(期望)的带宽相当 有吗?
  3. Redis 实例的 ping 是什么?也许往返需要很多时间。在这种情况下,您可以使用具有多个连接的多个线程来提高吞吐量。

我手头有一个用来回答另一个问题的基准。在 Java(生菜客户端库)中,我有 1 个线程的结果,本地 cpu i5-6400,远程 cpu E5-2603 v4,0.180ms ping 到远程,消息是“你好”。

Benchmark              (address)   Mode  Cnt      Score      Error  Units
LettuceThreads.pooled     socket  thrpt    5  35699.267 ±  706.946  ops/s
LettuceThreads.pooled  localhost  thrpt    5  28130.801 ± 9476.584  ops/s
LettuceThreads.pooled     remote  thrpt    5   3080.115 ±  422.390  ops/s
LettuceThreads.shared     socket  thrpt    5  41717.332 ± 3559.226  ops/s
LettuceThreads.shared  localhost  thrpt    5  31092.925 ± 9894.748  ops/s
LettuceThreads.shared     remote  thrpt    5   3920.260 ±  178.637  ops/s

将它与您拥有的硬件进行比较,也许它会帮助您评估库的性能。请注意,远程性能如何下降 10 倍,即使知道 CPU 慢 2 倍,这也很多。

下面是16个线程。因此,如您所见,尽管有延迟,但更多线程可能至少有助于获得吞吐量。

Benchmark              (address)   Mode  Cnt       Score       Error  Units
LettuceThreads.pooled     socket  thrpt    5  123846.426 ±  2926.807  ops/s
LettuceThreads.pooled  localhost  thrpt    5   83997.678 ± 31410.595  ops/s
LettuceThreads.pooled     remote  thrpt    5   31045.111 ±  2198.065  ops/s
LettuceThreads.shared     socket  thrpt    5  218331.662 ± 17459.352  ops/s
LettuceThreads.shared  localhost  thrpt    5  182296.689 ± 52163.154  ops/s
LettuceThreads.shared     remote  thrpt    5   30803.575 ±  2128.306  ops/s

关于performance - redis (StackExchange.Redis) 发布性能差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50327788/

有关performance - redis (StackExchange.Redis) 发布性能差?的更多相关文章

  1. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  2. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  3. ruby-on-rails - Resque - 类的未定义方法 'perform' - 2

    我目前对后台队列不太满意。我正在尝试让Resque工作。我已经安装了redis和Resquegem。Redis正在运行。一个worker正在运行(rakeresque:workQUEUE=simple)。使用Web界面,我可以看到工作人员正在运行并等待工作。当我运行“rakeget_updates”时,作业已排队但失败了。我已经用defself.perform和defperform试过了。发条.raketask:get_updates=>:environmentdoResque.enqueue(GetUpdates)end类文件(app/workers/get_updates.rb)c

  4. Ruby 的数字方法性能 - 2

    我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0

  5. ruby - Ruby 性能中的计时器 - 2

    我正在寻找一个用ruby​​演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent

  6. ruby-on-rails - 如果条件与 &&,是否有任何性能提升 - 2

    如果用户是所有者,我有一个条件来检查说删除和文章。delete_articleifuser.owner?另一种方式是user.owner?&&delete_article选择它有什么好处还是它只是一种写作风格 最佳答案 性能不太可能成为该声明的问题。第一个要好得多-它更容易阅读。您future的自己和其他将开始编写代码的人会为此感谢您。 关于ruby-on-rails-如果条件与&&,是否有任何性能提升,我们在StackOverflow上找到一个类似的问题:

  7. ruby-on-rails - 获取 ActionController::RoutingError(当尝试使用 AngularJS 将数据发布到 Rails 服务器时,没有路由匹配 [OPTIONS] "/users" - 2

    尝试从我的AngularJS端将数据发布到Rails服务器时出现问题。服务器错误:ActionController::RoutingError(Noroutematches[OPTIONS]"/users"):actionpack(4.1.9)lib/action_dispatch/middleware/debug_exceptions.rb:21:in`call'actionpack(4.1.9)lib/action_dispatch/middleware/show_exceptions.rb:30:in`call'railties(4.1.9)lib/rails/rack/logg

  8. ruby - 如何找到我的 Ruby 应用程序中的性能瓶颈? - 2

    我编写了一个Ruby应用程序,它可以解析来自不同格式html、xml和csv文件的源中的大量数据。我如何找出代码的哪些区域花费的时间最长?有没有关于如何提高Ruby应用程序性能的好资源?或者您是否有任何始终遵循的性能编码标准?例如,你总是用加入你的字符串吗?output=String.newoutput或者你会使用output="#{part_one}#{part_two}\n" 最佳答案 好吧,有一些众所周知的做法,例如字符串连接比“#{value}”慢得多,但是为了找出您的脚本在哪里消耗了大部分时间或比所需时间更多,您需要进行分

  9. iNFTnews | 周杰伦18年前未发布的作品Demo,藏在了区块链技术里 - 2

    当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在

  10. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

随机推荐