.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
检查所有这些查询的执行计划。。。它可能是一些采取任何类型的锁,因此可能会创建一个竞争数据库服务器端
这些线程是否来自线程池?如果是这样,则您将无法缩放:-( 编辑3: 线程池线程不适合长时间运行的任务,在您的场景中就是这样……有关详细信息,请参阅
如果您想要极高的性能,那么值得一试。您所描述的现实世界示例如下。您所描述的是,您想要100%的可伸缩性,即线程数增加与Wallclock时间减少之间的1:1关系……这通常是一个目标,但很难实现 例如,您写到没有内存争用,因为有1 GB的空闲空间…这是一个错误的假设…内存争用还意味着,如果两个线程尝试分配内存,则可能会发生一个线程必须等待另一个线程的情况…另一个需要记住的是GC发生的中断,它冻结了所有线程有时,可以通过配置(gcServer)稍微定制GC—请参阅 另一点是名为…的WCF服务,如果它不能扩展,例如PDF呈现,那么这也是一种竞争形式,例如 可能的争论列表是“无止境的”…而且几乎不总是在你提到的明显领域 编辑-根据评论: 需要检查的几点:
- 连接池
您使用什么提供商?它是如何配置的 - PDF呈现
可能的争用将在您使用的库中的某个位置进行测量 - Linq2SQL
检查所有这些查询的执行计划…可能有些查询会采用任何类型的锁,因此可能会创建争用数据库服务器端
这些线程是否来自线程池?如果是,则无法缩放:-( 编辑3: 线程池线程不适合长时间运行的任务,在您的场景中就是这样……有关详细信息,请参阅
如果您希望获得极高的性能,那么值得一试。下面是一个真实的示例。与其测量线程的总时间,不如测量执行某种I/O操作(数据库、磁盘、网络等)的每个操作的时间
我怀疑您会发现,当您有更多线程时,这些操作会花费更长的时间,这是因为争用在该I/O的另一端。例如,您的数据库可能正在序列化数据一致性请求。测量每个操作的时间,而不是测量总线程时间您这样做的目的是进行某种类型的I/O(数据库、磁盘、网络等) 我怀疑你会发现,当你有mo时,这些操作需要更长的时间