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

pab*_*blo 5 c# performance multithreading

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

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

据我所知,当在双核盒上运行时,在负载下,应用程序从不使用超过50%的CPU(尽管我已经在四核上看到它的70%或更多).

远程应用程序或ThreadPools的多核方面是否有任何限制?

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

谢谢

Sco*_*ski 10

不应该.

您可以看到此行为有几个原因:

  1. 你的线程是IO绑定的.

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

  2. 您的锁粒度太小

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

  3. 你的锁粒度太大了

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

  4. 你有很多锁争用

    您的线程可能都在尝试同时锁定相同的资源,使它们本身是顺序的.

  5. 您可能无法正确分区线程.

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

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

    你可能只是在做那些无法并行完成的事情.

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


Ree*_*sey 6

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

我怀疑你的行为是由于这个陈述:

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

TCP以及大多数套接字/文件/等代码往往使用非常少的CPU.它花费大部分时间等待,因此程序的CPU使用率可能永远不会飙升.尝试使用重量级的线程池,你会看到你的处理器峰值接近100%的CPU使用率.