【问题标题】:Looking for ways to determine whether the machine is "overloaded"寻找判断机器是否“超载”的方法
【发布时间】:2014-08-01 03:45:49
【问题描述】:

我有一个设置,其中任务被分配给不同的代理。我的问题是我希望代理报告它是否“超载”。

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

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

当前的代理架构是这样的,代理只有恒定数量的并发线程专用于运行任务 - 每个任务一个线程(我知道这很糟糕,但这是另一回事)。这样的线程称为任务线程。当然,任务可以随意生成他们想要的任意数量的工作线程。这不会改变任务线程的数量。

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

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

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

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

我在这里有什么选择?目前,我能想到的唯一指标是可用物理内存的数量(仍然需要检查 .NET API 返回此数字的内容)。

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

我在这里寻求建议,也许人们已经遇到并解决了类似的问题,他们的经验对我很感兴趣。

我们在 Windows 上使用 .NET 4.52。

【问题讨论】:

    标签: .net performance load


    【解决方案1】:

    我认为更好的方法是将“将任务分配给工作人员”改为“工作人员从公共队列中获取任务” - 看看https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html。 了解工作 PC 容量不足的唯一方法是通过 WMI 池化 CPU|MEMORY|IO 状态...

    【讨论】:

    • 是一样的。如果代理过载,它不应该获取任何任务,除了轻型任务。
    • 这不是 100% 相同的。此逻辑属于代理,您不需要“分配器|平衡器”组件。无论如何使用 WMI 来检测 CPU|MEMORY|DISK 利用率
    • 顺便说一句。与其尝试实现这种“过载诊断逻辑”,不如先尝试更简单的解决方案:实现通用作业队列(或尝试 Gearman)并尝试其行为方式。
    • 好吧,你暴露了我。我们确实从当前架构转移到代理将自己从公共队列中获取任务的架构。这并没有改变一个重载代理不应该获取任何东西,而是轻任务的事实。因此,无论实际架构如何,需求都是相关的。使用 WMI 是个好主意。我要稍等一下,看看有没有其他回复。
    • 你有多少代理?你是如何解决“部署\更新工作者逻辑”问题的? “繁重”的工作——它们有多少“重”?我相信对于 CPU 密集型作业,您可以限制最大并行任务执行 = CPU 内核数。您还可以为 IO 和内存消耗任务定义一些限制。我认为适当的限制就足够了......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多