用于服务网络连接的英特尔TBB任务 - 良好的模型

Intel TBB tasks for serving network connections - good model?

本文关键字:任务 模型 TBB 英特尔 服务 服务网 网络 连接 用于      更新时间:2023-10-16

我正在开发网络产品的后端,该产品服务于十几个客户端(N = 10-100)。每个连接都需要通过SSH进行2个定期任务,心跳和遥测的下载,每个任务都在H Hz上。前端也有不同类型的额外事件。从每个任务的本质上讲,在每个连接的插座上都有select调用中等待的一个坚实的部分,这使OS在等待响应时经常在线程之间切换以服务于其他客户端。

在我的初始实现中,我每连接创建3个线程(心跳,遥测,额外),每个连接都在单个条件变量上等待,每次在工作时间中有要做的事情时都会戳。工作时间充满了上述周期性事件,并使用了定时器和前端的命令。

我在这里有几个问题。

  1. 将工作线程池方法切换到Intel TBB任务是一个好主意吗?如果是这样,我需要对线程的哪个值初始化tbb::task_scheduler_init

  2. 在当前方法中,有300个线程在有条件变量上等待,即每秒signal ED N * H * 3次,它可能会成为可伸缩性的瓶颈(尤其是在调用signal的侧面)。是否有更好的方法可以让每个任务醒来一个工人?

  3. 如何在tbb中实现的工人线程唤醒?

感谢您的建议!

很难说切换到TBB是否是一种很好的方法。您的性能要求是什么?当前实施的绩效编号是多少?如果当前的解决方案足够好,那么它可能不值得切换。

如果您想比较两者(当前的Impl vs vs tbb)以了解哪个提供了更好的性能,那么您可以为每个实现做一个所谓的"示踪子弹"(源于务实的程序员)并比较结果。用更简单的术语,进行每个缩减的原型并比较结果。

正如本答案中提到的那样,尝试改进性能而没有具体的证据表明您要改变的东西将有所改善。

除了所有这些外,您还可以考虑将线程数量的数量置于CPU内核数(也许是每个核心1或1.5个线程)的某种函数的线程池,这些线程将从常见的任务中取下任务工作标题。将有3种类型的任务:心跳,遥测,额外。这应该减少使用大量线程时上下文切换造成的负面影响。