<>的线程问题30个主题。 CPU非线性缩放

时间:2013-08-16 13:10:26

标签: c# multithreading

我的C#应用​​程序遇到了一些问题。

我确保线程不会访问自己以外的任何资源。

现在我有一个线程池线程,它创建一个tcp连接,创建线程对象并运行,1线程性能很好。有50个线程似乎相同,可能慢5-10%,CPU 10-20%。使用100个线程时,CPU使用率从10-20%增加到70-99%。

我们的一位开发人员表示,与Linux线程相比,Windows线程很糟糕,而且上下文切换会导致巨大的惩罚。他建议使用运行所有实例的4-8个核心线程创建多路复用。

但我认为,一旦你有1000多个线程,这样的问题就会开始发生。任何人都可以用一些好的资源来评论更多关于这个主题的内容,以及线程/ cpu性能和正确的做法吗?


编辑:好的很多答案似乎有点偏离,因为正在做一些假设,所以我会增加一些额外的点:

 Running 3 applications with 50 threads at 10-20% cpu usage  makes them all use that much. 30-60% CPU usage total.
 Running 1 application with 150 threads makes it cap cpu at 70-99%.  

这就是我没有缩放的线程的意思。

1 个答案:

答案 0 :(得分:8)

扩展我的评论..

与POSIX线程相比,Windows线程并不是“糟透了”,只是因为你尝试做的事情比你的CPU一次可以物理处理的更多。 CPU使用率并不是您应该在此处查看的相关性能指标。

如果你的CPU有4个内核,那么你的最佳持续运行线程数量就是4.随之而来的是性能下降,因为上下文切换试图同时处理线程,会对性能产生影响。只有1个资源。

将你的线程想象成桌面上的大量书籍,你必须将每本书从每个堆栈的顶部敲下来,并且你希望它们尽可能快地完成。你有4个这样的书堆(线程),但只有2个武器(核心),你是怎么做到的?最有可能的选择是交替哪个堆栈每次都会关闭书籍,因此没有真正的性能优势,因为单个堆栈所需的时间与其他堆栈一样长。

唯一不同的是,如果您正在运行阻塞(即等待I / O)操作并且线程处于空闲状态。在这个空闲时间内,您的核心可以自由地在另一个线程上工作,这可以提供感知的性能优势。当然,当您的其他线程正在等待的资源可用时,您将回到与当前相同的状态。