我有一个设置,其中任务分配给各种代理。我的问题是,我希望代理报告它是否“过载”。
我理解这个问题很模糊,所以我现在要详细说明一下。
任务通常从数据库中提取内容,处理数据,然后将其写回数据库(相同或另一个)。有些任务可能会获取大量数据,而有些任务则很少。大多数主要是I / O绑定,但有些可能还包括繁重的CPU绑定计算。
当前的代理体系结构使得代理只有一定数量的并发线程专用于运行任务 - 每个任务的一个线程(我知道它很糟糕,但这是一个不同的故事)。这样的线程称为任务线程。当然,任务可以自由生成他们想要的任意数量的工作线程。这不会改变任务线程的数量。
无论如何,当每个任务线程忙着执行一些繁重的任务时,代理就会被认为无响应。我们很容易认识到这种情况。
然而,还有另一种情况。代理可能具有空闲的任务线程。但是其他任务线程完成的工作量可能使得代理可能无法处理任何事情,但执行非常轻松的任务。例如,它可能在可用RAM上运行不足以使其执行中等复杂的任务将导致过度交换,从而导致代理严重瘫痪。
一个合理的问题是什么是轻松的任务?同样,这是一个不同的故事。假设任务元数据包含这样一个标志,并假设这些任务真的很轻 - 它们不会获取数据或者数据很少,它们不需要繁重的计算,只需要很少的内存。
回到原来的问题 - 除了无响应 - 重载之外,我还需要其他状态。任务分配逻辑仅将轻型任务分配给重载代理。
我有什么选择?现在,我能想到的唯一指标是可用物理内存量(仍然需要检查.NET API返回的数字)。
能够测量CPU和硬盘负载(而不是可用空间量!)可能会很好。其他指标可能是开放SQL连接的数量,可用的线程池线程。
我在这里寻求建议,也许人们已经遇到并解决了类似的问题,他们的经历对我很感兴趣。
我们在Windows上使用.NET 4.52。
答案 0 :(得分:1)
我认为更好的方法是扭转"将任务分配给工人" to" worker从公共队列获取任务" - 看看https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html。 理解工人PC的唯一方法就是通过WMI汇集CPU | MEMORY | IO状态......