Сбор дампа памяти для docker-контейнеров с компонентами системы Pilot

Сбор дампа памяти и дампа управляемой памяти универсально для всех компонентов системы Pilot, поставляемых в docker-контейнерах, таких как Pilot-Server, Pilot-Web-Server, Pilot-myAdmin, Pilot-BIM-Serve.

Дамп памяти необходим при диагностировании:

  • зависания процесса;
  • аварийного завершения процесса;
  • высокой загрузки ЦПУ процессом;
  • утечки памяти.

Дамп управляемой памяти необходим при:

  • диагностировании утечки памяти;
  • диагностировании высокого потребления памяти;
  • анализа управляемой памяти.

Сбор дампа осуществляется с помощью специального диагностического контейнера pilot-diagnostics. Он работает как вспомогательный контейнер, который запускается рядом с диагностируемым и использует общую нумерацию идентификаторов процессов (PID) и единое пространство имён.

Подготовка

При описании команд для работы с контейнерами используются обозначения: $ — команда исполняется от имени текущего пользователя, # — команда исполняется от имени привилегированного пользователя. В OC Linux привилегированные права для выполнения последующей команды можно выдать, например, с помощью sudo.

Чтобы узнать имена и образы всех запущенных контейнеров, введите команду:

# docker ps --format "table {{.Names}}\t{{.Status)}}"

Установка вспомогательного контейнера pilot-diagnostics

  1. Загрузите образ контейнера pilot-diagnostics:

    # docker pull registry.ascon.ru/project/pilotdev/pilot/pilot-diagnostics:latest

  2. Запустите и подключите к целевому контейнеру:

    # docker run -it --rm --pid=container:container_name registry.ascon.ru/project/pilotdev/pilot/pilot-diagnostics:latest

    Где:

    container_name — имя диагностируемого контейнера.

    Например:

    sudo docker run -it --rm --pid=container:pilot-server registry.ascon.ru/project/pilotdev/pilot/pilot-diagnostics:latest

    В выводе отобразится список .NET-процессов целевого контейнера. Найдите PID диагностируемого процесса. Например, процесс Pilot-Server — Ascon.Pilot.Daemon — обычно имеет идентификатор 1.

  3. Запустите контейнер с привязкой выходного каталога:

    # docker run -it --rm --pid=container:container_name -v path:/diag registry.ascon.ru/project/pilotdev/pilot/pilot-diagnostics:latest 1

    Где:

    container_name — имя целевого контейнера;

    path — путь к каталогу на хостовом компьютере для выходных файлов. Например, C:\Dumps для Windows или /tmp/diag для Linux. Предварительно убедитесь, что данные папки созданы на хостовом компьютере;

    1 — PID диагностируемого процесса.

Снятие дампа памяти

Для того чтобы снять дамп, используйте команду:

# dotnet-dump collect -p 1 -o /tmp/crash.dmp --type Full

Где:

  • 1 — PID диагностируемого процесса;
  • crash.dmp — имя файла с дампом;
  • Full — тип дампа. Необязательный параметр.
Значение параметра type Описание
Full Полный дамп памяти. По умолчанию.
Heap Только управляемая куча.
Mini Минимальный дамп.

Извлечение дампа

Перенесите файл дампа в диагностический контейнер:

# cp /proc/1/root/tmp/crash.dmp /diag/ && rm /proc/1/root/tmp/crash.dmp

Файл доступен на хостовом компьютере по адресу, который вы указали в п.3. Например, /tmp/diag/crash.dmp на Linux или C:\Dumps\crash.dmp на Windows.

Снятие дампа управляемой памяти

Для того чтобы снять дамп управляемой памяти, используйте команду:

# dotnet-gcdump collect -p 1 -o /diag/heap.gcdmp

Где:

  • 1 — PID диагностируемого процесса;
  • heap.gcdmp — имя файла с дампом.

Извлечение дампа управляемой памяти

Файл доступен на хостовом компьютере по адресу, который вы указали в п.3. Например, /tmp/diag/crash.dmp на Linux или C:\Dumps\crash.dmp на Windows.

 

назад к списку вопросов