1С: Превышен лимит открытых файлов в Linux (ulimit -n / Too many open files)
Природа исчерпания файловых дескрипторов процессами 1С
Каждое активное клиентское подключение, фоновое задание, сетевое соединение с PostgreSQL, открытый файл журнала регистрации (.lgd / .lgf), файл временного хранилища и динамическая библиотека потребляют отдельный файловый дескриптор (File Descriptor, FD). В дистрибутивах Linux по умолчанию для пользователей действует жесткое ограничение: ulimit -n 1024. Когда суммарное количество открытых сокетов и файлов рабочим процессом rphost или диспетчером rmngr достигает 1024, ядро Linux блокирует создание новых дескрипторов с ошибкой «EMFILE: Too many open files» или «Ошибка открытия файла блокировок / базы данных».
Бизнес-риски
Массовый аварийный сброс пользовательских сессий, повреждение файлов журнала регистрации 1Cv8.lgd, зависание кластера 1С, отказы при попытке подключиться к базе новых сотрудников.
Рекомендуемые значения лимитов дескрипторов для 1С:Предприятие
| Параметр ядра / сервиса | Дефолт ОС | Рекомендуемое значение для Enterprise 1C |
|---|---|---|
nofile (usr1cv8 soft limit) | 1 024 | 65 536 |
nofile (usr1cv8 hard limit) | 4 096 | 131 072 (или 262 144) |
fs.file-max (системный лимит ядра) | ~200 000 | 2 097 152 |
LimitNOFILE (systemd unit) | 1 024 / 4 096 | 65536:131072 (или infinity) |
Регламент увеличения лимитов файловых дескрипторов в Linux
Сценарий 1: Конфигурация /etc/security/limits.conf
Настройте лимиты на уровне PAM-модуля безопасности для служебного пользователя usr1cv8:
# Добавьте в конец файла /etc/security/limits.conf:
sudo bash -c 'cat << EOF >> /etc/security/limits.conf
usr1cv8 soft nofile 65536
usr1cv8 hard nofile 131072
usr1cv8 soft nproc 32768
usr1cv8 hard nproc 65536
EOF'
# Примените глобальный лимит открытых файлов для ядра Linux:
sudo sysctl -w fs.file-max=2097152
echo "fs.file-max = 2097152" | sudo tee -a /etc/sysctl.conf
sudo sysctl -pСценарий 2: Переопределение LimitNOFILE в службе systemd
Демоны, запускаемые через systemd, игнорируют limits.conf и подчиняются директивам unit-файлов:
# Создание drop-in конфигурации для службы 1С
sudo mkdir -p /etc/systemd/system/srv1cv83.service.d/
sudo bash -c 'cat << EOF > /etc/systemd/system/srv1cv83.service.d/limits.conf
[Service]
LimitNOFILE=131072
LimitNPROC=65536
EOF'
# Перезагрузка systemd и рестарт кластера 1С:
sudo systemctl daemon-reload
sudo systemctl restart srv1cv83Сценарий 3: Инструментальный контроль текущих лимитов запущенных процессов
# Проверка реальных лимитов у живого процесса rphost:
PID=$(pgrep rphost | head -n 1)
cat /proc/$PID/limits | grep "Max open files"
# Ожидаемый вывод:
# Max open files 65536 131072 files
# Подсчет текущего количества открытых дескрипторов:
ls -1 /proc/$PID/fd | wc -lТиповые ошибки администраторов
- Настройка limits.conf без изменения systemd unit: При перезагрузке сервера служба 1С стартует через systemd со старыми лимитами 1024, и при пиковой нагрузке сервер падает.
- Установка бесконечного лимита (infinity) на старых ядрах: Может приводить к чрезмерному потреблению невыгружаемой памяти ядра (Slab / dentry cache).
Инженеры ITSTM проведут комплексный тюнинг производительности Linux-серверов, настроят профили sysctl, memory overcommit и исключат исчерпание дескрипторов.
Частые вопросы (FAQ)
Как быстро понять, что 1С упал именно из-за дескрипторов?
В системном журнале dmesg или /var/log/messages появится запись: 'VFS: file-max limit reached' или в технологическом журнале 1С запись с ошибкой EXCP 'Too many open files'.
Почему один процесс rphost открывает тысячи файлов?
Каждый пользовательский сеанс открывает соединения с базой, кэширует метаданные в каталоге tmp, держит сокеты IPC и пишет в технологический журнал.
Нужно ли увеличивать лимиты для пользователя postgres?
Да, для учетной записи postgres также необходимо установить nofile не менее 65536 в /etc/security/limits.conf и systemd unit postgresql.service.
Как влияет журнал регистрации (SQLite .lgd) на потребление дескрипторов?
Новый журнал регистрации SQLite держит открытыми файловые дескрипторы для основной базы lgd, WAL-журнала и shm-файлов shared memory на каждый активный сеанс.