Сбор дампа памяти для 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
- Загрузите образ контейнера pilot-diagnostics:
# docker pull registry.ascon.ru/project/pilotdev/pilot/pilot-diagnostics:latest
- Запустите и подключите к целевому контейнеру:
# 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.
- Запустите контейнер с привязкой выходного каталога:
# 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.