套接字发送(.)线程的最佳数量

Optimal number of socket send(..) threads

本文关键字:最佳 线程 套接字      更新时间:2023-10-16

如果我有 N 个套接字的数组,并且我需要以尽可能高的速度向每个套接字发送 (..( 数据,那么执行此操作的最佳线程数是多少?操作系统是 linux。

例如,如果我有 C 物理内核,应该是 C 线程中的每一个执行 send(..(?会高效吗?换句话说,我的问题 linux 内核如何处理 send(..( 系统调用以及如何在内核中调度提供给它的数据。我记得从 BSD 套接字文档中读到,实际上所有套接字的 send(..( 系统调用都将数据放入由一个线程处理的队列中,因此代码:

thread1 -> send(sock1, ..)
..
threadN -> send(sockN, ..)

或多或少等同于(减去在发送到内核之前通过发送处理数据的时间(由网络性能与代码

thread -> send(sock1, ..), ..., send(sockN, ..)

但那是来自 1990 年中期的书,我认为现代操作系统应该在那之后发生变化。

如果你所有的线程都应该做完全相同的事情,我会说最好的办法是用迭代器在单个线程中做这件事。

您可以做的是定义一个链表来保存节点,该节点将保存每个套接字的文件描述符。在每个小时结束时,循环访问列表并发送包。 您可以在类中定义数据发送函数,以便减少主函数中的工作量。

我相信这比维护 100 个处于睡眠状态的线程要好。

还要确保使用睡眠功能而不是任何类型的毫秒检查。这肯定会降低代码的 CPU 使用率,同时保持性能不变。