- Контекст и ретроспектива: выполняем обещания Roadmap
- Анатомия виртуальной памяти Linux: физика поведения под нагрузкой 1С и PostgreSQL
- Ликвидация скрытого стопора СУБД: двухуровневое отключение Transparent Huge Pages
- Сетевой стек ядра и дескрипторы: защита от шторма подключений и лимиты systemd
- Автоматизация через IaC: декларативная Ansible-роль linux_tuning
- Экспресс-диагностика инфраструктуры: утилита аудита sre-1c-pg-healthcheck.sh
- Итоги первого этапа и Roadmap: что ждёт читателей в следующих выпусках
- Предыдущие материалы цикла
🏛 Контекст и ретроспектива: выполняем обещания Roadmap
В предыдущих четырёх частях открытого инженерного цикла SRE-Suite-for-1C-platform мы последовательно разворачивали контур надёжности корпоративного уровня на базе Linux:
- Часть 1: Заложили принципы Infrastructure as Code (IaC), внедрили 5 рубежей обороны в сборочный скрипт
1c-ci-linux-build-v4.shдля защиты от «ложного успеха» (False Success) и реализовали внешнюю ротацию рабочих процессовrphostчерез RAS API. - Часть 2: Построили детерминированный CI/CD-пайплайн в GitHub Actions, решили проблему потери широковещательных UDP-пакетов сетевых HASP-ключей через
--net=hostи устранили коллизии параллельных сборок через динамическийRUN_ID. - Часть 3: Исключили хранение незащищённых боевых дампов при подготовке dev-стендов: реализовали потоковое маскирование
pg_anonв Unix-пайпах с платформенной пост-обработкойpost-anonymize-1c.bslбез единого прямого SQL-обращения к таблицам базы. - Часть 4: Развернули 3-нодовый отказоустойчивый кластер PostgreSQL под управлением Patroni и etcd, полностью устранили прокси-задержки HAProxy с помощью связки
vip-managerи параметраnet.ipv4.ip_nonlocal_bind = 1.
В финале четвёртой статьи мы зафиксировали обязательство: спуститься на уровень операционной системы и представить инженерные сценарии глубокой оптимизации ядра Linux под совместную работу PostgreSQL и платформы 1С.
Важно (соблюдение регламентов модерации Infostart): Все рассматриваемые механизмы действуют исключительно на уровне инфраструктуры ОС Linux и документированных настроек СУБД PostgreSQL. Они не затрагивают структуру метаданных конфигураций 1С, не подменяют регламентные процедуры платформы прямыми SQL-командами и полностью соответствуют официальным требованиям фирмы «1С» к эксплуатации высоконагруженных систем.
📂 Анатомия виртуальной памяти Linux: физика поведения под нагрузкой 1С и PostgreSQL
Главный вызов при эксплуатации СУБД PostgreSQL и сервера приложений «1С:Предприятие» в среде Linux — это жёсткая конкуренция за физическую оперативную память (RAM) и дисковый ввод-вывод (I/O).
Рабочие процессы rphost и бэкенды postgres непрерывно выделяют и освобождают анонимную память под выборки, кэши и агрегаты. Если подсистема виртуальной памяти Linux настроена по умолчанию, поведение стандартного менеджера страниц ядра становится деструктивным для транзакционной OLTP-нагрузки.
1.1. Борьба со скрытым вытеснением: vm.swappiness
По умолчанию в дистрибутивах Ubuntu, Debian и Astra Linux значение vm.swappiness = 60. Это алгоритмический коэффициент балансировки ядра: насколько агрессивно нужно сбрасывать анонимную память процессов в swap вместо вымывания дискового кэша (Page Cache).
При значении 60 ядро вытесняет страницы памяти rphost и PostgreSQL на диск задолго до того, как закончится физическая память. Суммарный объём процесса в Linux складывается из резидентной физической памяти (VmRSS) и вытесненного свопа (VmSwap). Когда пользователь 1С нажимает «Провести документ», заблокированный рабочий процесс обращается к странице памяти, а ядро экстренно считывает её со swap-раздела. Возникает микро-пауза (I/O stall) длительностью от 50 до 800 миллисекунд.
- Опасное значение:
vm.swappiness = 60(дефолт ОС). - Инженерный стандарт SRE-Suite-for-1C-platform:
vm.swappiness = 1..10. - Физика эффекта: Ядро держит рабочие структуры процессов в физической памяти до последнего момента, а swap используется исключительно в качестве предохранителя от катастрофического падения системы.
1.2. Сброс грязных страниц: байтовые лимиты вместо процентов
В процессе активной записи (массовое проведение документов, CHECKPOINT в PostgreSQL, фоновые задания, ночное маскирование данных через pg_anon) данные сначала накапливаются в Page Cache в виде «грязных» страниц (dirty pages).
По умолчанию в ядре заданы относительные лимиты:
vm.dirty_background_ratio = 10(демон ядраkworker/flushначинает фоновый сброс данных на диск при достижении 10% оперативной памяти).vm.dirty_ratio = 20(при достижении 20% блокируются все пишущие процессы до завершения принудительного сброса на накопитель).
В чём ловушка масштаба: На сервере со 128 ГБ RAM порог в 20% составляет ~25 ГБ, а на 256 ГБ — свыше 50 ГБ. Когда дисковый контроллер упирается в потолок записи при сбросе 50 ГБ данных, сервер впадает в ступор. В технологическом журнале 1С лавинообразно фиксируются длительные события SDBL и DBPOSTGRS с тайм-аутами, а пользователи получают сообщение «Сеанс работы завершен администратором».
(Примечание в соответствии с п. 2.2.30 правил Infostart: рассматриваемые объёмы 128–256 ГБ представляют собой обобщённый профиль оборудования, сформированный на основе опыта сопровождения высоконагруженных контуров; конкретные цифры приведены как усреднённый инженерный ориентир масштабирования).
Оптимальная стратегия: переход на абсолютные байтовые лимиты. В ядре параметры *_ratio и *_bytes взаимно исключают друг друга. Назначение абсолютных значений автоматически сбрасывает проценты в ноль:
Это стабилизирует график дискового ввода-вывода в ровную предсказуемую линию без экстремальных пиковых задержек.
1.3. Архитектура аллокации: vm.overcommit_memory
По умолчанию ядро функционирует в режиме vm.overcommit_memory = 0 (эвристический оверкоммит): процессам разрешается запрашивать память авансом. Если лимит исчерпан, активируется OOM-Killer и уничтожает наиболее «прожорливый» процесс.
Инженерные настройки зависят от физического разделения ролей серверов:
| Сценарий архитектуры | Рекомендация vm.overcommit_memory | Инженерное обоснование |
|---|---|---|
| Выделенный узел СУБД (нода кластера Patroni) |
vm.overcommit_memory = 2vm.overcommit_ratio = 80..90 |
Строгий запрет оверкоммита: ядро отклоняет запросы памяти сверх CommitLimit (RAM × ratio + Swap). Исключает внезапное завершение процессов PostgreSQL демоном OOM-Killer. |
| Совмещённый узел (1С:Предприятие + PostgreSQL на одном хосте) |
vm.overcommit_memory = 0(или 2 только при Swap ≥ 50–100% RAM) |
Рабочие процессы rphost резервируют колоссальные объёмы виртуального адресного пространства (VIRT). В режиме overcommit_memory = 2 при скромном swap вызовы malloc/mmap завершаются фатальной ошибкой Cannot allocate memory задолго до исчерпания физической RAM. |
🛡 Ликвидация скрытого стопора СУБД: двухуровневое отключение Transparent Huge Pages
Механизм Transparent Huge Pages (THP) проектировался для повышения быстродействия путём автоматического объединения базовых страниц 4 КБ в блоки по 2 МБ с целью разгрузки TLB-кэша процессора.
Для СУБД PostgreSQL под высоконагруженной транзакционной нагрузкой 1С механизм THP гарантированно провоцирует деградацию:
- Фрагментация и Memory Bloat: PostgreSQL оперирует дисковыми страницами фиксированного размера 8 КБ. Выделение огромного непрерывного блока в 2 МБ под модификацию всего 8 КБ данных вызывает лавинообразный перерасход оперативной памяти.
- Compaction Latency Spikes: При нехватке свободных непрерывных блоков 2 МБ системный демон ядра
khugepagedприостанавливает выполнение рабочих потоков и запускает принудительную синхронную дефрагментацию RAM. Пользователи 1С ощущают это как необъяснимые секундные зависания интерфейса.
Инженерный стандарт SRE-Suite-for-1C-platform: двухуровневое отключение THP
Простого выполнения команды echo never > /sys/kernel/mm/transparent_hugepage/enabled недостаточно — настройка сбросится сразу после перезагрузки хоста. Мы реализуем надёжный двухуровневый контур.
Рубеж 1. Фиксация в параметрах загрузчика GRUB (/etc/default/grub):
Применение изменений: sudo update-grub или sudo grub2-mkconfig -o /boot/grub2/grub.cfg.
Рубеж 2. Гарантирующий systemd-юнит (/etc/systemd/system/disable-thp.service):
Сервис отключает режимы enabled и defrag на раннем этапе инициализации ОС строго до старта СУБД и кластера 1С:
Сетевой стек ядра и дескрипторы: защита от шторма подключений и лимиты systemd
В четвёртой части цикла мы настроили кластер Patroni и активировали параметр net.ipv4.ip_nonlocal_bind = 1 для бесшовного переключения виртуального IP через vip-manager. Дополним сетевую конфигурацию защитой от лавины входящих TCP-сессий.
4.1. Защита от потерь подключений при массовом входе пользователей
В моменты утреннего пикового логина или синхронного запуска регламентных фоновых задач сервер приложений 1С одномоментно генерирует сотни и тысячи сетевых сокетов к базе. При стандартном значении очереди somaxconn = 128 ядро начинает отбрасывать входящие пакеты SYN. Пользователи получают сообщения об обрыве сетевого соединения.
4.2. Системные лимиты дескрипторов (PAM против systemd)
Каждый клиентский сеанс 1С, процесс rphost и бэкенд СУБД удерживают десятки открытых сокетов и файловых хэндлов. Дефолтный лимит ОС в 1024 дескриптора приводит к аварийным падениям с ошибкой Too many open files.
Критическая деталь: Настройки в файле /etc/security/limits.d/ действуют исключительно для интерактивных сессий PAM (SSH, локальная консоль). Фоновые демоны, управляемые через systemd, данные файлы игнорируют. Требуется раздельная конфигурация обоих контуров:
1. Конфигурация для интерактивного входа /etc/security/limits.d/99-1c-postgres.conf:
2. Декларативные Drop-in оверрайды для systemd-служб (/etc/systemd/system/patroni.service.d/override.conf и /etc/systemd/system/srv1cv8-8.3.*.service.d/override.conf):
🎯 Автоматизация через IaC: декларативная Ansible-роль linux_tuning
Чтобы исключить дрейф конфигураций на серверах продуктивного кластера, мы объединили все проверенные настройки в готовую Ansible-роль в составе открытого репозитория NickScherbakov/1c-sre-suite.
Шаблон параметров ядра: ansible/roles/linux_tuning/templates/99-1c-postgresql.conf.j2
Задачи плейбука: ansible/roles/linux_tuning/tasks/main.yml
🛠 Экспресс-диагностика инфраструктуры: утилита аудита sre-1c-pg-healthcheck.sh
Для оперативного выявления деградаций и дрейфа конфигураций на боевых серверах мы разработали легковесный инструмент sre-1c-pg-healthcheck.sh.
Скрипт полностью автономен, не требует установки внешних пакетов (работает даже без bc) и за считанные секунды собирает фактуру по ключевой триаде: «Ядро Linux и виртуальная память ↔ Кластер Patroni и СУБД ↔ Рабочие процессы rphost».
Запуск скрипта на ноде:
Реальный терминальный вывод утилиты в продуктивном контуре:
Режим генерации сценария исправления (--generate-fix)
При передаче флага --generate-fix утилита формирует готовый к применению скрипт /tmp/sre-healthcheck-fix.sh, содержащий точечные вызовы sysctl -w ... и команды отключения THP на лету. Это позволяет инженеру устранить узкие места без ручного перепечатывания параметров:
🤝 Итоги первого этапа и Roadmap: что ждёт читателей в следующих выпусках
За 5 практических выпусков открытого цикла мы построили сквозной фундамент отказоустойчивости корпоративного контура «1С:Предприятие 8.3» на Linux:
Планы развития проекта (Roadmap):
- Резервное копирование и Disaster Recovery (Часть 6): Развёртывание
pg_probackupс валидацией инкрементальных копий, физической потоковой репликацией и выгрузкой сжатых резервных копий в S3-совместимые объектные хранилища. - Headless-автотесты в CI/CD (Часть 7): Запуск сценарных BDD-тестов Vanessa-Automation и модульных проверок YAxUnit внутри легковесных Docker-контейнеров непосредственно после синтаксического гейта.
- AIOps и автономные ИИ-агенты на базе Model Context Protocol (Часть 8): Запуск дежурного ИИ-агента (AI On-Call), который анализирует аномалии технологического журнала, связывает утечки
rphostсо строками BSL-кода и автоматически формирует Pull Request'ы с исправлениями.
Все конфигурационные файлы, Ansible-роли и диагностический скрипт опубликованы в открытом репозитории NickScherbakov/1c-sre-suite под свободной лицензией MIT. Разворачивайте на своих стендах, открывайте Issue и присылайте Pull Request'ы!
Если вы хотите подробнее ознакомиться с другими архитектурными решениями нашего проекта, рекомендуем прочитать наши предыдущие материалы:
- Часть 1: SRE-Suite-for-1C-platform — Архитектура надёжности и CI/CD сборочной линии на Linux: 5 рубежей обороны и ротация rphost
- Часть 2: SRE-Suite-for-1C-platform — Детерминированный CI/CD в GitHub Actions: сетевые HASP-ключи в Docker и динамический RUN_ID
- Часть 3: SRE-Suite-for-1C-platform — Безопасный контур Dev/Test без утечек ПДн: потоковое маскирование pg_anon и пост-обработка в 1C:BSL
- Часть 4: SRE-Suite-for-1C-platform — Отказоустойчивый кластер PostgreSQL под Patroni и etcd без оверхеда HAProxy через vip-manager
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.6.1.56
- Бухгалтерия предприятия КОРП, редакция 3.0, релизы 3.0.205.17
- Управление торговлей, редакция 11, релизы 11.6.1.56
Вступайте в нашу телеграмм-группу Инфостарт