Потоки с низким приоритетом предотвращают выполнение других потоков с нормальным приоритетом - PullRequest
2 голосов
/ 09 июля 2020

Мы обнаружили, что несколько запросов с интенсивным использованием ЦП означают, что наш сервер API больше не отвечает на простые запросы. Сервер API - это базовое приложение. net с пустельгой, которое выполняется в кластере Kubernetes. Однако, если приложение работает на хосте Windows или Linux, приоритезация задач, похоже, работает идеально. Служба отвечает, даже если есть десятки запросов с интенсивной загрузкой процессора. Таким образом, кажется, существует значительная разница между средой 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;
    }
}

Моя цель состоит в том, чтобы отдать приоритет интенсивному использованию ЦП методы ниже, чтобы приложение всегда могло отвечать на другие запросы (например, запросы работоспособности для LivenessProbe). Thread.Priority кажется полностью игнорируемым в docker enviroment

1 Ответ

1 голос
/ 22 июля 2020

Согласно этой ветке форума , мы не единственные, у кого есть эта проблема. Планирование потоков, похоже, работает принципиально иначе в контейнере Docker (или кластере K8s).

Мы много пробовали и смогли решить проблему, сочетая дросселирование и Thread.Sleep (0 ) .

Обратите внимание на следующую документацию для Thread.Sleep

Если значение аргумента millisecondsTimeout равно нулю, поток передает оставшуюся часть своего временного интервала любому потоку с равным приоритетом, который готов к запуску

Без Thread.Sleep(0) потоки, интенсивно использующие ЦП, приводят к тому, что другие потоки не обрабатываются. Таймеры тоже не вызывались. Установка низкого приоритета потока неэффективна в контейнере Docker.

...