Сегодня у нас были странные проблемы в API, вызванные голоданием пула потоков. Нам потребовалось много времени, чтобы понять это.
Так что я думаю, как бы это измерить? Я знаю, что могу использовать такие инструменты, как perfview, но эти ошибки, как правило, возникают только в prod, поэтому сложно выполнить тест perf для анализа после факта.
Я знаю о звонках, таких как:
ThreadPool.GetAvailableThreads(out workers, out ports);
Однако результат, который я получаю, - это произвольно большое число, например 32766. На самом деле (как мы узнали) проблема обычно не в максимальном размере потока, а в том, что .Net ограничивает количество новых потоки это будет раскручиваться в секунду.
Итак, что я заинтересован в измерении:
- Сколько рабочих потоков использует мое приложение прямо сейчас?
- Сколько времени в среднем было потрачено на ожидание доступной нити в последнюю секунду?
Я надеюсь, что есть какой-нибудь API-интерфейс Threadpool или API другого типа, где я могу получить «живые» метрики для них, чтобы я мог сообщить об этом нашим системам мониторинга, использующим Prometheus или аналогичный.
Это просто выстрел в темноте, любые указатели оценены!