Память для 1С не хватает: где её взять на сервере, в СУБД и на рабочем месте
Содержание
Пользователи жалуются, что отчёт за год «подвисает», а на сервере в диспетчере задач rphost.exe занимает 14 ГБ из 16. Первая мысль: докупить планку памяти. Иногда это правда помогает, но чаще память «съедает» одна конкретная причина, и её видно на замере. Сначала выясняем, кто занял память, потом решаем, где её добавлять: на сервере 1С, в СУБД или на рабочем месте.
Увеличить память для 1С можно тремя способами: поднять лимиты в настройках сервера и СУБД, освободить память чисткой и настройкой, добавить физическую оперативную память. Порядок именно такой: от дешёвого к дорогому.
Сначала замер: кто на самом деле занимает память
Не покупайте ОЗУ вслепую. Откройте на сервере диспетчер задач (или perfmon) и посмотрите потребление по процессам.
| Процесс | Что это | Что означает рост |
|---|---|---|
ragent | Агент сервера | Обычно небольшой, рост — редкость |
rmngr | Менеджер кластера | Растёт с числом сеансов и блокировок |
rphost | Рабочий процесс | Основной потребитель, в нём исполняется серверный код |
postgres / sqlservr | СУБД | Кэш данных, занимает всё, что ей разрешено |
1cv8 / 1cv8c | Клиент | Память рабочего места пользователя |
Что смотреть:
- 📈 Растёт ли
rphostбез остановки в течение дня. Плавный рост до вечера и падение после перезапуска — признак утечки или тяжёлых сеансов. - 🧮 Сколько памяти у СУБД. Если
postgresилиsqlservrзанимают почти всё ОЗУ — это нормально, так задумано. Тревожиться стоит, когда системе не хватает памяти и начинается подкачка. - 💾 Файл подкачки. Если диск загружен под 100%, а в
rphostпамяти много, вы уже упёрлись в ОЗУ.
Чтобы связать процесс с пользователем, откройте консоль администрирования серверов 1С, найдите рабочий процесс и сеансы. Там видно, какой сеанс и какая база потребляют память. Часто виноват один пользователь с огромным отчётом, а не нехватка ОЗУ.
Для администрирования из командной строки есть утилита rac. Список команд: rac help. Сеансы кластера: rac session list, но номер кластера и адрес сервера подставляйте свои.
Как понять, что памяти действительно мало
Один пик в 14 ГБ ещё ни о чём не говорит. Смотрите на картину за несколько рабочих дней:
- 📊 Включите в
perfmonсчётчики доступной памяти и обращений к файлу подкачки и оставьте запись на неделю. - 🕘 Сопоставьте пики со временем закрытия периода, формированием регламентированной отчётности и ночными обменами. Если пик один раз в месяц, под него проще подобрать окно и ограничение, чем покупать планки.
- 👥 Сравните потребление в часы пик и ночью: разница показывает, сколько занимают сеансы пользователей, а сколько фоновые задания.
Если свободной памяти остаётся не меньше 10-15% даже в пик, а подкачка почти не используется, дело не в объёме ОЗУ. Тогда ищите узкое место в диске, процессоре или запросах.
Лимиты рабочих процессов на сервере 1С
Сервер 1С не берёт всю память по умолчанию, но и не бережёт её. Лимиты задаются в консоли администрирования: откройте кластер, затем свойства рабочего сервера и свойства самого кластера.
Параметры, которые отвечают за память:
- 🔹 Допустимый объём памяти рабочих процессов. Если процесс превысил порог, кластер перестаёт отдавать ему новые соединения и со временем перезапускает.
- 🔹 Интервал превышения допустимого объёма. Сколько процесс может держаться выше порога, прежде чем его завершат.
- 🔹 Безопасный расход памяти за один вызов. Серверный вызов, который съел больше, будет прерван. Так защищаются от «разгулявшегося» отчёта.
- 🔹 Число рабочих процессов на сервере. Больше процессов — меньше памяти на каждый и устойчивее к сбою одного, но выше накладные расходы.
Как подбирать порог. Возьмите объём ОЗУ, вычтите то, что нужно ОС и СУБД (если они на одной машине), и разделите остаток на число рабочих процессов с запасом 15-20%. Например: 32 ГБ, из них 12 ГБ СУБД и 3 ГБ система. Остаётся 17 ГБ, процессов 4, значит на каждый примерно по 3,5 ГБ с запасом.
Применение настроек и перезапуск рабочих процессов обрывают сеансы пользователей. Делайте это вне рабочего времени или в окно, согласованное с пользователями. Незавершённые документы без записи будут потеряны.
Если ставите сервер 1С впервые
Используйте 64-разрядную версию серверной части. 32-разрядный рабочий процесс ограничен по адресному пространству, и никакая добавленная память ему не поможет. Это самая частая причина, когда «поставили 64 ГБ, а rphost падает на 2-3 ГБ».
Настройка СУБД: кэш данных и рабочая память
Большая часть памяти в схеме «1С + СУБД» принадлежит базе данных. Здесь два типичных случая.
PostgreSQL
Основные параметры лежат в postgresql.conf:
shared_buffers = 8GB
effective_cache_size = 24GB
work_mem = 32MB
maintenance_work_mem = 1GB
Это пример для сервера с 32 ГБ ОЗУ, где СУБД стоит отдельно. Ориентиры:
shared_buffers— порядка четверти ОЗУ;effective_cache_size— подсказка планировщику о размере кэша ОС и самой СУБД, 50-75% ОЗУ;work_mem— память под сортировку и соединения на операцию. Не завышайте: умножается на число одновременных операций и сеансов;maintenance_work_mem— память под обслуживание, индексы и очистку.
Для 1С рекомендуется специальная сборка PostgreSQL, поставляемая вместе с продуктом; для неё параметры те же.
После правки конфига shared_buffers вступает в силу только при перезапуске службы СУБД. Остановка оборвёт все подключения 1С.
MS SQL Server
Ключевой параметр — максимальный объём памяти сервера (в свойствах сервера на странице «Память», max server memory). Если оставить значение по умолчанию, SQL Server заберёт почти всё и оставит системе крохи. Задайте его так, чтобы операционной системе и серверу 1С (если они на той же машине) осталось запас в несколько гигабайт.
Если СУБД и сервер 1С на одной машине, делите память явно: что-то одному, остальное другому. Иначе они будут конкурировать, и выигравший оставит систему без запаса.
Клиент 1С: когда не хватает памяти на рабочем месте
На рабочем месте проблемы другие. Типичные симптомы: ошибка нехватки памяти при открытии большого отчёта, зависание при выгрузке в Excel.
Что проверить:
- Разрядность клиента. 32-разрядный клиент ограничен по адресному пространству. Для тяжёлых отчётов и больших выгрузок ставьте 64-разрядный клиент, если платформа и внешние компоненты это поддерживают.
- Объём ОЗУ рабочего места. Для тяжёлой работы с большими отчётами разумно иметь не менее 8 ГБ.
- Лишние фоновые программы и десятки открытых вкладок браузера на тонком клиенте.
- Файловая база на слабой машине. В файловом режиме клиент сам делает работу сервера. Тяжёлые базы стоит переводить на клиент-серверный вариант.
Кэш клиента
Клиент хранит локальный кэш: служебные данные интерфейса, список баз, сведения о конфигурации. Разросшийся или битый кэш иногда вызывает странные тормоза и ошибки. Его чистят закрытием всех сеансов и удалением содержимого папок кэша в профиле пользователя (подпапка 1C\1cv8 в каталогах Local и Roaming профиля). Для запуска с очисткой есть параметр командной строки /ClearCache.
Перед чисткой закройте все окна 1С. Список баз хранится отдельно, но на всякий случай запишите адреса и имена баз, если вы подключаетесь вручную.
Память у клиента этим не прибавляется, но если приложение «пухнет» из-за битого кэша, проблему решит именно очистка.
Обслуживание базы: чем меньше мусора, тем меньше памяти нужно
Иногда ОЗУ не хватает не из-за малого объёма, а из-за раздутой базы.
- 🧹 Свёртка и удаление старых данных, если регламент позволяет: меньше записей — меньше нагрузки на кэш.
- 🗂️ Регламентные операции СУБД. Обновление статистики и перестроение индексов поддерживают быстрые планы запросов. Плохой план запроса может прочитать в память всю таблицу.
- 📦 Журналы регистрации и техжурнал. Если включён подробный технологический журнал, он нагружает диск и процессор. Включайте на время диагностики.
- 🔁 Блокировки и «зависшие» сеансы. Забытые сеансы держат память. Завершайте их через консоль администрирования.
Простой пример. База на 200 ГБ, в ней регистр накопления на 80 ГБ с данными за десять лет. Отчёт за год читает кусок таблицы. Если запрос написан плохо и условие по периоду не использует индекс, СУБД тащит в кэш гигабайты лишнего. Добавлять оперативную память можно сколько угодно, но правильнее поправить запрос или индексы.
Аппаратный апгрейд и виртуальные машины
Если замер показал, что памяти реально не хватает, добавляйте физически.
Ориентиры по ОЗУ (для клиент-серверного варианта, очень приблизительно):
| Сценарий | Сервер 1С | СУБД |
|---|---|---|
| До 10 пользователей | 8-16 ГБ вместе с СУБД на одной машине | |
| 10-50 пользователей | 16-32 ГБ | 16-32 ГБ |
| 50-100 пользователей и тяжёлые отчёты | 32-64 ГБ | 32-128 ГБ |
Это ориентиры, а не норма: реальная потребность зависит от конфигурации, числа баз и характера работы.
Что учесть:
- 🖥️ Виртуализация. В гипервизоре под ВМ задайте фиксированный объём ОЗУ или резервирование. Динамическая память или «раздувание» (ballooning) отбирает ОЗУ у гостя в самый неподходящий момент.
- 🧱 Планки памяти. Ставьте в соответствии с картой слотов материнской платы; одинаковые модули в парах дают максимальную пропускную способность.
- ⚡ Диски. Если СУБД читает с медленного диска, больше памяти под кэш помогает, но SSD решает проблему радикальнее.
- 🔌 Лицензии и редакция ОС. Некоторые редакции Windows Server и SQL Server ограничивают поддерживаемый объём ОЗУ или число ядер, проверьте ограничения вашей редакции до покупки памяти.
Если ресурсов на одной машине не хватает, разнесите роли: сервер 1С отдельно, СУБД отдельно. Так проще планировать память и обслуживать каждую часть.
Если не помогло
Допустим, лимиты подняты, ОЗУ добавлена, а rphost по-прежнему раздувается. Тогда ищем причину в коде.
Частые вопросы
Сколько ОЗУ нужно серверу 1С на одного пользователя?
Можно ли ограничить память, которую берёт СУБД?
shared_buffers и связанные настройки.