我分析多线程的程序与运行不同的数字允许的螺纹。这里的业绩结果的三个运行的相同的输入工作。

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

因为它需要更多线程的时间做同样的工作,我感到线必须争夺资源。

我已经审查了四个支柱(中央处理器、存储器、diskIO、网络)在两个机应用程序和数据库服务器。记忆是原来的竞争资源,但是这现在固定的(超过1G免费在所有次)。CPU徘徊在30%和70%在20线测试,这样大量存在。diskIO是几乎没有上的应用程序的机,和最小的数据库服务器。该网络是真正很大的。

我还代码分析与展鹏,看到没有方法等待上锁。它可以帮助的线是不共享的实例。现在我要检查更加细致入微的项目,如数据库连接建立/集中(如果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服务是在同一台机器上运行和无国籍以及能够处理多个同时的请求。


机器有8cpu。

有帮助吗?

解决方案

什么你描述的是你想要一个可扩展性的100%,是1:1之间的关系的增加在线s减少wallcklock时间...这是全的一个目标,但很难达到...

例如你写的是,没有存储器竞争,因为有1个...这是恕我直言一个错误的假设...存储器争也意味着如果两个线程的尝试来分配的存储器可能发生的一个有等待其他的...另一个ponint要牢记的中断发生的GC其冻结所有线暂时...GC可customzed一点通过配置(gcServer)-看看 http://blogs.msdn.com/b/clyon/archive/2004/09/08/226981.aspx

另一点是周转基金服务的称为...如果它不能扩大,例如PDF呈现-那么这也是一种形式的竞争例如...

列表中可能的争是"无"...并不总是显而易见的领域,你提及...

编辑-为每评论:

有些检查要点:

  • 连接池
    什么提供你使用?它是如何配置?
  • PDF呈现
    可能的竞争将是衡量某个地方内部的图书馆使用...
  • Linq2SQL
    检查执行计划的所有这些查询的...它可以是,一些采取任何种锁以及由此可能创建一种竞争的数据库服务器。

编辑2:

螺纹
这些线,从中线程池?如果是这样,那么你不会的规模:-(

编辑3:

线程池线是坏为长期运行的任务是哪种情况,在你的情景...详情见

http://www.yoda.arachsys.com/csharp/threads/printable.shtml

长期运行的操作应使用新创建的线程;短期运行的业务可以利用该线的游泳池。

如果你想的极端表现,那么它可能是值得去看看 CQRS 和现实世界的例子描述为 常规 .

其他提示

而不是测量总线时间,测量时间对每个业务,你做这做I/O某种形式(数据库,磁盘,网,等等)。

我怀疑你要找到这些行动是那些需要更长的时间,当你有更多线程,这是因为竞争是在另一端,I/O.例如,数据库可能会将对数据的请求的一致性。

是的,有资源的竞争。所有的线有读写的数据相同的存车,针对相同的内存模块,例如。不论多大的RAM是免费的,它事项的读写都是由相同的存储控制器上的一样RAM模块和数据进行了相同的总线。

如果有任何种类的同步 任何地方, 然后这也是一个竞争资源。如果有的 任何 I/O,这是一个竞争资源。

你永远不会看到一个N x加速当从1到N线。这是不可能的,因为最终, 的一切 在CPU是一个共享资源会有一定程度的竞争。

有很多因素阻止你得到充分的线性加速比。你是假设的数据库,服务器数据库上运行,该网络连接到客户、客户的计算机操作系统和程的两端,内存子系统,盘I/O 的一切 在之间能够只是去20倍的速度当你从1到20线。

两个词:梦想。

这些瓶颈问题只要你慢下来的几个百分点,那么总的结果将是什么喜欢你看到的。

我敢肯定你可以调整它来规模的一个好一点的,但不期望奇迹。

但有一件事你可能看起来是缓行共享。做线访问的数据,这是非常接近使用的数据的其他线?你多久能避免发生?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top