mybpm!
Скачать в формате: PDF pdf DOCX word

Генерация heap-dump-файлов

На платформе предусмотрена возможность генерации heap-dump-файлов при условии, если программа превысила потребляемую память больше определённого процента от предоставленного ей. Это может потребоваться для анализа утечек по памяти, а так же других данных.

Для настройки генерации heap-dump-файлов необходимо:

  1. подготовить директорию, куда будут выгружаться эти файлы. Эта директория должна быть доступна программе платформы MyBPM на запись.
  2. настроить параметры генерации в конфиге /mybpm/configs/HeapDumpConfig.txt
  3. прописать переменную окружения 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

В этой команде:

После того как эта команда запустилась, сервер 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

Убедитесь, что имя файла, которое Вы отправите вендеру, останется исходным.