如果我有N个套接字的数组,并且我需要以最高的速度向每个套接字发送(..)数据,那么最佳线程数是多少?操作系统是linux。
E.g。如果我有C物理核心,它们应该是C线程,每个都执行send(..)吗?会有效吗?换句话说,我的问题是如何由linux内核处理send(..)系统调用,以及如何在内核中调度提供给它的数据。我记得从BSD套接字文档中读取,实际上所有套接字的send(..)系统调用都将数据放入由一个线程处理的队列中,所以代码:
thread1 -> send(sock1, ..)
..
threadN -> send(sockN, ..)
通过网络性能代码将或多或少等效(减去发送到内核之前通过发送处理数据的时间)
thread -> send(sock1, ..), ..., send(sockN, ..)
但那是1990年中期的那本书,我认为现代操作系统应该在那之后改变。
答案 0 :(得分:1)
如果所有的线程都应该做同样的事情,我会说最好的办法就是在一个带有迭代器的线程中做那件事。
您可以做的是定义一个链接列表来保存节点,这些节点将保存每个套接字的文件描述符。在每小时结束时,遍历列表并发送包。 您可以在类中定义数据发送功能,以便在主函数中减少您的工作。
我认为这比保持100个正在睡觉的线程更好。
还要确保使用睡眠功能而不是任何一种毫秒检查。这肯定会降低代码的CPU使用率,同时保持性能不变。