数百个空闲线程的影响

ams*_*mso 8 c++ linux performance multithreading pthreads

我正在考虑使用可能数百个线程来实现通过网络管理设备的任务.

这是一个在带有Linux内核的powerpc处理器上运行的C++应用程序.

在每个任务执行同步以将数据从设备复制到任务的初始阶段之后,任务变为空闲,并且仅在收到警报时唤醒,或者需要更改某些数据(配置),这在启动后很少见相.一旦所有任务都达到"空闲"阶段,我预计每秒只需要唤醒几次.

所以,我主要担心的是,如果我有数百个线程,它们会在闲置后对系统产生负面影响吗?

谢谢.AMSO

编辑:
我正在根据我得到的答案更新问题.多谢你们.因此,似乎拥有大量线程空闲(IO阻塞,等待,休眠等)本身在响应性方面不会对系统产生影响.当然,他们会为每个线程的堆栈和TLS数据花费额外的钱,但只要我们在该东西上投入更多内存(使其更多),这是可以的.

但是,其他问题必须考虑在内.由于需要等待队列或其他类似资源,等待100个线程可能会增加内核的内存使用量.还有一个延迟问题,看起来不确定.要检查每个解决方案的响应能力和内存使用情况,应该对其进行测量并进行比较.

最后,数百个主要是空闲的线程的整个想法可以像线程池一样建模.这减少了一点代码线性,但显着提高了解决方案的可扩展性,并且可以轻松调整propper care,以调整性能和资源使用之间的折衷.

我认为就是这样.感谢大家的投入.

-
amso

Ebo*_*ike 8

每个线程都有开销 - 最重要的是每个线程都有自己的堆栈和TLS.性能不是一个问题,因为他们不会得到任何时间切片,除非他们实际做任何事情.您可能仍想考虑使用线程池.

  • 哎呀:)是的,通过"空闲",我的意思是处于等待状态的线程,而不是"程序员认为空闲的意思". (3认同)

Mar*_*rkR 5

主要是它们会耗尽地址空间和堆栈内存;一旦你获得了 1000 个线程,这就会变得非常重要,因为我发现每个线程 10M 对于堆栈来说是典型的(在 x86_64 上)。它是可以改变的,但必须小心。

如果你有一个 32 位处理器,地址空间将是主要限制,一旦你达到 1000 个线程,你很容易就会耗尽 AS。

它们消耗了一些内核内存,但可能没有用户空间那么多。


编辑:当然,线程只有在同一进程中时才相互共享地址空间;我假设他们是。

  • 请引用;我见过的大多数系统似乎默认在 1M - 8M 左右;我看不出哪里建议每个线程最小 32Mb。 (3认同)