我不确定这是什么意思。
这意味着线程平均花费了75%的时间等待另一个线程完成某些工作。
这是否意味着应用程序正遭受活锁状态?
也许!
要为不熟悉术语的读者澄清:'死锁'是指两个线程都在等待彼此完成,因此它们永远等待。'活锁'是一种情况,其中两个线程试图避免死锁,但由于其选择不佳,仍花费大部分时间等待。例如,想象一张桌子上有两个人、一把叉子和一把刀。两个人都希望拿起这两个餐具,使用它们,然后放下。假设我拿起刀子,你拿起叉子。如果我们都决定等待对方放下餐具,我们就会陷入死锁。如果我们都意识到自己即将进入死锁状态,并且我放下刀,你放下叉子,然后我拿起叉子,你拿起刀子,我们就被活锁住了。我们可以无限重复这个过程;我们都在努力解决这个问题,但我们没有有效地沟通以快速解决它。
但是,我猜测你不处于活锁状态。我的猜测是,你只是在少数关键资源上有巨大的竞争,这些资源一次只能由一个线程访问。奥卡姆剃刀原理表明,你应该假设简单的假设 - 大量线程轮流使用稀缺资源 - 而不是复杂的假设 - 一堆线程都试图告诉对方“不,你先去”。
有约30多个长时间运行的线程绑定到单个AppDomain(如果有必要),其中一些线程非常忙碌(例如while(true){_waitEvent.WaitOne(0); // do stuff})。
听起来很糟糕。
我意识到这是一个相当模糊的问题。
是啊,它是这样的。
太多是多少?为什么?
好吧,假设你正在尝试开车穿越城镇,你和城市中的每个司机都花费了75%的时间等待其他司机在交通灯前停留。你告诉我:这太多了吗?为什么?对于一些人来说,在交通拥堵中度过一小时以行驶15分钟的路程可能是完全可以接受的,但对于其他人来说则是完全无法接受的。每当我在高峰时间驾车经过SR 520时,我都要花费一个小时的时间才能行驶应该只需15分钟的路程;我不能接受这种情况,所以现在我坐公交车。
无论这种糟糕的性能对您和您的客户来说是否可以接受,都由您决定。解决性能问题是很昂贵的。您应该问的问题是,通过承担诊断和解决问题的费用,您将获得多少利润。
约75%真的很糟糕吗?
您的线程所需的时间比实际需要的时间长了四倍。在我看来并不好。
我线程数量太多了吗?
几乎可以肯定,是的。30个线程很多。
但在您的情况下,这完全是一个错误的技术问题。问“我是否有太多线程?”就像试图通过问“这个城市的车太多了吗?”来解决交通拥堵问题一样。正确的问题应该是“为什么这个城市有这么多红绿灯而不是高速公路?” 问题不在于线程;问题在于它们互相等待而不是不停地驶向目的地。
我应该开始在其他领域寻找吗?
我们怎么知道呢?