Одна строчка .Result роняет ваш ASP.NET Core при CPU 8 %: разбор hill-climbing в .NET 9
Csharponelove 10 минут назад Одна строчка .Result роняет ваш ASP.NET Core при CPU 8 %: разбор hill-climbing в .NET 9 Сложный 12 мин 116 .NET * ASP * C# * Параллельное программирование * Программирование * Аналитика Из...
В сфере искусственного интеллекта произошло заметное событие. Csharponelove 10 минут назад Одна строчка . Result роняет ваш ASP. NET Core при CPU 8 %: разбор hill-climbing в .
NET 9 Сложный 12 мин 116 . NET * ASP * C# * Параллельное программирование * Программирование * Аналитика Из песочницы TL;DR. Result внутри middleware превращает ASP.
Технические детали
NET Core, державший 50k RPS на p99 = 40 мс, в сервис на 12k RPS с p99 = 4 с при CPU 8 %. Виноват не блокирующий вызов сам по себе. Виноват hill-climbing: фидбэк-луп в ThreadPool, внутри которого живёт дискретное преобразование Фурье.
Разбираемся по исходникам CoreCLR, как это работает, воспроизводим эффект на ~80 строках кода и показываем, почему SetMinThreads это не лечение, а анестезия. Пролог: «у нас CPU 8 %, почему всё тормозит? »Ночь пятницы, мониторинг краснее логотипа Coca-Cola.
CPU по кластеру 8 %, RAM в норме, GC-паузы в норме, p50 = 30 мс, p99 = 4 с. ThreadPool Queue Length растёт пилой. В дампе почти 200 потоков, и большинство стоит на ManualResetEventSlim.
Отраслевые последствия
Дежурный пишет в чат: «ThreadPool starvation, крутите SetMinThreads». Все расходятся спать. Проблема в том, что это не диагноз, а ярлык.
Под ним живёт инженерная система из эпохи . 0: раз в 500 мс рантайм сэмплирует throughput, раз в четыре сэмпла прогоняет преобразование Фурье и решает, добавить ли потоков в пул. И этот алгоритм спроектирован под CPU-bound нагрузку, а не под современный async-код с одним заблокированным .
Что внутри статьиАнатомия ThreadPool в . NET 9 по исходнику PortableThreadPool. cs: global queue, local FIFO/LIFO-очереди, work-stealing и IO-completion threads.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




