Большое количество переключений контекста в программе на .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.

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