.net 正在寻找确定机器是否“正常”的方法;超载;

.net 正在寻找确定机器是否“正常”的方法;超载;,.net,performance,load,.net,Performance,Load,我有一个将任务分配给不同代理的设置。我的问题是,如果它“过载”,我希望代理报告 我知道这个问题很模糊,所以我现在要详细说明一下 任务通常从数据库中提取数据,处理数据,然后将其写回数据库(同一个或另一个)。有些任务可能会获取相当多的数据,有些任务可能会获取很少的数据。大多数主要是受I/O限制的,但有些可能还包括受CPU限制的大量计算 当前的代理体系结构是这样的,一个代理只有固定数量的并发线程专用于运行任务——每个任务一个线程(我知道这很糟糕,但情况不同)。这样的线程称为任务线程。当然,任务可以自由

我有一个将任务分配给不同代理的设置。我的问题是,如果它“过载”,我希望代理报告

我知道这个问题很模糊,所以我现在要详细说明一下

任务通常从数据库中提取数据,处理数据,然后将其写回数据库(同一个或另一个)。有些任务可能会获取相当多的数据,有些任务可能会获取很少的数据。大多数主要是受I/O限制的,但有些可能还包括受CPU限制的大量计算

当前的代理体系结构是这样的,一个代理只有固定数量的并发线程专用于运行任务——每个任务一个线程(我知道这很糟糕,但情况不同)。这样的线程称为任务线程。当然,任务可以自由生成任意数量的工作线程。这不会更改任务线程的数量

无论如何,当每个任务线程都在忙于执行某个繁重的任务时,代理称为无响应。我们很容易认识到这种情况

然而,还有另一种情况。代理可能有空的任务线程。但是其他任务线程完成的工作量可能会使代理无法处理任何任务,只能处理非常轻的任务。例如,它可能在可用RAM上运行不足,以至于执行一个中等复杂的任务将导致过度交换,从而导致代理严重瘫痪

一个合理的问题是什么是轻任务?同样,这是一个不同的故事。假设任务元数据包含这样一个标志,并且假设这样的任务真的很轻——它们不获取数据或只获取很少的数据,它们不进行繁重的计算,只需要很少的内存

回到原来的问题-我需要另一个状态,除了无响应-过载。任务分配逻辑将仅将轻任务分配给过载的代理

我的选择是什么?现在,我能想到的唯一指标是可用物理内存的数量(仍然需要检查.NETAPI返回的这个数字)

能够测量CPU和硬盘负载(而不是可用空间的大小!)可能会很好。其他指标可能是打开的SQL连接数、可用线程池线程数

我在这里寻求建议,也许人们已经遇到并解决了类似的问题,他们的经验对我来说非常有趣


我们在Windows上使用.NET 4.52。

我认为更好的方法是将“将任务分配给工作者”改为“工作者从公共队列获取任务”——请看。
了解工作PC容量不足的唯一方法是通过WMI共享CPU |内存| IO状态

是一样的。如果代理超载,它不应该获取任何任务,除了轻任务。它不是100%相同。此逻辑属于代理,您不需要“赋值器|平衡器”组件。无论如何,请使用WMI检测CPU |内存|磁盘利用率。与其尝试实现这种“过载诊断逻辑”,不如先尝试更简单的解决方案:实现公共作业队列(或者只是尝试Gearman)并尝试它的行为。好的,您已经向我展示了。我们确实从当前的体系结构转移到代理将自己从公共队列获取任务的体系结构。这并没有改变这样一个事实:重载代理不应该获取任何东西,而应该获取轻任务。因此,无论实际架构如何,需求都是相关的。使用WMI是一个好主意。我要等一会儿,看看是否还有其他回复。你们有多少代理?您是如何解决“部署\更新工作逻辑”问题的?“重”的工作——它们有多重?我相信对于CPU密集型作业,您可以限制最大并行任务执行=CPU核心数。您还可以为IO和内存消耗任务定义一些限制。我认为适当的限制是足够的。。。。