【问题标题】:Are multithreaded apps bound to a single core?多线程应用程序是否绑定到单个内核?
【发布时间】:2009-06-30 01:10:37
【问题描述】:

我正在运行一个使用 .NET 2.0 构建的 .NET 远程处理应用程序。它是一个控制台应用程序,虽然我删除了 Main 上的 [STAThread]。

我正在使用的 TCP 通道在后台使用 ThreadPool。

据报道,当在双核机器上运行时,在高负载下,应用程序使用的 CPU 永远不会超过 50%(尽管我在四核上看到它使用 70% 或更多)。

对于远程应用程序或线程池的多核是否有任何限制?

是否需要进行一些更改才能使多线程应用程序在多个内核上运行?

谢谢

【问题讨论】:

    标签: c# performance multithreading


    【解决方案1】:

    不应该。

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

    1. 您的线程受 IO 限制。

      在这种情况下,您不会看到很多并行性,因为一切都将在磁盘上等待。单个磁盘本质上是顺序的。

    2. 你的锁粒度太小

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

    3. 你的锁粒度太大

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

    4. 你有很多锁争用

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

    5. 您可能没有正确划分线程。

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

    6. 您的进程可能没有很多可用的并行度

      您可能只是在做一些实际上无法并行完成的事情。

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

    【讨论】:

      【解决方案2】:

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

      我怀疑您的行为是由于以下声明:

      我正在使用的 TCP 通道在后台使用 ThreadPool。

      TCP 以及大多数套接字/文件/等代码往往使用很少的 CPU。它大部分时间都在等待,因此您的程序的 CPU 使用率可能永远不会飙升。尝试使用执行繁重计算的线程池,您会看到处理器的 CPU 使用率飙升至接近 100%。

      【讨论】:

        【解决方案3】:

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

        这是一个如何做到这一点的示例 (taken directly from TechRepublic)

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

        还有输出:

        Current ProcessorAffinity: 3
        Current ProcessorAffinity: 2

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

        【讨论】:

          猜你喜欢
          • 2016-05-08
          • 1970-01-01
          • 2020-04-28
          • 1970-01-01
          • 1970-01-01
          • 2016-04-29
          • 2014-06-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多