首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >>30个线程的线程问题。CPU规模非线性

>30个线程的线程问题。CPU规模非线性
EN

Stack Overflow用户
提问于 2013-08-16 13:10:26
回答 1查看 401关注 0票数 2

我的C#应用程序有一些问题。

我确保线程不会访问任何外部资源。

现在我有了线程池线程,它可以建立tcp连接,创建线程对象并运行,其中一个线程的性能非常好。对于50个线程,它似乎是一样的,可能要慢5-10%,CPU要慢10-20%.对于100个线程,CPU使用率从10-20%增加到70-99%.

我们的一位开发人员说,与linux线程相比,windows线程很糟糕,而上下文切换正在招致巨大的惩罚。他建议用运行所有实例的4-8个核心线程创建多路复用。

但我认为,一旦有了1000+线程,就会出现类似的问题。有人能用一些好的来源来评论这个主题,以及线程/ cpu的性能和正确的实践吗?

编辑:好的,许多答案看起来有点离题,因为有些假设正在进行,所以我将添加一些额外的要点:

代码语言:javascript
复制
 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%.  

这就是我所说的线程不缩放的意思。

EN

回答 1

Stack Overflow用户

发布于 2013-08-16 13:17:34

我想进一步谈谈我的意见。

这并不是说与POSIX线程相比,Windows线程“糟透了”,只是你试图做的事情超出了CPU一次实际处理的能力。CPU的使用并不是您应该在这里看到的一个相关的性能指标。

如果你的CPU有4个核心,那么你不断运行的线程的最佳数量是4个。如果再出现性能下降的情况,那么上下文切换就会对性能产生影响,因为它只需要一个资源就可以同时处理线程。

把你的线程想象成桌子上的一堆书,你必须把每一本书都从每一堆的顶部敲下来,你希望它们都尽可能快地完成。你有4个这样的书栈(线程),但只有两个手臂(核心),你怎么做呢?最有可能的选择是选择每次删除书籍的堆栈,因此没有真正的性能好处,因为单个堆栈所花费的时间与其他堆栈的时间一样长。

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18274111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档