C# 多线程应用程序是否绑定到单个核心?

C# 多线程应用程序是否绑定到单个核心?,c#,performance,multithreading,C#,Performance,Multithreading,我正在运行一个使用.NET2.0构建的.NETRemoting应用程序。这是一个控制台应用程序,尽管我删除了Main上的[StatThread] 我使用的TCP通道在后台使用线程池 据报道,在双核机箱上运行时,在高负载下,应用程序的CPU使用率从未超过50%(尽管我见过四核的CPU使用率为70%或更多) 对于远程处理应用程序或线程池,在多核方面是否有任何限制 为了使多线程应用程序在多个内核上运行,是否需要更改某些内容 谢谢多线程应用不需要绑定到单个核心。您可以使用检查线程的关联性(它操作的内核数

我正在运行一个使用.NET2.0构建的.NETRemoting应用程序。这是一个控制台应用程序,尽管我删除了Main上的[StatThread]

我使用的TCP通道在后台使用线程池

据报道,在双核机箱上运行时,在高负载下,应用程序的CPU使用率从未超过50%(尽管我见过四核的CPU使用率为70%或更多)

对于远程处理应用程序或线程池,在多核方面是否有任何限制

为了使多线程应用程序在多个内核上运行,是否需要更改某些内容


谢谢

多线程应用不需要绑定到单个核心。您可以使用检查线程的关联性(它操作的内核数)。我不确定默认行为是什么,但如果需要,可以通过编程方式进行更改

下面是一个如何执行此操作的示例()

以及输出:

当前处理器关联性:3

当前处理器关联性:2

上面的代码首先显示进程在两个内核上运行。然后它变为只使用第二个内核,并显示它现在只使用第二个内核。您可以阅读上的.NET文档,了解各种数字对关联性的含义。

不应该有

您可能会看到这种行为的原因有几个:

  • 你的线程是IO绑定的

    在这种情况下,您将不会看到很多并行性,因为所有内容都将在磁盘上等待。单个磁盘本身就是连续的

  • 您的锁粒度太小

    您的应用程序可能会花费大部分时间获取锁,而不是执行应用程序逻辑。这会大大减慢速度

  • 你的锁粒度太大了

    如果锁定不够精细,那么其他线程可能会花费大量时间等待

  • 您有很多锁争用

    您的线程可能都试图在同一时间锁定相同的资源,使它们具有内在的顺序性

  • 您可能没有正确划分线程

    您可能在多个线程上运行了错误的东西。例如,如果每个连接使用一个线程,则可能没有利用在该线程上运行的任务中可用的并行性。尝试将这些任务拆分为可以并行运行的块

  • 您的流程可能没有很多可用的并行性

    你可能只是在做一些不能同时完成的事情


  • 我会尝试调查每一个,看看原因是什么。

    多线程应用程序将使用您的所有内核

    我怀疑你的行为是由于以下陈述:

    我使用的TCP通道在后台使用线程池

    TCP,以及大多数套接字/文件/etc代码,倾向于使用很少的CPU。它大部分时间都在等待,因此程序的CPU使用率可能永远不会飙升。尝试在大量计算的情况下使用线程池,您将看到处理器的CPU使用率接近100%

    Console.WriteLine("Current ProcessorAffinity: {0}", 
                      Process.GetCurrentProcess().ProcessorAffinity);
    
    Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)2;
    
    Console.WriteLine("Current ProcessorAffinity: {0}", 
                      Process.GetCurrentProcess().ProcessorAffinity);