Технологические вопросы крупных внедрений
21.03.2020
Опыт эксплуатации платформы 1С:Предприятие на операционной системе Linux показывает, что при длительной работе сервера может наблюдаться значительный рост потребления оперативной памяти приложением. Это приводит к частым перезапускам серверных процессов, что, в свою очередь, затрудняет работу пользователей. Проведенный анализ показал, что рост потребления оперативной памяти не связан с утечками памяти внутри платформы, а вызван фрагментацией памяти. Данная проблема в основном наблюдается при работе платформы 1С:Предприятие именно под управлением ОС Linux, это связано с особенностями алгоритма работы системного менеджера динамической памяти. Проблема не специфична для конкретных дистрибутивов Linux и, по крайней мере, зафиксирована при работе в CentOS(RedHat) 5–7 и Ubuntu 14.04-18.04. Для решения проблемы был рассмотрен вариант замены системного менеджера динамической памяти на другой. По итогам тестирования было выяснено, что наилучшие результаты можно получить при использовании менеджера динамической памяти TCmalloc, входящего в состав пакета Gperftools.
Для установки TCmalloc необходимо выполнить команду
Копировать в буфер обменаyum install gperftools-libs
Для установки TCmalloc необходимо выполнить команду
Копировать в буфер обменаapt install libtcmalloc-minimal4
Для 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
Библиотека TCmalloс имеет некоторое количество настроек, которые можно определить через переменные окружения. Наибольшее влияние имеет настройка общего количества памяти, выделяемого под потоковый кэш. Эта настройка задается переменной окружения TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES и, по нашему опыту, ее оптимальное значение должно быть не менее 256МБ, то есть необходимо установить TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=268435456. Этого значения достаточно для работы как минимум 100 пользователей на сервере. В случае меньшей нагрузки это значение можно уменьшить.
При установке платформы 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"” должен размещаться в одной строке файла. После редактирования файла запуск сервера происходит как обычно, никаких других действий не требуется.
Если стандартный сценарий запуска платформы не используется, или запуск осуществляется вручную, настройка выполняется аналогично. Например, при запуске из командной строки нужно написать
Копировать в буфер обменаexport TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=268435456
export LD_PRELOAD=имя_файла_с_библиотекой путь_к_каталогу_с_платформой/ragent
или (в одной строке)
Копировать в буфер обменаTCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=268435456 LD_PRELOAD=имя_файла_с_библиотекой путь_к_каталогу_с_платформой/ragent
Результаты опытной эксплуатации показывают, что использование TCmalloc позволяет в большинстве случаев полностью решить проблему с фрагментацией памяти или значительно уменьшить ее влияние. Кроме этого, при одинаковых сценариях использования TCmalloc может дать до 20% экономии памяти и до 10% увеличения производительности по сравнению со стандартным системным менеджером памяти.