1. Оптимизация рабочих процессов и потребления памяти
Оптимизация рабочих процессов и потребления памяти
Почему сервер 1С, который в понедельник работал шустро, к пятнице превращается в вялую машину, на которой каждое действие пользователя занимает десятки секунд? Ответ почти всегда один и тот же: рабочие процессы (rphost.exe) накопили критический объём памяти и деградировали. На одиночном сервере с десятками баз эта проблема проявляется острее всего — вам некуда девать нагрузку, и каждый «прожорливый» процесс отбирает ресурсы у остальных.
Как устроены рабочие процессы
Каждый рабочий процесс (rphost.exe) — это отдельный экземпляр сервера приложений 1С, который принимает соединения от клиентов, исполняет серверный код и обменивается данными с SQL Server. Платформа автоматически создаёт несколько таких процессов и распределяет между ними входящие соединения. Ключевой параметр, который определяет это распределение — количество соединений на процесс. По умолчанию оно равно 256.
Представьте себе ресторан с одним официантом на 256 столов. Пока столиков занято мало — всё отлично. Но когда зал заполняется, официант начинает метаться, забывает заказы, тормозит. Если разделить зал на секции с отдельными официантами — каждый обслуживает меньше столов и работает быстрее. Именно так работает уменьшение количества соединений на процесс: вы получаете больше рабочих процессов, каждый из которых обслуживает меньше сеансов.
Настройка количества соединений на процесс
Откройте консоль кластера серверов (Администрирование сервера 1С:Предприятия) и перейдите к свойствам рабочего сервера. На вкладке «Рабочие процессы» найдите параметр «Максимальное количество соединений».
| Параметр | Значение по умолчанию | Рекомендация при ограниченных ресурсах | |---|---|---| | Соединений на процесс | 256 | 64–128 | | Интервал перезапуска РП | Не задан | 3–6 часов | | Допустимый объём памяти | 0 (автоматически) | 70–80% от доступной RAM |
При уменьшении соединений с 256 до 64 на сервере с 400 активными сеансами вы получите не 2, а 7 рабочих процессов. Каждый из них будет потреблять меньше памяти и быстрее отвечать на запросы.
> Но есть обратная сторона: каждый дополнительный rphost.exe — это собственный кэш объектных данных. Суммарное потребление памяти кластером вырастет. На сервере с 32 ГБ RAM и 30 базами это критично — нужно искать баланс.
Перезапуск рабочих процессов
Рабочий процесс со временем деградирует — потребляет всё больше памяти, кэширует устаревшие объекты, фрагментирует управляемую кучу .NET. Платформа предлагает два сценария перезапуска:
Перезапуск по объёму памяти. Параметр «Временно допустимый объём памяти рабочих процессов» задаёт порог в мегабайтах. Когда процесс превышает этот порог, платформа завершает его и запускает новый. Проблема: потребление памяти неравномерно в течение дня. Утром, когда пользователи только зашли, процессы «худые». К обеду — «толстые». Фиксированный порог, который корректен утром, будет слишком низким к вечеру и вызовет лавину перезапусков.
Перезапуск по интервалу. Вы задаёте интервал в часах, и платформа перезапускает процессы регулярно. Проблема: если все процессы стартовали одновременно (а это типичная ситуация утром), они и перезапустятся одновременно. В момент массового перезапуска пользователи испытают «подвисание» на 15–30 секунд.
Практическое решение — разнести старт процессов по времени. Этого можно добиться, задав разное количество соединений на процесс для разных баз или запуская часть баз позже (например, фоновые базы бухгалтерии стартуют после загрузки основной базы учёта).
Скрипт мониторинга потребления памяти
Чтобы понять реальную картину, нужен автоматический сбор данных. Вот PowerShell-скрипт, который каждые 5 минут записывает потребление памяти всеми rphost.exe в CSV-файл:
Через пару дней анализа вы увидите, какие базы порождают самые «тяжёлые» процессы и в какое время суток происходит пик потребления. Эти данные — основа для дальнейшей настройки.
Лимитирование памяти на уровне ОС
Если платформенная настройка не справляется, можно ограничить потребление памяти процессами rphost.exe средствами Windows. Используйте групповые политики или утилиту SetProcessWorkingSetSize, но проще всего — создать задание планировщика, которое отслеживает процессы, превысившие порог:
Запускайте этот скрипт по расписанию каждые 10 минут. Это «последний рубеж» защиты — если платформа не перезапустила процесс сама, скрипт сделает это принудительно.
Практический сценарий
Сервер: 1 ядро Xeon, 32 ГБ RAM, 25 баз, 180 одновременных пользователей. Симптомы: к середине дня 3–4 процесса rphost потребляют по 4–5 ГБ каждый, пользователи жалуются на тормоза.
Шаг 1. Уменьшить соединения на процесс с 256 до 80. Результат: вместо 2–3 процессов стало 5–6, каждый потребляет не более 2 ГБ.
Шаг 2. Установить интервал перезапуска — 4 часа. Задать параметр «Временно допустимый объём памяти» — 3 ГБ.
Шаг 3. Запустить скрипт мониторинга. Через неделю анализа выяснилось, что две базы (УТ 11 и БП 3.0) дают 60% нагрузки на память.
Шаг 4. Для этих двух баз выделить отдельный рабочий процесс с лимитом 80 соединений, для остальных 23 баз — общий процесс с лимитом 128.
После настройки пик потребления памяти кластером снизился с 28 ГБ до 19 ГБ, а время отклика сервера — с 2.8 секунды до 0.9 секунды.