gpt4 book ai didi

.net - TPL 数据流管道的吞吐量

转载 作者:行者123 更新时间:2023-12-04 21:03:07 28 4
gpt4 key购买 nike

我们有一个 TPL 数据流管道,其中包含以下 block :

  • 变换 block A:Http post call
  • 转换 block B:数据库 IO
  • Transform Block C:一些单位转换数据(基本上是CPU密集型任务)
  • 转换 block D:发布到 Google PubSub
  • Action block E:Http post call

  • 我们正在尝试以最大吞吐量(100% CPU 利用率)运行此管道。我们做过的事情:

    • 设置 MaxDegreeOfParallelism到 1000 到每个 block

    • 二手 Semaphore限制管道的最大数量(现在是 500)

    • 发送到管道中第一个 block 的消息由 Google PubSub 订阅传递(流控制设置 = 100 作为 maxOutstandingElementCount)

    我们的结果:

     在 2.5 小时内处理 13000 条消息(即 1 分钟内处理约 87 条消息)

     100% CPU 利用率

     450个线程数

    现在的问题是,这种性能可以提高吗?我们要求 10 分钟内有 50,000 条消息(考虑到没有从 Block B 的数据库中获取数据)。或者建议我们应该尝试优化代码的地方。

    使用机器:

    o 处理器:Intel ® Xeon(R) CPU E3-1505M v5 @2.80GHz

    o 内存:32 GB

    o 系统类型:64 位操作系统

    最佳答案

    无论 CPU 负载如何,您都应该针对最大吞吐量进行优化,尤其是因为您主要从事与 IO 相关的工作(http 调用、文件访问等),而 CPU 的使用并不多。
    并行度应该是您可用的 CPU 内核的一个因素。服务器不能同时物理处理比核心数量更多的东西,因此使用大量线程将无济于事。它只是为相同的计算带宽创造了更多的开销,实际上会减慢一切。
    基于 CPU 的工作的并行性应限制在内核数量上,以便每个内核都在满负荷工作但不会过载。基于 IO 的工作是异步的,并等待 IO 完成,因此它可以使用更大的并行度同时调度更多任务。
    一个好的开始是(# of cores) x 4对于 IO block 和 (# of cores)对于 CPU 密集型 block 。这意味着如果您有 4 个 CPU 内核可用,则将 4 个用于 CPU block ,将 16 个用于 IO block 。试试这个并扩大 IO block 的并行度,直到达到最大吞吐量。
    另请注意,可以根据您的要求调整 Dataflow 管道中的各种设置(例如确保严格排序)以获得更高的性能。如果配置正确,TPL Dataflow 可以轻松地处理 100k+ 个项目/秒。

    关于.net - TPL 数据流管道的吞吐量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46095814/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com