用于服务网络连接的英特尔TBB任务 - 良好的模型
Intel TBB tasks for serving network connections - good model?
我正在开发网络产品的后端,该产品服务于十几个客户端(N
= 10-100)。每个连接都需要通过SSH进行2个定期任务,心跳和遥测的下载,每个任务都在H
Hz上。前端也有不同类型的额外事件。从每个任务的本质上讲,在每个连接的插座上都有select
调用中等待的一个坚实的部分,这使OS在等待响应时经常在线程之间切换以服务于其他客户端。
在我的初始实现中,我每连接创建3个线程(心跳,遥测,额外),每个连接都在单个条件变量上等待,每次在工作时间中有要做的事情时都会戳。工作时间充满了上述周期性事件,并使用了定时器和前端的命令。
我在这里有几个问题。
-
将工作线程池方法切换到Intel TBB任务是一个好主意吗?如果是这样,我需要对线程的哪个值初始化
tbb::task_scheduler_init
? -
在当前方法中,有300个线程在有条件变量上等待,即每秒
signal
EDN * H * 3
次,它可能会成为可伸缩性的瓶颈(尤其是在调用signal
的侧面)。是否有更好的方法可以让每个任务醒来一个工人? -
如何在tbb中实现的工人线程唤醒?
感谢您的建议!
很难说切换到TBB是否是一种很好的方法。您的性能要求是什么?当前实施的绩效编号是多少?如果当前的解决方案足够好,那么它可能不值得切换。
如果您想比较两者(当前的Impl vs vs tbb)以了解哪个提供了更好的性能,那么您可以为每个实现做一个所谓的"示踪子弹"(源于务实的程序员)并比较结果。用更简单的术语,进行每个缩减的原型并比较结果。
正如本答案中提到的那样,尝试改进性能而没有具体的证据表明您要改变的东西将有所改善。
除了所有这些外,您还可以考虑将线程数量的数量置于CPU内核数(也许是每个核心1或1.5个线程)的某种函数的线程池,这些线程将从常见的任务中取下任务工作标题。将有3种类型的任务:心跳,遥测,额外。这应该减少使用大量线程时上下文切换造成的负面影响。
- QTableView:endMoveRows在模型中重置水平页眉大小
- 将IBM Rhapsody模型集成到VS 2019中
- 旋转模型矩阵时的形状失真
- 有没有任务栏API可以立即应用注册表更改
- 成员函数调用和C++对象模型
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 打印 ONNXRUNTIME::图形没有模型
- 如何创建线程序列以按照启动顺序执行任务?
- C++内存模型和位字段的最大序列
- C++一个线程如何正确通信其任务已完成?
- 在线程之间拆分任务总是值得的吗?
- 递归求和任务的错误答案
- 使用SIR模型的疾病爆发模拟
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 如何在 ECS 模型中组织实体?
- C++ 任务流库入门
- 用于服务网络连接的英特尔TBB任务 - 良好的模型
- 工厂处理器模型中的任务所有权
- UWP/WinRT:如何在模型中的异步操作完成后执行UI任务