Мониторинг потребления оперативной памяти 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Мониторинг потребления оперативной памяти 1С-Битрикс
Простая
~1-2 недели
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    989

Мониторинг потребления оперативной памяти 1С-Битрикс

PHP — процессовая модель: каждый запрос запускает новый PHP-FPM воркер, и каждый воркер потребляет RAM независимо. При pm.max_children = 50 и 64 МБ на воркер — это уже 3,2 ГБ только под PHP. На практике Битрикс-запросы с тяжёлыми компонентами (импорт из 1С, формирование прайс-листов, сложные отчёты) потребляют 128–256 МБ. Если сервер начинает использовать своп, время ответа деградирует в разы.

Что потребляет память в Битрикс

Главные источники роста RSS воркеров:

  • Импорт из 1С через CommerceMLCCatalogImport загружает XML целиком в память. При файлах > 50 МБ воркер легко набирает 200–300 МБ.
  • Операции с инфоблокомCIBlockElement::GetList() без nTopCount возвращает весь результат сразу.
  • Кэш в памяти — если включён managed_cache (memcached), локальная копия данных в PHP-процессе дублирует кэш.
  • Утечки в сторонних модулях — статические свойства, глобальные массивы, накапливающиеся за жизнь воркера при pm.max_requests = 0.

Инструменты мониторинга

Системный уровень — каждые несколько секунд:

# Суммарная память по PHP-FPM процессам
ps aux --sort=-%mem | grep php-fpm | awk '{sum += $6} END {print sum/1024 " MB"}'

# Детально по каждому воркеру
ps aux | grep php-fpm | grep -v grep | awk '{print $6/1024 " MB\t" $11}'

PHP memory_limit — диагностика в коде:

// Показывает пик потребления за жизнь запроса
$peak = memory_get_peak_usage(true);
if ($peak > 64 * 1024 * 1024) {  // > 64 МБ
    \Bitrix\Main\Diag\Debug::writeToFile(
        sprintf('Peak memory: %.1f MB, URI: %s', $peak / 1048576, $_SERVER['REQUEST_URI']),
        'MEM_HIGH',
        '/local/logs/memory.log'
    );
}

Этот код добавляем в OnEndBufferContent — так покрываем все запросы без инструментальных накладных расходов.

Prometheus + node_exporter + Grafana:

# prometheus.yml scrape config
- job_name: node
  static_configs:
    - targets: ['localhost:9100']

Метрика node_memory_MemAvailable_bytes — свободная память. Алерт при падении ниже 512 МБ:

# alertmanager rule
- alert: LowMemory
  expr: node_memory_MemAvailable_bytes < 536870912
  for: 5m
  annotations:
    summary: "Low RAM on {{ $labels.instance }}"

PHP-FPM: параметры под контроль

Ключевые параметры в /etc/php/8.1/fpm/pool.d/bitrix.conf:

pm = dynamic
pm.max_children = 30         ; не больше (RAM - 1GB) / avg_worker_memory
pm.max_requests = 500        ; перезапускаем воркер после 500 запросов (защита от утечек)
pm.process_idle_timeout = 30s

; Статус-страница для мониторинга
pm.status_path = /php-fpm-status

pm.max_requests = 500 — воркер перезапускается после 500 запросов, сбрасывая любые утечки памяти. При нормальном коде это не нужно, но сторонние модули Битрикс иногда накапливают статику.

Кейс: сайт с ежедневным импортом

Интернет-магазин, импорт из 1С в 02:00 через cron_events. После импорта несколько PHP-FPM воркеров оставались с RSS 250–300 МБ, сервер (8 ГБ) уходил в своп, утром до 07:00 сайт тормозил.

Диагностика: max_requests был 0, воркеры с раздутой памятью не перезапускались. pm.max_requests = 200 и ограничение memory_limit = 256M (было 512M) решили проблему: раздутые воркеры умирали после 200 запросов, память возвращалась системе.