gpt4 book ai didi

c# - 低优先级的线程阻止其他具有正常优先级的线程执行

转载 作者:行者123 更新时间:2023-12-02 11:42:19 24 4
gpt4 key购买 nike

我们发现几个 CPU 密集型查询意味着我们的 API 服务器不再响应简单的请求。 API 服务器是一个带有 kestrel 的 .net 核心应用程序,在 Kubernetes 集群中执行。但是,如果应用程序在 Windows 或 Linux 主机上运行,​​则任务优先级似乎可以完美运行。即使有数十个 CPU 密集型请求,该服务也会做出响应。因此,Docker 环境和主机环境之间似乎存在显着差异。

我将此 API 方法用于测试目的:

public void SimulateHighCpuLoad()
{
var previousPriority = Thread.CurrentThread.Priority;

try
{
Thread.CurrentThread.Priority = ThreadPriority.Lowest;

var until = DateTime.Now.AddSeconds(30);
var num = 0L;
var random = new Random();

// do senseless work for 30 seconds
while (DateTime.Now < until)
{
num = (random.Next() + Environment.TickCount + num) % (random.Next(10000) + 1);
num *= num++;
}
}
finally
{
Thread.CurrentThread.Priority = previousPriority;
}
}

我的目标是降低 CPU 密集型方法的优先级,以便应用程序始终可以响应其他请求(例如 LivenessProbe 的健康请求)。Thread.Priority在 docker 环境中似乎完全被忽略了

最佳答案

根据 this forum thread ,我们不是唯一有这个问题的人。线程调度似乎在 Docker 容器(或 K8s 集群)中以根本不同的方式工作。

我们尝试了很多,并且能够通过节流和 Thread.Sleep(0) 的混合来解决问题。 .

请注意 Thread.Sleep 的以下文档

If the value of the millisecondsTimeout argument is zero, the threadrelinquishes the remainder of its time slice to any thread of equalpriority that is ready to run

如果没有 Thread.Sleep(0),CPU 密集型线程会导致没有其他线程得到处理。也没有调用计时器。在 Docker 容器中设置低线程优先级是无效的。

关于c# - 低优先级的线程阻止其他具有正常优先级的线程执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62809155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com