我正在分析运行不同数量的允许线程的多线程程序。以下是三次相同输入作业的性能结果。多线程资源争用
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。
建议您发布您试图并行的代码/算法 –
您的计算机有多少个CPU? –
你的操作大多是IO绑定的,这些IO调用是异步的吗?如果不尝试使他们asyn,然后看看你是否得到任何好处 – Ankur