При переводе инфраструктуры 1С:Предприятие на операционные системы семейства Linux технические специалисты часто сталкиваются со специфическими проблемами производительности. Одной из главных причин замедления работы серверов приложений 1С и раздувания рабочих процессов rphost является неоптимальное распределение оперативной памяти стандартным системным аллокатором glibc. В этой статье мы подробно разберем, как решить эту проблему с помощью альтернативных менеджеров памяти от Microsoft и Google, а также рассмотрим сопутствующие методы оптимизации дисковой подсистемы Linux.
В операционных системах Linux стандартная библиотека glibc использует аллокатор ptmalloc. Данный механизм проектировался как универсальное решение для широкого спектра задач, однако под специфической нагрузкой сервера 1С он начинает работать неэффективно. Процесс rphost представляет собой многопоточное приложение, которое непрерывно выделяет и освобождает сотни тысяч мелких блоков памяти (под таблицы значений, структуры метаданных, временные переменные и запросы).
При такой модели работы стандартный аллокатор страдает от двух ключевых проблем:
rphost лавинообразно потребляет ОЗУ, что приводит к необходимости регулярного перезапуска рабочих процессов.Для решения этих проблем мы можем подменить стандартный системный вызов выделения памяти альтернативным высокопроизводительным решением без изменения исходного кода самой платформы 1С.
Библиотека mimalloc (созданная Microsoft) — это компактный и исключительно быстрый аллокатор памяти общего назначения с отличными показателями локализации данных. Он распределяет память по принципу локальных куч для каждого потока, что полностью исключает взаимные блокировки потоков сервера 1С.
Для файлового или клиентского запуска 1С на Linux-терминале мы можем подключить mimalloc «на лету» с помощью механизма динамической подмены библиотек LD_PRELOAD. Рассмотрим команду запуска:
env MIMALLOC_VERBOSE=1 LD_PRELOAD=/usr/local/lib/libmimalloc.so /opt/1C/v8.3/x86_64/1cestart
Разберем параметры этой команды подробнее:
MIMALLOC_VERBOSE=1 — переменная окружения, которая заставляет библиотеку выводить в консоль отладочную информацию о своем запуске. Это позволяет нам сразу убедиться, что подмена библиотеки прошла успешно.LD_PRELOAD=/usr/local/lib/libmimalloc.so — указывает динамическому линкеру Linux загрузить библиотеку mimalloc раньше стандартной библиотеки glibc, переопределив функции семейства malloc/free./opt/1C/v8.3/x86_64/1cestart — стандартный путь запуска платформы 1С:Предприятие на Linux.Практические тесты на файловых базах 1С (тест Гилева) показывают рост производительности с 108.7 до 119.05 единиц. Таким образом, производительность файловой базы увеличивается почти на 10% просто за счет эффективного управления памятью!
Другой отличный и проверенный временем вариант — использование аллокатора tcmalloc (Thread-Caching Malloc), входящего в пакет gperftools от Google. Этот аллокатор официально рекомендуется самой компанией 1С для оптимизации серверов приложений на Linux.
Рассмотрим, как интегрировать tcmalloc в автозапуск службы сервера 1С:Предприятие. Для этого нам необходимо отредактировать конфигурационный файл службы. В зависимости от дистрибутива Linux и версии платформы это делается через файл окружения службы.
Разберем по шагам процесс настройки службы srv1cv83 на примере Ubuntu Server:
sudo apt-get update
sudo apt-get install libgoogle-perftools4
libtcmalloc_minimal.so:
find /usr/lib/ -name "libtcmalloc_minimal.so*"
Обычно путь выглядит как: /usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4
sudo systemctl edit srv1cv83
[Service]
Environment="LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4"
sudo systemctl daemon-reload
sudo systemctl restart srv1cv83
В результате рабочие процессы rphost запустятся с использованием tcmalloc. Нагрузочные тесты показывают стабильный прирост скорости выполнения операций в районе 10%, а также значительное снижение аппетита процессов к оперативной памяти при длительной работе пользователей.
Если мы стремимся получить максимальную отзывчивость системы на Linux, помимо оптимизации оперативной памяти, обязательно нужно оптимизировать дисковые операции сервера 1С. По умолчанию сервер 1С активно записывает временные файлы сеансов на жесткий диск.
Рекомендуется перенести сеансовые данные (каталог snccntry) в оперативную память с помощью файловой системы tmpfs. Это полностью исключит задержки дискового ввода-вывода (I/O) при чтении и записи временных данных.
Выполним процедуру переноса по шагам:
/home/usr1cv8/.1cv8/1C/1cv8/reg_1541/snccntry
sudo nano /etc/fstab
tmpfs /home/usr1cv8/.1cv8/1C/1cv8/reg_1541/snccntry tmpfs defaults,size=2G,mode=0700,uid=usr1cv8,gid=grp1cv8 0 0
grp1cv8 укажите основную группу пользователя usr1cv8.
snccntry, монтируем новую директорию и запускаем сервер заново:
sudo systemctl stop srv1cv83
sudo rm -rf /home/usr1cv8/.1cv8/1C/1cv8/reg_1541/snccntry/*
sudo mount -a
sudo systemctl start srv1cv83
После переноса сеансовых данных в tmpfs скорость переключения между формами и выполнения транзакций вырастет еще сильнее за счет нулевого времени ожидания дисковой подсистемы.
Многие системные администраторы пытаются подсунуть альтернативные аллокаторы также процессам СУБД PostgreSQL. Важно понимать, что этого делать не нужно. СУБД PostgreSQL использует собственную высокоэффективную архитектуру управления оперативной памятью (разделяемый буферный пул Shared Buffers) и самостоятельно управляет выделением ресурсов. Использование сторонних аллокаторов для процессов СУБД не дает измеримого прироста скорости, а в некоторых случаях может привести к нестабильности работы базы данных.
Практический опыт эксплуатации серверов 1С на ОС Linux с альтернативными аллокаторами памяти показывает стабильные положительные результаты. При использовании mimalloc или tcmalloc на терминальных серверах с файловыми базами потребление памяти в моменты пиковых нагрузок (например, при выгрузках через Конвертацию Данных) снижается в среднем на 600 Мб на сессию. В масштабах серверного кластера это позволяет существенно сэкономить ресурсы оборудования и повысить стабильность работы всей системы.