Почему Apache (httpd.exe) сильно грузит процессор при работе с 1С и как это исправить?

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

При публикации файловых баз 1С через веб-сервер Apache на операционных системах семейства Windows пользователи часто сталкиваются с аномальным поведением процесса httpd.exe. Со временем нагрузка на центральный процессор (CPU) начинает расти, достигая критических значений (40–99%), что приводит к «зависанию» сервера и невозможности комфортной работы. Особенно остро эта проблема проявляется на серверном оборудовании с низкой тактовой частотой ядер, например, на процессорах серии Xeon E5-2603.

В этой статье мы подробно разберем причины возникновения такой нагрузки и проанализируем комплекс мер по оптимизации веб-сервера для стабильной работы с 1С.

Причина 1: Утечки памяти в модулях сопряжения 1С

Одной из наиболее распространенных причин деградации производительности являются микро-утечки памяти в библиотеках сопряжения 1С (таких как wsap22.dll или wsap24.dll). С каждым обработанным запросом процесс Apache может резервировать небольшой объем памяти, который не возвращается операционной системе. Когда объем занятой памяти становится критическим, система начинает активно использовать файл подкачки, что резко увеличивает нагрузку на процессор из-за ожидания ввода-вывода и обработки очередей.

Решение: Ограничение времени жизни рабочих процессов

Для борьбы с этим явлением мы можем заставить Apache принудительно перезапускать дочерние потоки после обработки определенного количества запросов. Это позволяет «сбрасывать» накопленные ошибки без полной остановки веб-сервера. Разберем, как это настроить в файле httpd.conf:

  1. Найдем в конфигурационном файле секцию настройки MPM (Multi-Processing Module), которая для Windows называется mpm_winnt_module.
  2. Установим параметр MaxRequestsPerChild. По умолчанию он часто равен 0 (бесконечность).
  3. Зададим значение от 1000 до 3000.

Пример настройки:


<IfModule mpm_winnt_module>
    ThreadsPerChild        150
    MaxRequestsPerChild    2000
</IfModule>

После достижения 2000 запросов процесс будет корректно завершен и запущен заново, что очистит оперативную память.

Причина 2: Специфика обработки сетевых пакетов в Windows

Apache изначально разрабатывался для Unix-систем, и его работа на Windows имеет свои особенности. Существует известный конфликт механизмов оптимизации передачи сокетов с драйверами сетевых карт и антивирусным ПО, что приводит к зацикливанию потоков и росту CPU.

Решение: Отключение AcceptFilter

Проанализируем ситуацию: на Windows Server 2012 и выше Apache пытается использовать специфические системные вызовы для ускорения обработки HTTP-запросов. Если эти вызовы работают некорректно, процесс «съедает» процессорное время. Для исправления ситуации добавим в конец httpd.conf следующие строки:


AcceptFilter http none
AcceptFilter https none
EnableSendfile off
EnableMMAP off

Эти директивы отключают использование фильтров приема и механизмов Memory-Mapping, что делает работу сервера более стабильной в среде Windows.

Причина 3: Регламентные задания в файловых базах

Выясним причину нагрузки, связанную с самой архитектурой 1С. В файловом режиме все регламентные и фоновые задания (индексация поиска, обновление агрегатов, слияние индексов) выполняются в контексте того процесса, который открыл базу. Если база опубликована через веб-сервер, эти тяжелые задачи ложатся «на плечи» httpd.exe.

Решение: Управление фоновыми заданиями

Для стабилизации работы веб-сервера рекомендуется:

Причина 4: Устаревшая версия и разрядность ПО

Рассмотрим пример из практики: использование версии Apache 2.2.13 на современной ОС Windows Server 2012. Данная версия является морально устаревшей и не содержит исправлений для работы с новыми сетевыми стеками Microsoft.

Рекомендации по обновлению:

  1. Перейдите на Apache версии 2.4 (рекомендуется использовать сборки от Apache Lounge, оптимизированные под Windows).
  2. Следите за соответствием разрядности. Если у вас установлена 64-битная платформа 1С, используйте 64-битный Apache. Смешивание 32-битных библиотек 1С с 64-битным веб-сервером требует дополнительных прослоек, которые увеличивают накладные расходы на процессор.
  3. Убедитесь, что тактовая частота процессора достаточна. Для файловых баз 1С частота 1.8 ГГц является критически низкой, так как 1С выполняет многие операции в один поток. Любая сложная выборка в отчете одним пользователем может занять ядро на 100%, что на 4-ядерном процессоре отразится как общая нагрузка в 25%.

Причина 5: Переход на использование IIS

Если оптимизация Apache не приносит желаемого результата, проанализируем альтернативный вариант — переход на Microsoft IIS (Internet Information Services). Поскольку IIS является нативным компонентом Windows, он более эффективно управляет пулами приложений и системными ресурсами.

Преимущества IIS для 1С:

Причина 6: Диагностика через mod_status

Чтобы не гадать, какой именно запрос вызывает рост нагрузки, мы можем включить модуль мониторинга. Это позволит нам в реальном времени видеть, какие IP-адреса и к каким базам обращаются в момент пика CPU.

Разберем шаги по включению мониторинга:

  1. В httpd.conf раскомментируйте строку: LoadModule status_module modules/mod_status.so.
  2. Добавьте настройки доступа:

<Location "/server-status">
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Location>

Теперь, перейдя по адресу http://localhost/server-status, мы увидим детальную таблицу активных потоков.

Причина 7: Настройка антивирусного исключения

Часто причиной «зависания» httpd.exe становится антивирусное ПО, которое пытается заблокировать и проверить временные файлы 1С, создаваемые веб-сервером в папке temp.

Что нужно сделать:

  1. Добавьте процесс httpd.exe в список исключений (доверенных процессов) антивируса.
  2. Исключите из сканирования папки с файловыми базами 1С (файлы *.1CD, *.1CL).
  3. Добавьте в исключения каталоги временных файлов профиля, под которым запущена служба Apache.

Временное решение: Регламентный перезапуск

Если найти точную причину утечки не удается, в качестве временной меры можно настроить автоматический перезапуск службы веб-сервера в часы наименьшей активности (например, ночью).

Посмотрим на пример простого скрипта PowerShell, который можно добавить в планировщик задач:


$serviceName = "Apache2.2"
Restart-Service -Name $serviceName -Force
Write-Output "Служба Apache была успешно перезапущена $(Get-Date)"

Важно: Перед выполнением принудительного перезапуска следует убедиться, что все пользователи завершили сеансы, так как это приведет к обрыву их соединений с базой данных.

← На главную