【发布时间】:2014-08-01 03:45:49
【问题描述】:
我有一个设置,其中任务被分配给不同的代理。我的问题是我希望代理报告它是否“超载”。
我知道这个问题很模糊,所以我现在要详细说明一下。
任务通常从数据库中获取一些东西,处理数据,然后将其写回数据库(相同或另一个)。有些任务可能会获取大量数据,而有些任务可能会获取非常少的数据。大多数主要受 I/O 限制,但有些可能还包括繁重的 CPU 限制计算。
当前的代理架构是这样的,代理只有恒定数量的并发线程专用于运行任务 - 每个任务一个线程(我知道这很糟糕,但这是另一回事)。这样的线程称为任务线程。当然,任务可以随意生成他们想要的任意数量的工作线程。这不会改变任务线程的数量。
无论如何,当每个任务线程都忙于执行一些繁重的任务时,代理就被称为无响应。我们很容易认识到这种情况。
但是,还有另一种情况。代理可能有空闲的任务线程。但是其他任务线程完成的工作量可能使代理可能无法处理任何事情,但任务非常轻。例如,它可能在可用 RAM 上运行不足,以至于使其执行中等复杂的任务会导致过度交换,从而导致代理严重瘫痪。
一个合理的问题是什么是轻任务?同样,这是一个不同的故事。假设任务元数据包含这样一个标志,并且假设这样的任务真的很轻——它们不获取或获取很少的数据,它们不进行繁重的计算,需要很少的内存。
回到原来的问题 - 除了无响应 - 过载之外,我还需要另一个状态。任务分配逻辑只会将轻量级任务分配给重载代理。
我在这里有什么选择?目前,我能想到的唯一指标是可用物理内存的数量(仍然需要检查 .NET API 返回此数字的内容)。
能够测量 CPU 和硬盘负载(而不是可用空间量!)可能会很好。其他指标可能是打开的 SQL 连接的数量、可用的线程池线程。
我在这里寻求建议,也许人们已经遇到并解决了类似的问题,他们的经验对我很感兴趣。
我们在 Windows 上使用 .NET 4.52。
【问题讨论】:
标签: .net performance load