Использование ЦП в основной веб-службе dotnet постепенно увеличивается

У меня есть веб-служба .net Core, которая, кажется, постепенно увеличивает использование процессора. это означает, что в первый день он не превысит 10%, во второй день может подняться до 20% и так далее.

Используя команду TOP в Linux, все мои веб-службы, кажется, когда-нибудь отображаются там (возможно, когда делается запрос), а затем исчезают. Этот конкретный процесс после некоторого запуска просто остается там, постоянно потребляя процессор, даже если не было сделано никаких запросов.

API все еще работает нормально, похоже, что есть некоторые потоки, которые просто продолжают зависать и потреблять процессор. В прошлый раз, когда я проверил, у меня было 5 потоков, которые потребляли 3-4% процессора и по какой-то причине не умерли. Я предполагаю, что в каком-то конкретном сценарии поток просто остается в живых, потребляя процессор.

Приложение работает на машине ubuntu, моим первым шагом была попытка создать файл дампа с помощью ProcDump, чтобы я мог проанализировать эти потоки и, возможно, найти, где они зависают. ProcDump генерирует огромный файл размером 21 ГБ, который при попытке анализа с помощью lldb выдает исключение из памяти. даже попытался перенести его на машину с Windows для отладки с помощью windbg, никакой помощи там не было, так как он не мог открыть файл.

Поскольку нет конкретного исключения или чего-то еще, я не могу поделиться каким-либо фрагментом кода, поскольку я понятия не имею, в чем проблема ... просто надеетесь на какое-то предложение, которое может помочь мне найти решение или, по крайней мере, понять, где проблема в.

Большое спасибо за чтение, ура


person Ben    schedule 08.08.2019    source источник


Ответы (3)


Вы можете попробовать использовать что-то вроде DotMemory от jetBrains, у них также есть довольно высокий уровень, но полезное руководство https://www.jetbrains.com/help/dotmemory/How_to_Find_a_Memory_Leak.html также стоит проверить файл запуска и дважды проверить, что зарегистрированные вами службы используются правильно, т.е. должен быть временным или даже одноэлементным и т. д.

person Ryan    schedule 11.08.2019
comment
Спасибо за предложение, в конечном итоге проблема заключалась в неправильном использовании httpClient. не знал, что это может вызвать такую ​​проблему, лол ... - person Ben; 13.08.2019
comment
У меня была точно такая же проблема, я обнаружил несколько экземпляров httpClient, когда профилирую наше приложение. Наш сайт падал каждые 3-4 дня. Рад, что ты нашел это - person Ryan; 15.08.2019

Так что я уже какое-то время этим занимаюсь. В конце концов выяснилось, что моя проблема связана с HttpClient, вероятно, плохим сочетанием статического класса и создания новых экземпляров HttpClient, что вызывает проблему, описанную выше.

Решил это, используя HttpClientFactory, как описано здесь -

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.1

Урок выучен :)

person Ben    schedule 13.08.2019

Немного поздно, но Procdump для Linux только что добавил поддержку .NET Core 3, которая генерирует дампы ядра гораздо более управляемого размера. Он автоматически определяет, является ли целевой процесс .NET Core, и поступает правильно (т.е.не нужно указывать переключатели).

person Mario Hewardt    schedule 01.02.2020