java.lang.RuntimeException: wXb6Vnl31u :: Ошибка для HTML= 001 003 004
005 006На платформе предусмотрена возможность генерации 013 heap-dump-файлов при условии, если программа превысила потребляемую 014 память больше определённого процента от предоставленного ей. Это 015 может потребоваться для анализа утечек по памяти, а так же других 016 данных.
017 018Для настройки генерации heap-dump-файлов необходимо:
019 020/mybpm/configs/HeapDumpConfig.txt
MYBPM_MEMORY_LIMIT
После этого можно будет просматривать сгенерированные файлы и 033 выгружать их с помощью REST-сервисов.
034 035Так как программа размещается в поде Kubernetes, то директорию 038 нужно подготовить внутри пода. Директория должна быть 039 подсоединяемым volume-ом. Иначе при падении программы все файлы 040 будут стёрты и станут недоступны для анализа.
041 042Если директория логов уже имеет свой volume, то можно 043 использовать этот же volume.
044 045Платформа, по умолчанию, логи выгружает в директорию
046 /var/log/mybpm
. Эту директорию можно сменить
047 переменной окружения: MYBPM_LOG_DIR
. Если эта
048 переменная окружения не определена, то директория будет по
049 умолчанию.
Рекомендуется создать volume и подключить его по пути
052 /var/log/mybpm
внутри пода.
Платформа будет создавать логи внутри этой директории, и 055 параллельно с ними можно разместить директорию для выгрузки файлов 056 heap-dump-ов. Пусть это будет директория:
057 058
059 /var/log/mybpm/heap-dumps
060
061
062
063
064
065 Эту директорию нужно прописать в файле конфигурации генерации 066 heap-dump-файлов.
067 068В системе конфигурации по пути:
071 072
073 /mybpm/configs/HeapDumpConfig.txt
074
075
076
077
078
079 Настраивается конфиг генерации heap-dump-файлов.
080 081В файле конфигурации нужно прописать префикс heap-dump-файлов 084 следующим образом:
085 086
087 heapDumpFilePrefix=/var/log/mybpm/heap-dumps/DreamSkies-cons3
088
089
090
091
092
093 Префикс состоит из директории, которую мы выбрали в предыдущем 094 разделе этого документа. А дальше идёт префикс имени будущего 095 сгенерированного файла.
096 097Вендор настойчиво рекомендует использовать префикс состоящий из 098 двух частей:
099 100
101 имя Клиента - тире - имя сервера программы
102
103
104
105
106
107 В данном примере имя Клиента - это DreamSkies
, а
108 cons3
- это имя сервера. Судя по имени сервера на нём
109 запускаются Kafka Consumer-ы.
Данный префикс имени необходим вендеру, чтобы быстро понять от 112 куда файл и с какого сервера. Иначе сопровождение может 113 затянуться.
114 115Также необходимо активировать сам процесс выгрузки, для этого в 118 конфигурационном файле нужно прописать параметр:
119 120
121 enabled=true
122
123
124
125
126
127 После чего система поймёт, что всё настроена и будет создавать
128 файлы. Но если не настроена переменная окружения
129 MYBPM_MEMORY_LIMIT
, то файлы создаваться не будут. В
130 следующем разделе это описано.
Остальные параметры конфига можно оставить без изменений.
135 136Дополнительно лишь уточним, что в параметре
137 overflowRamPercent
указывается процент занимаемой
138 памяти программы от ограничения наложенные на программу. Файлы
139 будут генерировать только в том случае, если этот процент будет
140 превышен.
Чтобы сгенерировать файл программа должна понять, что это нужно
146 сделать - просто так генерировать файл расточительно. Для этого ей
147 нужно узнать превышен ли установленный процент занимаемой системой
148 памяти. Для того чтобы рассчитать этот процент, ей нужно знать
149 ограничение по памяти наложенные kubernetes на программу. Для этого
150 программе нужно сообщить с помощью переменной окружения
151 MYBPM_MEMORY_LIMIT
.
Пример yaml-файла настройки deployment для MyBPM-API:
154 155
156 apiVersion: apps/v1
157 kind: Deployment
158 metadata:
159 name: mybpm-api
160 labels:
161 app: mybpm-api
162 namespace: test
163 spec:
164 selector:
165 matchLabels:
166 app: mybpm-api
167 replicas: 1
168 template:
169 metadata:
170 labels:
171 app: mybpm-api
172 app-group: mybpm-api
173 spec:
174 containers:
175 - name: main
176 image: hub.mybpm.kz/mybpm-api
177 imagePullPolicy: Always
178 resources:
179 limits:
180 memory: "1Gi"
181 requests:
182 memory: "1Gi"
183 ports:
184 - containerPort: 8080
185 env:
186 - name: MYBPM_MEMORY_LIMIT,
187 valueFrom: { resourceFieldRef: { containerName: main, resource: limits.memory } }
188 volumeMounts:
189 - { name: log-dir, mountPath: "/var/log/mybpm" }
190 volumes:
191 - name: log-dir
192 hostPath:
193 path: /native/path/to/volume
194
195
196
197 В этом примере указана MYBPM_MEMORY_LIMIT
, которая
198 считывает значение limit.memory
у контейнера с именем
199 main
, который определён чуть выше по коду.
Тем самым программе передаётся наложенное на неё ограничение по 202 памяти.
203 204После того как переменная окружения определена программа начнёт 205 генерировать файлы (в случае превышение процента).
206 207В нашем случае автоматически будет создана директория:
208 209
210 /var/log/mybpm/heap-dumps/
211
212
213
214
215
216 И в ней будут появляться файлы с именем, которе начинается на
217 DreamSkies-cons3-
и заканчивается разрешением
218 .hprof
. Так же в имя файла будет добавлена текущая
219 дата и время.
Сгенерированные файлы нужно передать вендеру для анализа не 224 меняя его имя, так как в нём содержится важная информация.
225 226Это можно сделать средствами администрирования volume-ов, 227 которые Вы используете в своей инфраструктуре.
228 229Если же это сделать затруднительно, то для этого подготовлены 230 REST-сервисы получения сгенерированных файлов.
231 232Вообще есть команда
233 234
235 kubectl cp
236
237
238
239
240
241 Которая предназначена для копирования файлов с пода, но для 242 больших файлов она почему-то не работает. Поэтому есть два 243 REST-сервиса для просмотра и скачивания файлов.
244 245Эти сервисы не доступны из-вне поэтому вначале нужно получить 246 доступ к самим контейнерам. Это можно сделать с помощью 247 командны:
248 249
250 kubectl post-forward -n NS mybpm-api-7f765bb5c5-6dxwf 13000:8080
251
252
253
254
255
256 В этой команде:
257 258NS
замените на имя namespace, которое Вы
260 используете.mybpm-api-7f765bb5c5-6dxwf
замените на имя пода,
264 которое у вас. Посмотреть доступные под-ы можно командой:
kubectl get pod --all-namespaces
26713000 - это свободный порт на вашей терминальной машине. Можете 271 его поменять на любой свободный.
272После того как эта команда запустилась, сервер MyBPM-API 279 становиться доступен по
280 281
282 localhost:13000
283
284
285
286
287
288 И можно вызывать REST-сервисы.
289 290Просмотр доступных файлов можно сделать командой:
291 292
293 curl http://localhost:13000/inner/hot-spot/list-available-heap-dump-files | jq
294
295
296
297
298
299 На выходе можно получить что-то вроде
300 301
302 % Total % Received % Xferd Average Speed Time Time Time Current
303 Dload Upload Total Spent Left Speed
304 100 238 0 238 0 0 39403 0 --:--:-- --:--:-- --:--:-- 47600
305 [
306 {
307 "name": "DreamSkies-cons3-heap-dump-20240808-041412-916.hprof",
308 "sizeBytes": 204425284
309 },
310 {
311 "name": "DreamSkies-cons3-heap-dump-20240808-041428-817.hprof",
312 "sizeBytes": 204424631
313 },
314 {
315 "name": "DreamSkies-cons3-heap-dump-20240808-041421-141.hprof",
316 "sizeBytes": 204424551
317 }
318 ]
319
320
321
322 Т.е. для скачивания доступны три файла - первый самый 323 большой.
324 325Чтобы его скачать можно выполнить команду:
326 327
328 NAME=DreamSkies-cons3-heap-dump-20240808-041412-916.hprof
329 wget -O $NAME http://localhost:13000/inner/hot-spot/download-available-heap-dump-file?name=$NAME
330
331
332
333
334
335 Убедитесь, что имя файла, которое Вы отправите вендеру, 336 останется исходным.
337