Получение стека GCallocationTick не учитывается при запуске двоичного файла .NET с COMPlus_EnableEventLog = 1 - PullRequest
2 голосов
/ 25 сентября 2019

Фон

Я хочу отслеживать для своего приложения ASP.NET Core 2.1, какие методы выделяют больше всего ресурсов, и для этого я хотел использовать события LTTng вместе с некоторыми другими инструментами, чтобы помочь.По сути, я пытался следовать этому руководству: http://blogs.microsoft.co.il/sasha/2018/02/06/getting-stacks-for-lttng-events-with-net-core-on-linux/

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

Настройка

Я запускаю серверное приложение с помощью команды

COMPlus_EnableEventLog=1 /home/kqr/testserver/TestServer & >/dev/null

чтобы запустить его в фоновом режиме.Затем я проверяю, работает ли он, делая HTTP-запрос и получая ожидаемый ответ.

Процедура

Затем я хотел бы выяснить, какие методы занимают много места в куче,поэтому я запускаю инструмент stackcount из коллекции компиляторов BPF (BCC) следующим образом:

sudo stackcount-bpfcc -p 19010 -f \
    /home/kqr/testserver/libcoreclr.so:EventXplatEnabledGCAllocationTick* \
    > allocticks.stacks

Я делаю несколько запросов, которые должны быть дорогими с точки зрения использования памяти, и затем я отменяюКоманда stackcount с Ctrl-C.

Проблема

На данный момент файл allocticks.stacks пуст, как будто во время записи не было выделений.

Я бы ожидал, что allocticks.stacks будет содержать, по крайней мере, что-то .

Что я делаю не так?

Дальнейшая диагностика

Я также попытался сделатьТо же самое и с perf, сначала определив зонд для событий GCAllocationTick:

sudo perf probe -x /home/kqr/testserver/libcoreclr.so \
    -a EventXplatEnabledGCAllocationTick*

, а затем снова начав записывать эти события для процесса:

sudo perf record -p 19010 -e probe_libcoreclr:* -g

, выполнив некоторые запросы, которые язнаю, дорогие с точки зрения оf Использование памяти, а затем отмена команды записи с помощью Ctrl-C.

Когда я пытаюсь просмотреть записанные данные, запустив

sudo perf report -f

, я получаю следующую ошибку:

Error: The perf.data file has no samples!

Исключено: орфографические ошибки

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

Исключено: отсутствует зависимость

Как и в случае с ошибкой, я попытался преднамеренно удалить нужную мне зависимость, изатем инструментарий предупредил меня об этом.

Исключено (?): Неправильно libcoreclr.so

Я не совсем уверен, как все это объединяет .NET, но яначинаю думать, что, возможно, исполняемый файл TestServer не использует файл libcoreclr.so в своем рабочем каталоге, потому что он использует какой-то общесистемный двоичный файл.Тем не менее, я не нашел в системе никакого другого файла с именем libcoreclr.so, хотя я не выглядел слишком усердно.

Однако я начинаю думать, что, возможно, это один из техСодержит элементы развертывания и то, что libcoreclr.so каким-то образом встроен в двоичный файл, поэтому он не должен полагаться на это как на внешний файл.Однако, даже если я запускаю приложение с

cd /home/kqr/testserver
COMPlus_EnableEventLog=1 dotnet TestServer.dll

, у меня возникает та же проблема, заставляя меня думать, что это также менее вероятная причина.

...