数百个空闲线程的影响

时间:2010-11-03 15:51:04

标签: c++ linux multithreading performance pthreads

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

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

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

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

感谢。 AMSO

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

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

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

我认为就是这样。感谢大家的意见。

-
AMSO

6 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

首先,他们将占用地址空间和内存用于堆栈;一旦你得到1000个线程,这就变得非常重要,因为我已经看到每个线程10M是典型的堆栈(在x86_64上)。它是可以改变的,但只是小心翼翼。

如果你有32位处理器,地址空间将成为主要限制,一旦你达到1000个线程,你就可以轻松耗尽AS。

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


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

答案 2 :(得分:2)

我会担心提供1:1线程连接映射,如果没有别的,因为它会让您更容易遭受拒绝服务攻击。与仅调用pthread_create()

相比,{accept()是一项相当昂贵的操作

EboMike已经直接回答了这个问题 - 假设线程被阻塞而没有忙碌等待,那么它们不会消耗太多的资源,尽管它们会占用内存并交换所有的每线程状态。

答案 3 :(得分:1)

我不是Linux黑客,但假设Linux的线程调度与Windows类似......

是的,当然会有一些影响。您消耗的每一点内存都可能会产生某些影响。

但是,在时间分片环境中,处于等待/休眠/加入状态的线程在唤醒之前不会占用CPU周期。

答案 4 :(得分:0)

我现在正在学习内核的基础知识。我还不能给你一个具体的答案;我还是个菜鸟......但是这里有些东西供你咀嚼。

Linux将每个POSIX线程实现为一个独特的进程。这会产生其他人提到的开销。除此之外,您的等待模型无论如何都会出现缺陷。如果你为每个线程创建一个条件变量,那么我认为(基于我对下面网站的解释)你实际上将花费大量的内核内存,因为每个线程都会放入自己的等待队列中。相反,如果您为每组X线程分解线程以共享条件变量,那么您也遇到了问题,因为每次变量发出信号时,您必须在该变量的等待队列中唤醒_EVERY_DARN_PROCESS_。

我还假设你需要做一些对象共享同步。在这种情况下,您的代码可能会变慢,因为需要唤醒等待资源的所有进程,如前所述。

我知道这没多大帮助,但正如我所说,我是一个内核菜鸟。希望它有所帮助。

http://book.chinaunix.net/special/ebook/PrenticeHall/PrenticeHallPTRTheLinuxKernelPrimer/0131181637/ch03lev1sec7.html

答案 5 :(得分:0)

我不确定你说的是什么“设备”,但是如果它是文件描述符,我建议你开始迁移到使用poll或epoll(Id建议后者给出描述您期望每个文件描述符的活跃程度)。这样,您可以使用一个负责所有fds的过程。