pab*_*blo 5 c# performance multithreading
我正在运行使用.NET 2.0构建的.NET远程处理应用程序.它是一个控制台应用程序,虽然我删除了Main上的[STAThread].
我正在使用的TCP通道在后台使用ThreadPool.
据我所知,当在双核盒上运行时,在负载下,应用程序从不使用超过50%的CPU(尽管我已经在四核上看到它的70%或更多).
远程应用程序或ThreadPools的多核方面是否有任何限制?
是否需要更改某些内容才能在多个内核上运行多线程应用程序?
谢谢
Sco*_*ski 10
不应该.
您可以看到此行为有几个原因:
你的线程是IO绑定的.
在这种情况下,您将看不到很多并行性,因为一切都将在磁盘上等待.单个磁盘本质上是顺序的.
您的锁粒度太小
您的应用可能花费大部分时间来获取锁定,而不是执行您的应用程序逻辑.这可以大大减慢速度.
你的锁粒度太大了
如果您的锁定不够精确,那么您的其他线程可能会花费大量时间等待.
你有很多锁争用
您的线程可能都在尝试同时锁定相同的资源,使它们本身是顺序的.
您可能无法正确分区线程.
您可能在多个线程上运行错误的东西.例如,如果每个连接使用一个线程,则可能无法利用在该线程上运行的任务中的可用并行性.尝试将这些任务拆分为可以并行运行的块.
您的进程可能没有很多可用的并行性
你可能只是在做那些无法并行完成的事情.
我会尝试调查每一个,看看原因是什么.
多线程应用程序将使用您的所有核心.
我怀疑你的行为是由于这个陈述:
我正在使用的TCP通道在后台使用ThreadPool.
TCP以及大多数套接字/文件/等代码往往使用非常少的CPU.它花费大部分时间等待,因此程序的CPU使用率可能永远不会飙升.尝试使用重量级的线程池,你会看到你的处理器峰值接近100%的CPU使用率.