Как ускорить работу 1С:Предприятие на Linux с помощью аллокаторов памяти mimalloc и tcmalloc

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переводе инфраструктуры 1С:Предприятие на операционные системы семейства Linux технические специалисты часто сталкиваются со специфическими проблемами производительности. Одной из главных причин замедления работы серверов приложений 1С и раздувания рабочих процессов rphost является неоптимальное распределение оперативной памяти стандартным системным аллокатором glibc. В этой статье мы подробно разберем, как решить эту проблему с помощью альтернативных менеджеров памяти от Microsoft и Google, а также рассмотрим сопутствующие методы оптимизации дисковой подсистемы Linux.

Выясняем причину: почему стандартный glibc malloc замедляет 1С

В операционных системах Linux стандартная библиотека glibc использует аллокатор ptmalloc. Данный механизм проектировался как универсальное решение для широкого спектра задач, однако под специфической нагрузкой сервера 1С он начинает работать неэффективно. Процесс rphost представляет собой многопоточное приложение, которое непрерывно выделяет и освобождает сотни тысяч мелких блоков памяти (под таблицы значений, структуры метаданных, временные переменные и запросы).

При такой модели работы стандартный аллокатор страдает от двух ключевых проблем:

  1. Блокировки потоков (Lock Contention): Потоки сервера 1С вынуждены конкурировать за доступ к аренам памяти. Возникают задержки на уровне ядра ОС, когда один поток ожидает освобождения арены другим потоком.
  2. Фрагментация памяти (Memory Fragmentation): Освобожденная память не возвращается в операционную систему сразу, а фрагментируется внутри кучи процесса. В результате процесс rphost лавинообразно потребляет ОЗУ, что приводит к необходимости регулярного перезапуска рабочих процессов.

Для решения этих проблем мы можем подменить стандартный системный вызов выделения памяти альтернативным высокопроизводительным решением без изменения исходного кода самой платформы 1С.

Решение №1: Использование Microsoft mimalloc для 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

Разберем параметры этой команды подробнее:

Практические тесты на файловых базах 1С (тест Гилева) показывают рост производительности с 108.7 до 119.05 единиц. Таким образом, производительность файловой базы увеличивается почти на 10% просто за счет эффективного управления памятью!

Решение №2: Использование Google tcmalloc

Другой отличный и проверенный временем вариант — использование аллокатора tcmalloc (Thread-Caching Malloc), входящего в пакет gperftools от Google. Этот аллокатор официально рекомендуется самой компанией 1С для оптимизации серверов приложений на Linux.

Рассмотрим, как интегрировать tcmalloc в автозапуск службы сервера 1С:Предприятие. Для этого нам необходимо отредактировать конфигурационный файл службы. В зависимости от дистрибутива Linux и версии платформы это делается через файл окружения службы.

Разберем по шагам процесс настройки службы srv1cv83 на примере Ubuntu Server:

  1. Устанавливаем библиотеку в операционную систему:
    
    sudo apt-get update
    sudo apt-get install libgoogle-perftools4
    
  2. Находим путь к установленной библиотеке libtcmalloc_minimal.so: find /usr/lib/ -name "libtcmalloc_minimal.so*" Обычно путь выглядит как: /usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4
  3. Создаем переопределение (override) для systemd-службы сервера 1С, чтобы настройки не сбросились при обновлении платформы: sudo systemctl edit srv1cv83
  4. В открывшемся текстовом редакторе добавляем блок конфигурации:
    
    [Service]
    Environment="LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4"
    
  5. Перезапускаем демона systemd и службу сервера 1С:
    
    sudo systemctl daemon-reload
    sudo systemctl restart srv1cv83
    

В результате рабочие процессы rphost запустятся с использованием tcmalloc. Нагрузочные тесты показывают стабильный прирост скорости выполнения операций в районе 10%, а также значительное снижение аппетита процессов к оперативной памяти при длительной работе пользователей.

Дополнительная оптимизация: перенос сеансовых данных в tmpfs

Если мы стремимся получить максимальную отзывчивость системы на Linux, помимо оптимизации оперативной памяти, обязательно нужно оптимизировать дисковые операции сервера 1С. По умолчанию сервер 1С активно записывает временные файлы сеансов на жесткий диск.

Рекомендуется перенести сеансовые данные (каталог snccntry) в оперативную память с помощью файловой системы tmpfs. Это полностью исключит задержки дискового ввода-вывода (I/O) при чтении и записи временных данных.

Выполним процедуру переноса по шагам:

  1. Определяем местоположение каталога сеансовых данных. По умолчанию на Linux это путь: /home/usr1cv8/.1cv8/1C/1cv8/reg_1541/snccntry
  2. Добавляем монтирование виртуального диска в оперативной памяти. Открываем файл конфигурации монтирования дисков: sudo nano /etc/fstab
  3. Добавляем в конец файла строку (размер диска выберите исходя из доступной ОЗУ и количества активных пользователей, например, 2 Гигабайта):
    
    tmpfs /home/usr1cv8/.1cv8/1C/1cv8/reg_1541/snccntry tmpfs defaults,size=2G,mode=0700,uid=usr1cv8,gid=grp1cv8 0 0
    
    Вместо grp1cv8 укажите основную группу пользователя usr1cv8.
  4. Останавливаем сервер 1С, очищаем старое содержимое папки 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. Важно понимать, что этого делать не нужно. СУБД PostgreSQL использует собственную высокоэффективную архитектуру управления оперативной памятью (разделяемый буферный пул Shared Buffers) и самостоятельно управляет выделением ресурсов. Использование сторонних аллокаторов для процессов СУБД не дает измеримого прироста скорости, а в некоторых случаях может привести к нестабильности работы базы данных.

Анализируем результаты и делаем выводы

Практический опыт эксплуатации серверов 1С на ОС Linux с альтернативными аллокаторами памяти показывает стабильные положительные результаты. При использовании mimalloc или tcmalloc на терминальных серверах с файловыми базами потребление памяти в моменты пиковых нагрузок (например, при выгрузках через Конвертацию Данных) снижается в среднем на 600 Мб на сессию. В масштабах серверного кластера это позволяет существенно сэкономить ресурсы оборудования и повысить стабильность работы всей системы.

← На главную