Недостаточно оперативной памяти на сервере

Если на вашем сервере наблюдается нехватка оперативной памяти, часть процессов завершаются в аварийном режиме. Out of Memory - состояние, при котором операционная система или программа не могут получить дополнительную оперативную память из-за полного исчерпания свободной памяти. Данное состояние возникает тогда, когда вся физическая оперативная память и память в файле подкачки (swap) полностью занята ядром и программами, и неиспользуемой памяти больше не осталось.

В большинстве случаев исчерпание оперативной памяти приводит к невозможности продолжения работы программы, запросившей дополнительную память, или к аварийному завершению других программ (OOM killer), что способно нарушить стабильность работы системы и целостность обрабатываемых данных. Нередко исчерпание памяти приводит к полному сбою в работе сервера и требует аварийной перезагрузки.


Как правило, в системном журнале /var/log/messages при этом присутствуют подобные записи:

Jul  30 13:03:04 office kernel: Out of memory: Kill process 3159 (mysqld) score 619 or sacrifice child
Jul  30 13:03:04 office kernel: Killed process 3159 (mysqld), UID 996, total-vm:10615012kB, anon-rss:7940676kB, file-rss:0kB, shmem-rss:0kB

Записи сообщают нам о том, что служба была остановлена (отключена) по причине израсходования свободной памяти на сервере. Была остановлена именно эта служба, так как потребляла больше всего оперативной памяти из запущенных.


Основные причины исчерпания оперативной памяти:

  • недостаточное количество физической оперативной памяти
  • высокая нагрузка (постоянная или пиковая)
  • настройки системы и серверных программ, не подходящие характеру нагрузки
  • настройки системы и серверных программ, не соответствующие физическим параметрам сервера
  • утечки памяти в программах 


Меры борьбы с исчерпанием памяти:

  • тонкая настройка компонентов системы
  • увеличение объема физической памяти
  • отключение неиспользуемых компонентов системы
  • увеличение объема swap-файла

Анализ работы виртуального сервера и количества используемых ресурсов

Существует огромное множество утилит, которые помогают отследить состояние системы, но atop является одной из немногих способных предоставить полную информацию. Утилита atop может выводить информацию о системе не только в режиме онлайн, но так же записывать все происходящие изменения в отдельный лог-файл с возможность просмотра состояния системы за прошедший промежуток времени.


В примере анализа работы системы будет рассмотрен виртуальный сервер с установленным окружением BitrixVM на ОС CentOS 7 и работающим на нем веб-сайте на основе "1С-Битрикс: Управление сайтом".


Для анализа работы сервера необходимо подключиться к нему по SSH и вызвать утилиту atop через терминал. Может потребоваться установить утилиту на сервер, если она не была установлена до этого.


Утилита вызывается командой:

atop

Пример вывода команды atop расположен на изображении ниже:

Среди указанных элементов системы в таблице, нас интересует строка MEM, которая отображена красным (цвет сигнализирует нам о наличии проблемы для этого элемента системы, а именно - малое количество свободной оперативной памяти). По первому значению этой строки видно, что общее количество установленной оперативной памяти составляет 12,3 ГБ. Второе значение говорит нам о количестве свободной оперативной памяти, что составляет 323,3 МБ.

В строке SWP значение vmcom 15,4 ГБ сообщает нам о том, что запущенные программы могут запросить больше оперативной памяти для своей работы на пике активности, чем установлено памяти на сервере.


Можно отсортировать запущенные процессы по количеству используемой оперативной памяти нажатием клавиши m в утилите atop.

Пример вывода команды atop для сортировки по используемой памяти расположен на изображении ниже:

На отображенной информации о запущенных процессах нас интересуют два показателя: запущенный сервис и используемый им объем оперативной памяти. 

Программа mysql сохраняет информацию для обмена данными в оперативной памяти, чтобы ускорить время обращение к ней. Общий объем используемой памяти составляет около 8 ГБ.

Программа httpd создает некоторое количество рабочих процессов для быстрого доступа к ним, также загружая их в оперативную память. На каждый процесс выделяется от 70 до 600 МБ памяти на каждый. Таких процессов несколько, выделяемая память для них суммируется.

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

Исходя из полученных данных, можно понять, что основной объем оперативной памяти используется за счет работы базы данных mysql и процессов веб-сервера httpd, а значение vmcom сообщает нам о том, что установленное количество оперативной памяти на сервере недостаточно при текущей конфигурации программ и в случае повышения нагрузки на сервер может привести к отключению одной из программ, как база данных или веб-сервер, и тот веб-сайт, с помощью которых он работает, будет недоступен для посетителей.

Чтобы избежать такого сценария, необходимо принять меры, которые исправят возникшую проблему и будут эффективны для конкретного случая.

Настройка компонентов системы

Снизить потребление оперативной памяти для запущенных программ можно за счет индивидуальной настройки их конфигурации. То количество выделяемой памяти для работы программ, которое определено настройками, может быть избыточным и не соответствовать текущим потребностям в работе сервера. В зависимости от типа программы и ее функций, настройках конфигурации различается и зависит от различных факторов. Ниже мы рассмотрим одни из типовых программ, необходимых для работы веб-сайта на сервере, и какие оптимальные настройки для их работы мы можем произвести.

Название программ и расположение конфигурационных файлов в других системах может отличаться.


Настройка службы httpd

Служба, которая отвечает за обработку запросов от браузера пользователя для передачи ему содержимого веб-сайта. Чтобы пользователь получил содержимое сайта, как можно быстрее, программа httpd запускает процесс, который всегда ждет взаимодействия с пользователем, и, в момент обращения, производит обработку запроса и отдает необходимую информацию. Так как одновременных пользователей может быть несколько и чтобы они не ждали своей очереди, процессов запускается несколько и каждый из них потребляет оперативную память.

Настройка конфигурационного файла httpd поможет установить количество активных процессов программы и согласовать их с возможным количеством пользователей без использования лишних.


Конфигурационный файл с указанием этих параметров на  примере шаблона BitrixVM:

/etc/httpd/bx/conf/prefork.conf

Файл конфигурации формируется автоматически окружением BitrixVM при запуске системы на основе доступных ресурсов сервера.


Содержимое редактируется  любым возможным текстовым редактором - vi, vim, nano и другие.


Содержимое конфигурационного файла BitrixVM:

<IfModule mpm_prefork_module>
  StartServers        30
  MinSpareServers     30
  MaxSpareServers     30
  MaxRequestWorkers   30
  MaxRequestsPerChild 5000
</IfModule>


Описание параметров:

StartServers — определяет сколько процессов создается при запуске.

MinSpareServers — минимальное количество процессов, которое должно существовать всегда.

MaxSpareServers — максимальное количество процессов в режиме ожидания (idle).

MaxRequestWorkers —  максимальное количество одновременного работающих процессов.

MaxConnectionsPerChild — лимит по обращениям к процессам, которое могут обрабатываться за время его жизни; процесс прекращает существовать, обработав установленное количество запросов к нему.


Исходя из среднего количества потребляемой памяти процессом httpd по показаниям atop, а также одновременного количества посетителей веб-сайта, мы можем уменьшить параметры конфигурации, тем самым сократить количество запущенных процессов (MaxRequestWorkers), которые могут использовать память. Изменив параметр MaxConnectionsPerChild до меньшего значения, обеспечить более частый перезапуск процесса httpd и тем самым чаще высвобождая занятую им память.

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

После внесения изменений в конфигурационный файл, необходимо проверить конфигурацию httpd на ошибки следующей командой:

httpd -t

Если введенные данные были без ошибок, то для применения новых параметров необходимо перезагрузить веб-сервер следующей командой:

systemctl restart httpd


Настройка программы httpd завершена.


Настройки службы mysqld

Служба, которая отвечает за обработку запросов от веб-сайта для записи и чтения информации в существующей базе данных. Пользователь получает содержимое сайта с загруженными данными за счет постоянно запущенного процесса mysqld, который всегда ждет взаимодействия для обработки информации. Так как любое взаимодействие с базой данных вызывает команду для записи или чтения данных на диск, в зависимости от объема данных, обработка этой операции может занимать какое-то время, и чтобы сократить это время, программа использует оперативную память для размещения в ней данных, которые уже были запрошены ранее и не было необходимости в повторном запуске операции с выгрузкой данных с диска.

Настройка конфигурационного файла mysqld поможет установить количество выделяемой оперативной памяти для оптимальной работы программы.

Конфигурационный файл с указанием этих параметров на примере BitrixVM:

/etc/mysql/conf.d/bvat.cnf 

Файл конфигурации формируется автоматически окружением BitrixVM при запуске системы на основе доступных ресурсов сервера.

Содержимое редактируется  любым возможным текстовым редактором - vi, vim, nano и другие.

Содержимое конфигурационного файла BitrixVM:

[mysqld]
    query_cache_type = 1
    query_cache_size = 128M
    query_cache_limit = 16M
    innodb_buffer_pool_size = 3072M
    max_connections = 55
    table_open_cache = 12288
    thread_cache_size = 128
    max_heap_table_size = 128M
    tmp_table_size = 128M
    key_buffer_size = 96M
    join_buffer_size = 14M
    sort_buffer_size = 14M
    bulk_insert_buffer_size = 2M
    myisam_sort_buffer_size = 14M

Из существующих параметров конфигурационного файла, в первую очередь нас интересует значение innodb_buffer_pool_size, который определяет размер загруженных данных в оперативную память, в которой mysqld будет хранить данные для чтения таблиц и их индексов. Можно уменьшить значение этого параметра не более, чем на 15-20% от текущего значения, что позволит освободить некоторое количество используемой памяти. Уменьшение этого параметра может привести к увеличению времени обработки запросов к базе данных.

Будьте внимательны при изменении конфигурационного файла и параметров в нем. Подбор оптимальных параметров производится по формуле Максимально возможное использование памяти = (Глобальные буферы + Буферы подключений * Подключения) , либо экспериментальным путем, согласно действующей нагрузке, объему базы данных, характеристикам сервера, а также с соблюдением условий, описанных в руководстве программы mysqld.

Для получения рекомендации об оптимальных параметрах для конфигурации mysqld, можно использовать специальную утилиту mysqltuner (установить утилиту можно через пакетный менеджер), которая проверит работу программы и предоставит отчет.


Утилита вызывается командой:

mysqltuner

Пример вывода команды atop расположен на изображении ниже:

После проверки, будет выведен последний блок с именем "Recommendations" (Рекомендации), согласно которому можно посмотреть какие параметры в настройках требуют изменений и установить их для оптимальной работы базы данных.


Для применения новых параметров необходимо перезагрузить базу данных следующей командой:

systemctl restart mysqld


Настройка программы mysqld завершена.


Настройка службы memcached

Служба, которая отвечает за кешировании данных в ОЗУ, с целью их быстрого извлечения по мере надобности. В своей работе использует ресурсы оперативной памяти, что позволяет системе управления сайтом быстрее извлекать запрошенные данные. Под работу программы выделяется установленное количество оперативной памяти

Настройка конфигурационного файла memcached поможет установить количество выделяемой оперативной памяти для оптимальной работы программы.

Конфигурационный файл с указанием этих параметров:

/etc/sysconfig/memcached

Файл конфигурации формируется автоматически окружением BitrixVM при запуске системы на основе доступных ресурсов сервера.

Содержимое редактируется  любым возможным текстовым редактором - vi, vim, nano и другие.

Содержимое конфигурационного файла:

# memcached settings
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="3072"
OPTIONS=""

Основным параметром, определяющим объем выделяемой оперативной памяти для работы memcached, является CACHESIZE. Оценить объем памяти, необходимой для кеширования, можно по размеру вашего файлового кеша. Если установить слишком низкое значение, то эффективность использования программы будет сильно снижена, так как данные постоянно будут вытеснять друг друга.


Для применения новых параметров необходимо перезагрузить кеширующий сервер следующей командой:

systemctl restart memcached


Настройка программы memcached завершена.

Увеличение объема физической памяти

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

Воспользуйтесь панелью управления виртуальным сервером для увеличения количества доступной оперативной памяти для сервера.

Ориентируясь на показатель vmcom из утилиты atop, можно определить до какого значения необходимо увеличить объем оперативной памяти для поддержания стабильной работы сервера и всех его составляющих. Из представленного примера видно, что для удовлетворения всех запросов оперативной памяти от запущенных программ серверу требуется 16 ГБ оперативной памяти, то есть необходимо добавить еще 4 ГБ дополнительной памяти на сервер. Можно добавить и меньшее количество, к примеру 2 ГБ, что сократит вероятность исчерпания памяти в процессе работы сервера, но не исключит эту возможность.

Изменение параметров заказанных услуг

Увеличение объема swap-файла

Альтернативным способом увеличения свободной памяти для работающих программ может быть подключение swap-файла. Это область на жестком диске, которая используется для временного хранения данных из оперативной памяти, для которых там больше нет места. Это позволяет увеличить объем информации, которую система может хранить в используемой памяти.

Пространство подкачки используется только тогда, когда основная память уже полностью занята, и туда будут помещаться только данные, которые давно использовались. Работа с информацией будет выполняться намного медленнее, чем в оперативной памяти, но система будет продолжать работать и использовать swap только для старых данных.