Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用>;30条线。CPU非线性扩展_C#_Multithreading - Fatal编程技术网

C# 使用>;30条线。CPU非线性扩展

C# 使用>;30条线。CPU非线性扩展,c#,multithreading,C#,Multithreading,我的C#申请有点问题 我确保线程不会访问自身之外的任何资源 现在我有了threadpool线程,它可以建立tcp连接,创建线程对象并运行,单线程性能非常好。对于50个线程,它看起来是一样的,可能会慢5-10%,CPU慢10-20%。对于100个线程,CPU使用率从10-20%提高到70-99% 我们的一位开发人员说,与linux线程相比,windows线程糟糕透顶,而上下文切换正在遭受巨大的惩罚。他建议使用运行所有实例的4-8个核心线程创建多路复用 但我认为这样的问题一旦你有1000多个线程就开

我的C#申请有点问题

我确保线程不会访问自身之外的任何资源

现在我有了threadpool线程,它可以建立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%.  

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

展开我的评论


与POSIX线程相比,并不是Windows线程“差劲”,而是您试图做的事情比您的CPU一次可以实际处理的要多。CPU使用率并不是一个特别相关的性能指标,您应该在这里查看

如果您的CPU有4个内核,那么持续运行的线程的最佳数量是4个。如果情况继续恶化,性能将会下降,那么上下文切换将对性能产生影响,因为它试图用一个资源同时处理线程

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


唯一不同的情况是,如果您正在运行阻塞(即等待I/O)操作,而您的线程处于空闲状态。在这段空闲时间内,您的内核可以自由地在另一个线程上工作,这可以带来明显的性能优势。当然,当您的另一个线程等待的资源变为可用时,您又回到了当前的状态。

与POSIX线程相比,Windows线程并不是很糟糕,而是您只是在尝试做比CPU在任何时候都能实际做的更多的事情。很明显,事情会开始变慢,线程会因此产生负面影响。您有多少内核?一次只能为每个核心运行一个线程。它是2个物理核心4个线程。只是我知道线程不会线性扩展,但是扩展得如此糟糕让我感到困惑和好奇。任何使用大量TCP连接的程序的秘密就是不使用线程。NET的强大支持,它能够仅在I/O完成时获取TP线程。完全不清楚为什么你认为你必须开始这么多线程。@HansPassant:“没有线程”有点误导。您仍在使用线程等待IO完成。“尽可能少的线程”是一个更好的表达方式。是的,但是,如果50个线程以10-20%的速度运行。那么100应该以20-40%+/-10%的速度运行否?由于它仍然使用相同的4核,除了现在的工作两倍于我所说的硬盘,CPU使用率不是一个真正的性能指标,你应该在这里看到。上下文切换可能是您在“使用率”中真正看到的唯一东西,当您不能作为处理器足够快地处理指令时,您将非线性地显示CPU使用率的峰值,因为您根本无法满足需求,这不是你可以在芯片上显示为%使用率的东西。用更多细节编辑了主要问题。这不是CPU使用问题,因为以50个线程运行3个实例,每个实例使用的CPU要比以150个线程运行的实例少得多。