【发布时间】:2011-08-14 05:13:09
【问题描述】:
我有一个基于 MSMQ 的定位应用程序,我在其中接收来自现场单位的位置更新,并将它们处理并放入数据库中。
更新过程在数据库之外没有依赖关系,所以我的应用程序可以配置可变数量的线程。由于我希望进程在失败时保持稳健,因此我想处理尽可能多的消息,但不多(所以如果系统出现故障,我可以从离开的地方继续)。
我的应用程序工作正常,但我发现如果我增加用于处理消息的线程数,我的平均消息数处于一个级别(我使用性能计数器来衡量这一点),并且我让系统利用 50% 的可用 CPU 时间(我有一个具有 4 个物理内核和 8 个逻辑内核的 Core i7 820QM),但是如果我不增加线程,而是启动相同数量的进程,我会得到使用 100% 的 CPU 时间,并获得更高数量的平均事件处理。
可能是锁争用问题吗?与 Windows 7 处理超线程处理器的方式有关吗?我希望了解问题的性质,任何指针都将不胜感激。
注意:我在这个项目中使用 MSMQ、Rx 和实体框架。
【问题讨论】:
-
你是如何提高线程数的?
-
问题几乎肯定出在您对 Rx 的使用上。我认为 Rx 以一种并非所有内核都可以使用的方式协调您的线程(读取需要一些锁)。要获得一个想法,请在您的应用程序中多次中断并检查调用堆栈大部分时间在哪些方法中。这应该让您知道锁的位置。
-
@Wegged: new Thread(() => { ... } { IsBackground = true }.Start();
-
我现在看到我使用的线程比我想象的要多。 BeginReceive/EndReceive 对从 MessageQueue 接收到的每条消息都使用一个线程进行接收,我正在该线程中处理我的消息(不是我想和想要的)。将线程加倍(不管创建更多线程的线程)仍然比加倍进程慢的事实。我猜是争吵,但我宁愿知道问题出在哪里。我的分析器运行,将时间放在我的更新方法中,而不是在框架中。
标签: c# multithreading entity-framework msmq system.reactive