Настройка использования памяти и многопоточности
Один сервис PXF (процесс, работающий внутри JVM) обслуживает несколько сегментов на сегментном хосте. При параллельных рабочих нагрузках или при выполнении запросов к большим файлам размер JVM heap для PXF может стать ограничивающим фактором: запросы могут зависать или завершаться с ошибкой из‑за нехватки памяти, либо сборщик мусора Java может увеличивать время отклика.
Для устранения этих проблем можно увеличить максимальный размер JVM heap либо уменьшить максимальное число потоков Tomcat. Также можно настроить автоматическое завершение работы сервера PXF (по умолчанию эта функция активирована) либо активировать создание дампа JVM heap в ситуации нехватки памяти (out-of-memory, OOM).
Увеличение размера JVM heap
По умолчанию каждый сервис PXF на каждом хосте Greengage DB сконфигурирован с максимальным размером JVM heap в 2 ГБ и начальным размером 1 ГБ. Если на хостах Greengage DB достаточно свободной памяти, попробуйте увеличить максимальный размер heap. При большой нагрузке рекомендуется устанавливать одинаковые значения начального и максимального размера heap.
Чтобы увеличить размер heap для сервисов PXF, работающих на каждом хосте кластера Greengage DB:
-
Подключитесь к мастер-хосту Greengage DB как
gpadmin. -
Откройте файл $PXF_BASE/conf/pxf-env.sh в текстовом редакторе и установите требуемые значения
-Xmxи-XmsсвойстваPXF_JVM_OPTS, например:PXF_JVM_OPTS="-Xmx3g -Xms3g" -
Сохраните и закройте файл.
-
Синхронизируйте конфигурацию между хостами кластера Greengage DB, а затем перезапустите PXF на всех хостах:
$ pxf cluster sync $ pxf cluster restart
Выбор действий для ситуаций OOM
В ситуации нехватки памяти PXF возвращает следующую ошибку в ответе на запрос:
ERROR: PXF server error : JVM heap space
PXF можно настроить на выполнение следующих действий в случае OOM:
-
Автоматическое завершение работы сервера PXF (по умолчанию активировано).
-
Создание дампа JVM heap (по умолчанию деактивировано).
Автоматическое завершение работы сервера PXF
По умолчанию в PXF активировано автоматическое завершение работы сервиса PXF при возникновении OOM.
Поведение автоматического завершения работы регулируется переменной окружения PXF_OOM_KILL в конфигурационном файле $PXF_BASE/conf/pxf-env.sh.
Если автоматическое завершение работы включено и JVM завершает работу сервиса PXF из-за OOM, выполняются следующие действия:
-
PXF отправляет сообщение в лог-файл $PXF_LOGDIR/pxf-oom.log на сегментном хосте:
=====> <date> PXF Out of memory detected <====== =====> <date> PXF shutdown scheduled <====== =====> <date> Stopping PXF <======
-
Пока не будет перезапущен сервис PXF на сегментном хосте, все запросы PXF к внешним таблицам завершаются следующей ошибкой:
... Failed to connect to <host> port 5888: Connection refused
Если сервис PXF на хосте остановлен вследствие OOM, необходимо вручную перезапустить его командой pxf start.
Полное описание команд PXF приведено в статье Обзор команд pxf.
Создание дампа JVM heap
При нехватке памяти может быть полезным создать дамп JVM heap для помощи в определении причины сбоя.
Создание дампа JVM heap в PXF можно настроить с помощью переменной окружения PXF_OOM_DUMP_PATH в конфигурационном файле $PXF_BASE/conf/pxf-env.sh.
По умолчанию создание дампа JVM heap в PXF в случае OOM не активировано.
Для его активации необходимо установить в качестве значения переменной окружения PXF_OOM_DUMP_PATH абсолютный путь к файлу или каталогу.
Убедитесь, что указанный путь к файлу или каталогу доступен для записи пользователю gpadmin.
-
Если указан каталог, дамп JVM heap записывается в файл <directory>/java_pid<pid>.hprof, где
<pid>— идентификатор процесса сервиса PXF. При каждом новом случае OOM в каталоге создается новый файл. -
Если указан несуществующий файл, JVM, используемая PXF, создает этот файл и записывает в него дамп JVM heap. Если файл уже существует, дамп JVM heap не записывается.
Дампы JVM heap зачастую достаточно объемны.
Если активирована запись дампа JVM heap в случае OOM, а в качестве значения переменной окружения PXF_OOM_DUMP_PATH указан каталог, то несколько файлов в этом каталоге могут занять большой объем дискового пространства.
Если в качестве значения переменной окружения PXF_OOM_DUMP_PATH указан файл, то объем дискового пространства, занимаемый дампами JVM heap, не меняется, если не меняется имя файла.
Для записи последующих дампов требуется либо переименовать файл, либо изменить значение PXF_OOM_DUMP_PATH.
Настройка действий по умолчанию для ситуаций OOM
Автоматическое завершение работы сервиса PXF в случае OOM по умолчанию активировано. Создание дампа JVM heap в случае OOM по умолчанию не активировано.
Для конфигурирования этих действий:
-
Подключитесь к мастер-хосту Greengage DB как
gpadmin. -
Откройте файл $PXF_BASE/conf/pxf-env.sh в текстовом редакторе.
-
Для конфигурирования автоматического завершения работы сервиса PXF в случае OOM раскомментируйте свойство
PXF_OOM_KILLи установите требуемое значение. Например, для выключения автоматического завершения работы сервиса PXF в случае OOM установите значениеfalse:export PXF_OOM_KILL=false -
Для конфигурирования автоматической записи дампа JVM heap в случае OOM раскомментируйте свойство
PXF_OOM_DUMP_PATHи установите требуемое значение. Чтобы включить запись дампа JVM heap, укажите путь в файловой системе, по которому должен сохраняться файл дампа. Например, для записи дампа JVM heap в файл /home/gpadmin/pxf_oom_dump:export PXF_OOM_DUMP_PATH=/home/gpadmin/pxf_oom_dumpДля отключения записи дампа JVM heap в случае OOM закомментируйте свойство
PXF_OOM_DUMP_PATH:#export PXF_OOM_DUMP_PATH=/home/gpadmin/pxf_oom_dump
-
-
Сохраните и закройте файл.
-
Синхронизируйте конфигурацию между хостами кластера Greengage DB, а затем перезапустите PXF на всех хостах:
$ pxf cluster sync $ pxf cluster restart
Изменение количества работающих потоков Tomcat
Если увеличить максимальный размер JVM heap в кластере Greengage DB невозможно, то можно изменить количество одновременно работающих потоков встроенного в PXF веб-сервера Tomcat. Уменьшение количества работающих потоков предотвратит исчерпание памяти сервером PXF, при этом текущие запросы будут выполнены (хотя и медленнее). По умолчанию Tomcat ставит запросы в очередь — до тех пор, пока не освободится поток, либо пока очередь не опустеет.
Количество потоков Tomcat по умолчанию для PXF — 200.
Значение контролируется параметром pxf.max.threads в конфигурационном файле pxf-application.properties.
Увеличение количества потоков ведет к росту потребления памяти.
При работе с большим числом файлов во внешнем хранилище данных Hive либо при чтении сжатых данных в формате ORC или Parquet рекомендуется указать меньшее значение параметра pxf.max.threads — это ограничит уровень параллелизма и потребление памяти.
Чтобы установить максимальное количество потоков Tomcat для сервиса PXF:
-
Подключитесь к мастер-хосту Greengage DB как
gpadmin. -
Откройте файл $PXF_BASE/conf/pxf-application.properties в текстовом редакторе, раскомментируйте свойство
pxf.max.threadsи установите требуемое значение. Например, чтобы уменьшить максимальное количество потоков Tomcat до 100:pxf.max.threads=100 -
Сохраните и закройте файл.
-
Синхронизируйте конфигурацию между хостами кластера Greengage DB, а затем перезапустите PXF на всех хостах:
$ pxf cluster sync $ pxf cluster restart