我的C#应用程序有一些问题。
我确保线程不会访问任何外部资源。
现在我有了线程池线程,它可以建立tcp连接,创建线程对象并运行,其中一个线程的性能非常好。对于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%. 这就是我所说的线程不缩放的意思。
发布于 2013-08-16 13:17:34
我想进一步谈谈我的意见。
这并不是说与POSIX线程相比,Windows线程“糟透了”,只是你试图做的事情超出了CPU一次实际处理的能力。CPU的使用并不是您应该在这里看到的一个相关的性能指标。
如果你的CPU有4个核心,那么你不断运行的线程的最佳数量是4个。如果再出现性能下降的情况,那么上下文切换就会对性能产生影响,因为它只需要一个资源就可以同时处理线程。
把你的线程想象成桌子上的一堆书,你必须把每一本书都从每一堆的顶部敲下来,你希望它们都尽可能快地完成。你有4个这样的书栈(线程),但只有两个手臂(核心),你怎么做呢?最有可能的选择是选择每次删除书籍的堆栈,因此没有真正的性能好处,因为单个堆栈所花费的时间与其他堆栈的时间一样长。
唯一不同的情况是,如果您正在运行阻塞(即。等待I/O操作,您的线程处于空闲状态。在这个空闲的时间,您的核心可以自由地工作在另一个线程上,这可以提供感知到的性能好处。当然,当其他线程正在等待的资源变为可用时,您将回到当前的状态。
https://stackoverflow.com/questions/18274111
复制相似问题