Вопрос или проблема
У меня есть сервер Ubuntu 18.04, на котором работает mysql 5.7 и несколько веб-приложений. Mysql использует значительное количество памяти и вынуждает использовать swap. У нас было несколько фатальных сбоев из-за высокого использования памяти. Я работаю над уменьшением требований к памяти для других программ, работающих на этом сервере, но мне интересно, неправильно ли настроен mysql каким-либо образом.
Я запустил mysqltuner.pl и принял некоторые из его рекомендаций.
8 ядер, 20 ГБ ОЗУ, 8 ГБ swap
/etc/mysql/mysql.conf.d/mysqld.cnf
# Файл конфигурации сервера базы данных MySQL.
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0[mysqld]
# * Основные настройки
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-lockingbind-address = 0.0.0.0
# * Тонкая настройка
key_buffer_size = 16M
max_allowed_packet = 256M
thread_stack = 192K
thread_cache_size = 8
myisam_recover_options = BACKUP# * Конфигурация кэша запросов
query_cache_size = 0# * Логирование и репликация
log_error = /var/log/mysql/error.logexpire_logs_days = 10
max_binlog_size = 100M# * InnoDB
innodb_buffer_pool_size=10G
innodb_buffer_pool_instances=8
Рекомендации вашего mysql tuner предполагают, что это выделенный сервер mysql, и что сервер не работает также с веб-приложениями.
У вас установлено innodb_buffer_pool_size=10G
, что означает, что MYSQL всегда будет пытаться использовать 10 ГБ памяти, если это возможно, чтобы максимизировать свою производительность.
Если вам нужно больше памяти для использования другими программами на сервере, вы должны уменьшить значение innodb_buffer_pool_size и установить его на меньший объем памяти. Однако имейте в виду, что это может серьезно повлиять на производительность вашей базы данных.
Стоит упомянуть, что в производственных средах обычно считается лучшей практикой запускать базу данных и программы веб-приложений на отдельных серверах.
Ответ или решение
У вас замечена серьезная проблема с использованием памяти MySQL на вашем сервере Ubuntu 18.04, на котором также работают несколько веб-приложений. Давайте разберем эту ситуацию глубже с использованием метода FOREST:
F – Фокус на проблеме
Ваш сервер обладает 8 ядрами, 20 ГБ оперативной памяти и 8 ГБ swap, и на нем работает MySQL 5.7 вместе с рядом других приложений. Однако вы сталкиваетесь с высокой загруженностью памяти MySQL, что вынуждает сервер использовать swap, и это приводит к фатальным сбоям. Основная проблема, вероятно, кроется в конфигурации MySQL, особенно в одном из ее параметров — innodb_buffer_pool_size
, установленного в 10 ГБ.
O – Описание ситуации
Вы запустили скрипт mysqltuner.pl и уже приняли некоторые из его рекомендаций. Однако стоит отметить, что этот инструмент по умолчанию предполагает, что ваш сервер используется исключительно для работы с MySQL. Это означает, что текущая конфигурация может не подходить для среды, где также работают веб-приложения.
R – Реальные советы
-
Оптимизация параметров MySQL: Параметр
innodb_buffer_pool_size
, который установлен на уровне 10 ГБ, стоит уменьшить. Он отвечает за объем памяти, используемой для кэширования данных и индексов InnoDB. Снижение до 4-6 ГБ может освободить разумное количество памяти для других приложений, работающих на сервере. -
Увеличение swap: Несмотря на то, что увеличение swap может быть временным решением, это не рекомендуется как долгосрочный вариант из-за замедления ввода-вывода данных. Рассмотрите этот шаг только как временную меру.
-
Мониторинг использования памяти: Регулярно отслеживайте использование оперативной памяти и swap с помощью инструментов мониторинга, таких как Zabbix или Grafana, чтобы быстро реагировать на аномалии.
E – Эмоциональное вовлечение
Решение проблем с производительностью и стабильностью сервера может быть обременительным, особенно когда несколько приложений конкурируют за ресурсы. Подходя к этому стратегически и с пониманием, можно значительно улучшить стабильность и производительность сервера.
S – Стратегия и оценка
Если снизить объем innodb_buffer_pool_size
до определенного уровня позволяет нормализовать загрузку памяти, стоит рассмотреть следующую стратегию: разделение ролей сервера. На производственных средах часто рекомендуется выделить отдельный сервер для веб-приложений и баз данных. Это может улучшить как производительность, так и надежность.
T – Заключение и рекомендации
В долгосрочной перспективе, после оценки результатов оптимизации, рассмотрите возможность модернизации инфраструктуры — либо выделив отдельные серверы для разных задач, либо увеличив общий объем доступной оперативной памяти.
Надеюсь, эти рекомендации помогут вам оптимизировать использование памяти MySQL и повысить общую стабильность вашего сервера.