.net 多线程资源争用

.net 多线程资源争用,.net,multithreading,profiling,contention,.net,Multithreading,Profiling,Contention,我正在分析一个多线程程序,该程序使用不同数量的允许线程运行。以下是相同输入工作的三次运行的性能结果 1 thread: Total thread time: 60 minutes. Total wall clock time: 60 minutes. 10 threads: Total thread time: 80 minutes. (Worked 33% longer) Total wall clock time: 18 minutes. 3.3 times speed

我正在分析一个多线程程序,该程序使用不同数量的允许线程运行。以下是相同输入工作的三次运行的性能结果

1 thread:
  Total thread time: 60 minutes.
  Total wall clock time: 60 minutes.

10 threads:
  Total thread time: 80 minutes. (Worked 33% longer)
  Total wall clock time: 18 minutes.  3.3 times speed up

20 threads
  Total thread time: 120 minutes. (Worked 100% longer)
  Total wall clock time: 12 minutes.  5 times speed up
由于做同样的工作需要更多的线程时间,我觉得线程必须争夺资源

我已经检查了应用程序机器和数据库服务器上的四个支柱(cpu、内存、diskIO、网络)。内存是最初争用的资源,但现在已经修复了(任何时候都有超过1G的可用内存)。在20线程测试中,CPU在30%到70%之间徘徊,所以有很多。diskIO在应用程序机器上几乎没有,在数据库服务器上几乎没有。网络真的很棒

我还使用redgate编写了代码概要,没有看到任何方法等待锁。线程不共享实例会有所帮助。现在,我正在检查更细微的项目,如数据库连接建立/池(如果20个线程试图连接到同一个数据库,它们是否必须互相等待?)

我正在尝试识别并解决资源争用问题,因此20个线程的运行如下所示:

20 threads
  Total thread time: 60 minutes. (Worked 0% longer)
  Total wall clock time: 6 minutes.  10 times speed up
我应该寻找哪些最有可能的来源(大4以外的来源)来发现这种争论?


每个线程执行的代码大约为:

Run ~50 compiled LinqToSql queries
Run ILOG Rules
Call WCF Service which runs ~50 compiled LinqToSql queries, returns some data
Run more ILOG Rules
Call another WCF service which uses devexpress to render a pdf, returns as binary data
Store pdf to network
Use LinqToSql to update/insert. DTC is involved: multiple databases, one server.
WCF服务在同一台机器上运行,并且是无状态的,能够同时处理多个请求



这台机器有8个cpu。

您描述的是,您想要100%的可伸缩性,即线程的增加与wallcklock时间的减少之间的1:1关系。。。这通常是一个目标,但很难实现

例如,您写到没有内存争用,因为有1GB的可用空间。。。这是一个错误的假设。。。内存争用还意味着,如果两个线程试图分配内存,则可能发生一个线程必须等待另一个线程的情况。。。另一个要记住的问题是GC发生的中断,它会暂时冻结所有线程。。。GC可以通过配置(gcServer)进行一点自定义-请参阅

另一点是名为。。。如果它不能扩展(例如PDF渲染),那么这也是一种竞争形式,例如

可能的争论列表是“无止境的”。。。而且几乎总是在你提到的显而易见的领域

编辑-根据评论:

需要检查的几点:

  • 连接池
    您使用哪种提供商?它是如何配置的
  • PDF呈现
    可能的争用将在您使用的库中的某个位置进行测量
  • Linq2SQL
    检查所有这些查询的执行计划。。。它可能是一些采取任何类型的锁,因此可能会创建一个竞争数据库服务器端
编辑2:

线程
这些线程是否来自线程池?如果是这样,则您将无法缩放:-(

编辑3:

线程池线程不适合长时间运行的任务,在您的场景中就是这样……有关详细信息,请参阅

长时间运行的操作应该使用新创建的线程; 短时间运行的操作可以利用线程池


如果您想要极高的性能,那么值得一试。您所描述的现实世界示例如下。

您所描述的是,您想要100%的可伸缩性,即线程数增加与Wallclock时间减少之间的1:1关系……这通常是一个目标,但很难实现

例如,您写到没有内存争用,因为有1 GB的空闲空间…这是一个错误的假设…内存争用还意味着,如果两个线程尝试分配内存,则可能会发生一个线程必须等待另一个线程的情况…另一个需要记住的是GC发生的中断,它冻结了所有线程有时,可以通过配置(gcServer)稍微定制GC—请参阅

另一点是名为…的WCF服务,如果它不能扩展,例如PDF呈现,那么这也是一种竞争形式,例如

可能的争论列表是“无止境的”…而且几乎不总是在你提到的明显领域

编辑-根据评论:

需要检查的几点:

  • 连接池
    您使用什么提供商?它是如何配置的
  • PDF呈现
    可能的争用将在您使用的库中的某个位置进行测量
  • Linq2SQL
    检查所有这些查询的执行计划…可能有些查询会采用任何类型的锁,因此可能会创建争用数据库服务器端
编辑2:

线程
这些线程是否来自线程池?如果是,则无法缩放:-(

编辑3:

线程池线程不适合长时间运行的任务,在您的场景中就是这样……有关详细信息,请参阅

长时间运行的操作应该使用新创建的线程; 短时间运行的操作可以利用线程池


如果您希望获得极高的性能,那么值得一试。下面是一个真实的示例。

与其测量线程的总时间,不如测量执行某种I/O操作(数据库、磁盘、网络等)的每个操作的时间


我怀疑您会发现,当您有更多线程时,这些操作会花费更长的时间,这是因为争用在该I/O的另一端。例如,您的数据库可能正在序列化数据一致性请求。

测量每个操作的时间,而不是测量总线程时间您这样做的目的是进行某种类型的I/O(数据库、磁盘、网络等)

我怀疑你会发现,当你有mo时,这些操作需要更长的时间