我们有一个 TPL 数据流管道,其中包含以下块:
- 转换块 A:Http post 请求 - 转换块 B: 数据库 IO - 转换块 C: 一些单位转换数据(基本上是 CPU 密集型任务) - 转换块 D: 发布到 Google PubSub - 操作块 E: Http post 请求
我们试图以最大吞吐量(100% CPU 利用率)运行此管道。我们采取的措施如下:
- 将每个块的
- 转换块 A:Http post 请求 - 转换块 B: 数据库 IO - 转换块 C: 一些单位转换数据(基本上是 CPU 密集型任务) - 转换块 D: 发布到 Google PubSub - 操作块 E: Http post 请求
我们试图以最大吞吐量(100% CPU 利用率)运行此管道。我们采取的措施如下:
- 将每个块的
MaxDegreeOfParallelism 设置为 1000。
- 使用Semaphore
限制最大管道数(目前为 500)。
- 第一个块中的消息通过 Google PubSub 订阅传递(使用 100 作为 maxOutstandingElementCount 的 Flow Control 设置)。
我们的结果如下:
- 在 2.5 小时内处理了 13000 条消息(即每分钟处理 ~87 条消息)。
- 100% CPU 利用率。
- 线程计数 450。
问题来了,这种性能可以提高吗?我们需要在 10 分钟内处理 50,000 条消息(假设在块 B 中不获取任何数据)。或者建议我们应该尝试优化代码的哪些地方。
使用的机器信息如下:
- 处理器: Intel ® Xeon(R) CPU E3-1505M v5 @2.80GHz
- 内存: 32 GB
- 系统类型: 64 位操作系统
Environment.ProcessCount
乘以 4。 - Savaratkar{ Environment.ProcessCount +- 1, Environment.ProcessCount, Environment.ProcessCount * 2, Environment.ProcessCount * 4, Environment.ProcessCount / 2 }
,并进行测量! - VMAtm