Большое количество переключений контекста в программе на .NET на Linux машине

Заметил, что при работе своей программы, написанной на C# (.NET 6), происходит большое количество переключений контекста. Программа в основном занимается приемом/передачей данных по сети. Для теста решил написать простое клиент-сервеное приложение.

На Linux сервере запустил вот такой код:

TcpClient client = _tcpListener.AcceptTcpClient();
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];

try
{
    while (client.Connected)
    {
        if (stream.Read(buffer, 0, buffer.Length) == 0)
            throw new Exception();
    }
}
catch { }

На своем Windows ПК запустил такой код:

TcpClient client = new();
client.Connect(_endPoint);
NetworkStream stream = client.GetStream();
byte[] buffer = RandomNumberGenerator.GetBytes(1024);

try
{
    while (client.Connected)
    {
        stream.Write(buffer, 0, buffer.Length);
    }
}
catch { }

На сервере установлен Munin, который на пике показывал 15000 переключений контекста (context switches) и прерываний (interrupts) в секунду. Если сервер и ПК поменять ролями, то есть сервер отправляет данные, а ПК принимает, переключений контеста было всего лишь 500, а прерывания подсткакивали до 4000. Munin

Моя программа использует асинхронные операции ввода-вывода, а тестовая программа использует синхронные операции в одном основном потоке. Если переписать тестовую программу с использованием асинхронных оперций, то, думаю ситуация в лучшую сторону не изменится. Например, Nginx обсулживает больше соединений и значительно больший трафик, но такого большого количества переключений контекста не происходит. Почему это происходит именно в .NET и как решить данную проблему?


Ответы (0 шт):