Вы уверены, что в вашем веб-приложении ASP.NET Core нет потоков? Возможно, это просто насыщает все доступные ресурсы модуля, заставляя Kubernetes просто уничтожить сам модуль и ваше веб-приложение.
У меня был очень похожий сценарий с веб-API ASP.NET Core, работающим в Linux RedHat в среде OpenShift , которая также поддерживает концепцию pod, как в Kubernetes: для одного вызова требовалось приблизительно 1 секунда для завершена, и при большой рабочей нагрузке она сначала стала медленнее, а затем перестала отвечать, в результате чего OpenShift уничтожил модуль и, таким образом, мое веб-приложение.
Возможно, ваше веб-приложение ASP.NET Core не исчерпывает потоки, особенно учитывая большое количество рабочих потоков, доступных в ThreadPool.
Вместо этого число активных потоков в сочетании с их потребностью в ЦП, вероятно, слишком велико по сравнению с фактическими милликорами, доступными в модуле, в котором они работают: действительно, после создания этих активных потоков слишком много для доступного ЦП, что большинство из них в конечном итоге планировщик будет поставлен в очередь и ожидает выполнения, в то время как на самом деле будет выполняться только группа.
Затем планировщик выполняет свою работу, обеспечивая равномерное распределение ресурсов ЦП между потоками, часто переключая те, которые будут его использовать.
Что касается вашего случая, когда потокам требуются тяжелые и длинные операции, связанные с процессором, со временем ресурсы насыщаются, а веб-приложение перестает отвечать на запросы.
Шагом смягчения может быть предоставление большей емкости для ваших стручков, особенно милликор, или увеличение количества стручков, которые Kubernetes может развернуть в зависимости от необходимости.
Однако в моем конкретном сценарии этот подход мало помог.
Вместо этого, улучшение самого API за счет сокращения выполнения одного запроса с 1 с до 300 мс заметно улучшило общую производительность веб-приложения и фактически решило проблему.
Например, если ваша библиотека выполняет одни и те же вычисления более чем в одном запросе, вы можете рассмотреть вопрос о введении кэширования в ваших структурах данных, чтобы повысить скорость при небольшой стоимости памяти (что сработало для меня), особенно если ваши операции в основном связаны с процессором, и если у вас есть такие требования к вашему веб-приложению.
Вы также можете включить ответ кэша в ASP.NET Core , если это имеет смысл с рабочей нагрузкой и ответами вашего API.
Используя кеш, вы убедитесь, что ваше веб-приложение не выполняет одну и ту же задачу дважды, освобождая ЦП и снижая риск потоков в очередях.
Более быстрая обработка каждого запроса сделает ваше веб-приложение менее подверженным риску заполнения доступного ЦП и, следовательно, уменьшит риск того, что слишком много потоков будет поставлено в очередь и ожидает выполнения.