Генерация heap-dump-файлов
На платформе предусмотрена возможность генерации heap-dump-файлов при условии, если программа превысила потребляемую память больше определённого процента от предоставленного ей. Это может потребоваться для анализа утечек по памяти, а так же других данных.
Для настройки генерации heap-dump-файлов необходимо:
- подготовить директорию, куда будут выгружаться эти файлы. Эта директория должна быть доступна программе платформы MyBPM на запись.
- настроить параметры генерации в конфиге
/mybpm/configs/HeapDumpConfig.txt
- прописать переменную окружения
MYBPM_MEMORY_LIMIT
После этого можно будет просматривать сгенерированные файлы и выгружать их с помощью REST-сервисов.
1. Подготовка директории для выгрузки
Так как программа размещается в поде Kubernetes, то директорию нужно подготовить внутри пода. Директория должна быть подсоединяемым volume-ом. Иначе при падении программы все файлы будут стёрты и станут недоступны для анализа.
Если директория логов уже имеет свой volume, то можно использовать этот же volume.
Платформа, по умолчанию, логи выгружает в директорию /var/log/mybpm
. Эту директорию можно сменить переменной
окружения: MYBPM_LOG_DIR
. Если эта переменная окружения не определена, то директория будет по умолчанию.
Рекомендуется создать volume и подключить его по пути /var/log/mybpm
внутри пода.
Платформа будет создавать логи внутри этой директории, и параллельно с ними можно разместить директорию для выгрузки файлов heap-dump-ов. Пусть это будет директория:
/var/log/mybpm/heap-dumps
Эту директорию нужно прописать в файле конфигурации генерации heap-dump-файлов.
2. Настройка конфига
В системе конфигурации по пути:
/mybpm/configs/HeapDumpConfig.txt
Настраивается конфиг генерации heap-dump-файлов.
2.1. Настройка имени файла выгрузки
В файле конфигурации нужно прописать префикс heap-dump-файлов следующим образом:
heapDumpFilePrefix=/var/log/mybpm/heap-dumps/DreamSkies-cons3
Префикс состоит из директории, которую мы выбрали в предыдущем разделе этого документа. А дальше идёт префикс имени будущего сгенерированного файла.
Вендор настойчиво рекомендует использовать префикс состоящий из двух частей:
имя Клиента - тире - имя сервера программы
В данном примере имя Клиента - это DreamSkies
, а cons3
- это имя сервера.
Судя по имени сервера на нём запускаются Kafka Consumer-ы.
Данный префикс имени необходим вендеру, чтобы быстро понять от куда файл и с какого сервера. Иначе сопровождение может затянуться.
2.2. Активация процесса выгрузки
Также необходимо активировать сам процесс выгрузки, для этого в конфигурационном файле нужно прописать параметр:
enabled=true
После чего система поймёт, что всё настроена и будет создавать файлы. Но если не настроена переменная
окружения MYBPM_MEMORY_LIMIT
, то файлы создаваться не будут. В следующем разделе это описано.
2.3. Остальные параметры конфига
Остальные параметры конфига можно оставить без изменений.
Дополнительно лишь уточним, что в параметре overflowRamPercent
указывается процент занимаемой памяти программы от
ограничения наложенные на программу. Файлы будут генерировать только в том случае, если этот процент будет превышен.
3. Настройка переменной окружения MYBPM_MEMORY_LIMIT
Чтобы сгенерировать файл программа должна понять, что это нужно сделать - просто так генерировать файл расточительно.
Для этого ей нужно узнать превышен ли установленный процент занимаемой системой памяти.
Для того чтобы рассчитать этот процент, ей нужно знать ограничение по памяти наложенные kubernetes на программу.
Для этого программе нужно сообщить с помощью переменной окружения MYBPM_MEMORY_LIMIT
.
Пример yaml-файла настройки deployment для MyBPM-API:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mybpm-api
labels:
app: mybpm-api
namespace: test
spec:
selector:
matchLabels:
app: mybpm-api
replicas: 1
template:
metadata:
labels:
app: mybpm-api
app-group: mybpm-api
spec:
containers:
- name: main
image: hub.mybpm.kz/mybpm-api
imagePullPolicy: Always
resources:
limits:
memory: "1Gi"
requests:
memory: "1Gi"
ports:
- containerPort: 8080
env:
- name: MYBPM_MEMORY_LIMIT,
valueFrom: { resourceFieldRef: { containerName: main, resource: limits.memory } }
volumeMounts:
- { name: log-dir, mountPath: "/var/log/mybpm" }
volumes:
- name: log-dir
hostPath:
path: /native/path/to/volume
В этом примере указана MYBPM_MEMORY_LIMIT
, которая считывает значение limit.memory
у контейнера с именем main
, который определён чуть выше по коду.
Тем самым программе передаётся наложенное на неё ограничение по памяти.
После того как переменная окружения определена программа начнёт генерировать файлы (в случае превышение процента).
В нашем случае автоматически будет создана директория:
/var/log/mybpm/heap-dumps/
И в ней будут появляться файлы с именем, которе начинается на DreamSkies-cons3-
и заканчивается разрешением .hprof
.
Так же в имя файла будет добавлена текущая дата и время.
4. Предоставление файлов
Сгенерированные файлы нужно передать вендеру для анализа не меняя его имя, так как в нём содержится важная информация.
Это можно сделать средствами администрирования volume-ов, которые Вы используете в своей инфраструктуре.
Если же это сделать затруднительно, то для этого подготовлены REST-сервисы получения сгенерированных файлов.
Вообще есть команда
kubectl cp
Которая предназначена для копирования файлов с пода, но для больших файлов она почему-то не работает. Поэтому есть два REST-сервиса для просмотра и скачивания файлов.
Эти сервисы не доступны из-вне поэтому вначале нужно получить доступ к самим контейнерам. Это можно сделать с помощью командны:
kubectl post-forward -n NS mybpm-api-7f765bb5c5-6dxwf 13000:8080
В этой команде:
NS
замените на имя namespace, которое Вы используете.mybpm-api-7f765bb5c5-6dxwf
замените на имя пода, которое у вас. Посмотреть доступные под-ы можно командой:kubectl get pod --all-namespaces
13000 - это свободный порт на вашей терминальной машине. Можете его поменять на любой свободный.
- 8080 - не меняйте - это порт, который обслуживает сервер программы.
После того как эта команда запустилась, сервер MyBPM-API становиться доступен по
localhost:13000
И можно вызывать REST-сервисы.
Просмотр доступных файлов можно сделать командой:
curl http://localhost:13000/inner/hot-spot/list-available-heap-dump-files | jq
На выходе можно получить что-то вроде
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 238 0 238 0 0 39403 0 --:--:-- --:--:-- --:--:-- 47600
[
{
"name": "DreamSkies-cons3-heap-dump-20240808-041412-916.hprof",
"sizeBytes": 204425284
},
{
"name": "DreamSkies-cons3-heap-dump-20240808-041428-817.hprof",
"sizeBytes": 204424631
},
{
"name": "DreamSkies-cons3-heap-dump-20240808-041421-141.hprof",
"sizeBytes": 204424551
}
]
Т.е. для скачивания доступны три файла - первый самый большой.
Чтобы его скачать можно выполнить команду:
NAME=DreamSkies-cons3-heap-dump-20240808-041412-916.hprof
wget -O $NAME http://localhost:13000/inner/hot-spot/download-available-heap-dump-file?name=$NAME
Убедитесь, что имя файла, которое Вы отправите вендеру, останется исходным.