Как перехватить дампы кучи при выходе из JVM, не влияя на службу ECS? - PullRequest
1 голос
/ 09 марта 2019

Мое приложение на основе JVM работает на Amazon ECS. При некоторых условиях, которые я не могу воспроизвести в тестовых средах, происходит сбой с OutOfMemoryError. Я хочу захватить дамп кучи JVM (используя HeapDumpOnOutOfMemoryError), чтобы увидеть, что происходит. Но есть проблема - поскольку мое приложение использует много памяти, сброс кучи занимает очень много времени, и ECS убивает контейнер в середине этого процесса, потому что проверки работоспособности не выполняются. Я получаю непригодный усеченный файл дампа.

Я могу получить правильный дамп кучи, изменив конфигурацию проверки работоспособности, но это может повлиять на службу ECS, поскольку без качественной проверки работоспособности кластер может запускать неотвечающие экземпляры.

Я ищу способ, который позволил бы мне автоматически захватывать дампы кучи с минимальным воздействием на производственный кластер.

1 Ответ

0 голосов
/ 09 марта 2019

Как я нашел:

  1. подготовить копию вашей услуги ECS (Service2), идентичную во всем, но:
    • настройки проверки работоспособности (отключить проверки работоспособности)
    • опция HeapDumpOnOutOfMemoryError JVM (включите ее)
    • количество узлов (установлено в 1)
  2. заставить Service2 обрабатывать производственный трафик вместе с существующим Service1 (например, путем маршрутизации HTTP-трафика через балансировщик нагрузки, который перенаправляет трафик как в Service1, так и в Service2)
  3. подождите, пока узел, на котором работает задача ECS Service2, не создаст дамп кучи JVM
  4. уменьшить Service2 до нуля узлов
...