Cannot allocate memory Bitrix

Довольно часто при установке 1С-Битрикс: Веб-окружение вылезает либо 502 Bad Gateway, либо пишется, что в соединении отказано. Разумеется, если Вы создали сайты через меню и правильно прописали DNS.

Причина кроется в неправильно сконфигурированных веб-серверах, которые установлены на сервере — это Nginx и Apache.

В случае, когда работает Nginx и не работает Apache, вы получаете ошибку 502, а когда не работает Nginx или даже оба сразу — Вы наблюдаете connection refused.

Залезаем на сервер (у меня стоит ОС CentOS, у владельцев debian-based папка с apache называется apache2), смотрим файлы логов. Находятся они по адресу /var/log/httpd/ для Apache и /var/log/nginx/ для Nginx

Смотрим файл с названием error.log

И тот, и другой выдают одну и ту же ошибку: cannot allocate memory ровно столько раз, сколько я пытался запустить эти сервисы командами

service httpd start
и
service nginx start
.

Быстрое решение проблемы

mmap — это POSIX средство для разделения совместных ресурсов. Cannot allocate memory означает, что невозможно выделить заданное программами количество памяти ввиду отсутствия железно свободной памяти, которая занята процессами системы, разделённой областью и самими службами.

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

Итак, для тех, кто любит быстрые решения:

Проблема заключается в двух модулях: OPCache и push_stream, а также необходимо будет поднастроить количество запускаемых серверов Apache

Настоятельно рекомендую сначала запустить nginx, так как легко отследить результат — появляется 502я ошибка при попытке зайти на сайт вместо отказа от соединения.

Настройка Nginx

Заходим в файл /etc/nginx/bx/conf/im_settings.conf

Там находим строку

push_stream_shared_memory_size ------ <некое число>M

Уменьшаем в несколько раз это число, сохраняем результат

Пробуем запустить nginx командой

service nginx start
и последующей за ней
service nginx status
если кажется, что всё ОК.

Если не запускается — пробуем ещё уменьшить число.

В моём случае число нужно было заменить на 16. Для кого-то это число может быть 64, а для кого-то — 4

В конечном итоге работаем на результат =)

Настройка Apache

Теперь займёмся Apache.

Вводим команду

nproc

Она показывает, сколько ядер содержится у нас в процессоре. Это число равно числу клиентов Апача, которых нам нужно будет оставить.

На моём тестовом сервере всего одно ядро.

Заходим в файл /etc/httpd/bx/conf/prefork.conf Ставим StartServers равным нашему количеству ядер.

Остальные настройки можно уменьшить примерно в той степени, как и startservers.

Мои настройки Вы можете посмотреть на картинке.

Далее заходим в файл /etc/php.d/opcache.ini

Там находим строку

opcache.memory_consumption = <некое число>M

В моём случае число 124 (откуда такое «ровное» число — чёрт его знает) нужно было заменить на 16. Опять же, для кого-то этого будет недостаточно и необходимо будет уменьшить больше.

В конечном итоге, после метода проб и ошибок, у Вас должна сработать команда service httpd start и отобразиться волшебное

httpd (pid ####) is running

После запуска обеих служб вы получите работающую страницу

То, что делать необязательно

Теперь можем закинуть bitrix_server_test.php в /home/bitrix/www/ и проверить, на чём свет стоит.

НАПОМИНАЮ! (об этом подробнее говорилось в статье Виктора Тарана), что в этой папке должна быть заглушка индексной страницы и никакого рабочего сайта, так как весь мусор собирается именно сюда.

Запускаем файл — ваш_ip/bitrix_server_test.php и смотрим, насколько хорошо всё устроено.

А для того, чтобы разобраться подробнее, что за файлы мы трогали и что это за модули — будет написана пара статей в обозримом будущем.

Оставить комментарий

Комментарии (3)

  1. Carbo 01.12.2015 Ответить
    Где поставить минус за статью?
    "В моём случае число 124 (откуда такое "ровное" число - чёрт его знает)"
    "В моём случае число нужно было заменить на 16. Для кого-то это число может быть 64, а для кого-то - 4"
    ...
    интернет под рукой, почему бы не подсказать людям, что это не сказочные цифры, которые возможно посчитать.
  2. Дмитрий
    Дмитрий 01.12.2015 Ответить
    Минус за статью можно отправить в ВК её автору с подробными комментариями!

    Да, безусловно, их можно посчитать. К сожалению, методы подсчёта по-моему, слишком сложны, для того, чтобы решить проблему такого масштаба.

    Для того, чтобы посчитать opcache.memory_consumption есть opcache_get_status()
    Но он выдаёт малополезную информацию в том случае, когда opcache ВООБЩЕ не запустился (и не запускался)

    Ну и, конечно, можно посчитать размер свободной разделяемой памяти. Но для этого надо знать, сколько она может себе выделить + посмотреть, сколько в ней сейчас информации с помощью ipcs

    imho, значение легче подобрать вручную, особенно, на малопроизводительных серверах


    Оставьте Ваше решение, я готов вносить конструктивные изменения в статью!
  3. Виктор 26.02.2016 Ответить
    А вы уверены что у вас это ядра, возможно вы говорите о потоках?