Технологические вопросы крупных внедрений
21.03.2020

Использование менеджера динамической памяти TCmalloc с платформой 1С:Предприятие версий 8.3.10-8.3.13

Описание проблемы

Опыт эксплуатации платформы 1С:Предприятие на операционной системе Linux показывает, что при длительной работе сервера может наблюдаться значительный рост потребления оперативной памяти приложением. Это приводит к частым перезапускам серверных процессов, что, в свою очередь, затрудняет работу пользователей. Проведенный анализ показал, что рост потребления оперативной памяти не связан с утечками памяти внутри платформы, а вызван фрагментацией памяти. Данная проблема в основном наблюдается при работе платформы 1С:Предприятие именно под управлением ОС Linux, это связано с особенностями алгоритма работы системного менеджера динамической памяти. Проблема не специфична для конкретных дистрибутивов Linux и, по крайней мере, зафиксирована при работе в CentOS(RedHat) 5–7 и Ubuntu 14.04-18.04. Для решения проблемы был рассмотрен вариант замены системного менеджера динамической памяти на другой. По итогам тестирования было выяснено, что наилучшие результаты можно получить при использовании менеджера динамической памяти TCmalloc, входящего в состав пакета Gperftools.

Установка TCmalloc в ОС Linux

Установка TCmalloc в RedHat, CentOS и других совместимых дистрибутивах

Для установки TCmalloc необходимо выполнить команду

Копировать в буфер обмена

yum install gperftools-libs

Установка TCmalloc в Ubuntu и Debian

Для установки TCmalloc необходимо выполнить команду

Копировать в буфер обмена

apt install libtcmalloc-minimal4

Настройка платформы 1С:Предприятие для использования TCmalloc

Определение файла, содержащего необходимую библиотеку

Для 32-разрядных дистрибутивов Linux именем файла с библиотекой TCmalloc является

Копировать в буфер обмена

/usr/lib/libtcmalloc_minimal.so.4

Для 64-разрядных дистрибутивов Ubuntu и Debian именем файла с библиотекой TCmalloc является

Копировать в буфер обмена

/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4

Для 64-разрядных дистрибутивов RedHat и CentOS именем файла с библиотекой TCmalloc является

Копировать в буфер обмена

/usr/lib64/libtcmalloc_minimal.so.4

Определение настроек TCmalloc

Библиотека TCmalloс имеет некоторое количество настроек, которые можно определить через переменные окружения. Наибольшее влияние имеет настройка общего количества памяти, выделяемого под потоковый кэш. Эта настройка задается переменной окружения TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES и, по нашему опыту, ее оптимальное значение должно быть не менее 256МБ, то есть необходимо установить TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=268435456. Этого значения достаточно для работы как минимум 100 пользователей на сервере. В случае меньшей нагрузки это значение можно уменьшить.

Настройка сценария запуска платформы 1С:Предприятие

При установке платформы 1С:предприятие из deb- или rpm-пакетов сценарий запуска находится в файле /etc/init.d/srv1cv83. Данный файл необходимо открыть в редакторе и найти функцию start(), для этого нужно поискать строчку “function start”. Внутри этой функции нас интересует следующий фрагмент кода:

Копировать в буфер обмена

# run our process
if [ -z "$SRV1CV8_USER" ]; then
   export KRB5_KTNAME="$SRV1CV8_KEYTAB"
   $cmd2run
else
   su -s /bin/bash - "$SRV1CV8_USER" –c "KRB5_KTNAME=\"$SRV1CV8_KEYTAB\" $cmd2run"
fi

Этот код необходимо модифицировать следующим образом:

Копировать в буфер обмена

# run our process
LIBTCMALLOC=имя_файла_с_библиотекой
if [ -z "$SRV1CV8_USER" ]; then
   export KRB5_KTNAME="$SRV1CV8_KEYTAB"
   export TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=268435456
   export LD_PRELOAD=${LIBTCMALLOC}
   $cmd2run
else
   su -s /bin/bash - "$SRV1CV8_USER" –c "KRB5_KTNAME=\"$SRV1CV8_KEYTAB\" TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=268435456 LD_PRELOAD=${LIBTCMALLOC} $cmd2run"
fi

Примечание: Код, начинающийся с “su -” и заканчивающийся на “$cmd2run"” должен размещаться в одной строке файла. После редактирования файла запуск сервера происходит как обычно, никаких других действий не требуется.

Настройка запуска платформы 1С:Предприятие при использовании собственных сценариев.

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

Копировать в буфер обмена

export TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=268435456
export LD_PRELOAD=имя_файла_с_библиотекой путь_к_каталогу_с_платформой/ragent

или (в одной строке)

Копировать в буфер обмена

TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=268435456 LD_PRELOAD=имя_файла_с_библиотекой путь_к_каталогу_с_платформой/ragent

Выгоды от использования TCmalloc

Результаты опытной эксплуатации показывают, что использование TCmalloc позволяет в большинстве случаев полностью решить проблему с фрагментацией памяти или значительно уменьшить ее влияние. Кроме этого, при одинаковых сценариях использования TCmalloc может дать до 20% экономии памяти и до 10% увеличения производительности по сравнению со стандартным системным менеджером памяти.