#mysql #memory #out-of-memory
#mysql #память #нехватка памяти
Вопрос:
Я пытаюсь выполнить обновление базы данных с помощью Drush для сайта Drupal 7 всего с несколькими узлами и 85 модулями… Поскольку обновление заканчивается почти каждый раз, становится ясно, что для VPS с 512 Мбайт с его контейнерными сервисами (mysql, nginx, php-fpm и т.д.) Недостаточно памяти…
Каждый раз, когда MySQL убивается ядром, насколько я могу понять из журналов:
Не хватает памяти: завершите процесс 4310 (mysqld)
Мой вопрос в том, как я могу настроить службу MySQL, чтобы избежать ее «убийства»? Какие параметры в файле конфигурации MySQL позволяют снизить потребление памяти процессом mysqld?
Я в разработке, поэтому я не возражаю, если процесс замедлится. Я просто хочу знать, какие параметры мне нужно настроить, чтобы пережить процесс обновления без увеличения объема памяти.
Спасибо за вашу помощь.
Ответ №1:
Вам нужно только:
[mysqld]
performance_schema = off
Комментарии:
1. это единственное решение изменило ситуацию для меня, сократив объем используемой памяти со 175 до 37 млн.
2. это лучший ответ во всем Интернете за всю историю!
3. в каком файле находится этот параметр?
4. файл находится в /etc/mysql/my.cnf
5. Мой увеличился с 390M до 181M.
Ответ №2:
Моя конфигурация в 512 Мб оперативной памяти на Vultr, с Fedora 29 и MariaDB. Используется около 26% оперативной памяти.
[mysqld]
performance_schema = off
key_buffer_size = 16M
tmp_table_size = 1M
innodb_buffer_pool_size = 1M
innodb_log_buffer_size = 1M
max_connections = 25
sort_buffer_size = 512K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
join_buffer_size = 128K
thread_stack = 196K
В небольших VPS не забудьте включить подкачку. В Vultr, например, по умолчанию нет подкачки. То же самое в Digital Ocean.
Комментарии:
1.
query_cache_size
,query_cache_limit
были удалены в MySQL 8.2. Буфер сортировки 512M?!?
3. Эй, исправлено! 512K
Ответ №3:
Этот конфиг работает у меня на VPS 512M, надеюсь, это поможет…
[mysqld]
performance_schema = off
port = 3306
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
key_buffer_size = 16M
query_cache_size = 2M
query-cache-limit = 1M
tmp_table_size = 1M
innodb_buffer_pool_size = 1M
innodb_additional_mem_pool_size = 1M
innodb_log_buffer_size = 1M
max_connections = 25
sort_buffer_size = 512M
read_buffer_size = 256K
read_rnd_buffer_size = 512K
join_buffer_size = 128K
thread_stack = 196K
binlog_cache_size = 0M
# Disabling symbolic-links is recommended to prevent assorted security risks
#symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
Комментарии:
1. Не должен ли query-cache-limit быть query_cache_limit ?
2. Вы, вероятно, имели в виду
sort_buffer_size = 512K
вместоsort_buffer_size = 512M
.
Ответ №4:
Существуют десятки таких параметров, вы можете найти все из них с подробным описанием в документации mysql по системным переменным сервера. В общем, ищите переменные, в которых есть слово size
. В частности, проверьте innodb_buffer_pool_size
, потому что значение по умолчанию равно 128 МБ, а рекомендуемое значение на выделенном сервере составляет 80% физической памяти.
Комментарии:
1. 80% — это слишком много для крошечной виртуальной машины.
2. Я не говорил, что он должен установить значение 80%, я указал на этот конкретный параметр, потому что обычно он устанавливается на высокий уровень, потому что рекомендуемое значение равно 80%.
3. Спасибо. innodb_buffer_pool_size здесь самый важный. Сначала я не мог заставить его работать с моей конфигурацией, потому что MySQL находился внутри контейнера docker, и мои настройки для контейнера были неправильными. Теперь контейнер считывает файл my.cnf, и все работает, как ожидалось.
Ответ №5:
У вас есть виртуальная машина с небольшим объемом оперативной памяти 512 МБ? И вы используете несколько вещей (Drupal, MySQL)? Вам повезет, если вы вообще заставите его работать. Этих настроек может быть достаточно, чтобы уменьшить MySQL настолько, чтобы он мог работать:
key_buffer_size = 5M
innodb_buffer_pool_size = 60M
Между тем, не увеличивайте никаких значений в my.cnf. Если моих предложений недостаточно; давайте посмотрим весь ваш my.cnf; могут быть другие вещи, которые можно разумно уменьшить.
Какую версию MySQL вы используете?
Комментарии:
1. Спасибо Рику. MySQL не читал мой файл «my.cnf», что заставило меня усомниться в том, что я должен настроить, чтобы заставить его работать. MySQL находился внутри контейнера docker, и конфигурация была неправильной. MySQL мог бы отлично работать при низком потреблении памяти в среде разработки.
Ответ №6:
Я знаю, что этот вопрос не связан с docker, но на случай, если кто-то использует mysql с docker, я смог запустить контейнер mysql на очень дешевом сервере с 512 Мб.
Я использовал эти параметры docker-compose на основе ответа @Hossein: mysqld --performance_schema=off
services:
mysql57:
image: mysql:5.7
command: mysqld --performance_schema=off
container_name: mysql57
restart: always
ports:
- "3306:3306"
volumes:
- /opt/mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_USER: usr_acme
MYSQL_PASSWORD: changeme
MYSQL_DATABASE: db_acme
TZ: America/Lima
deploy:
resources:
limits:
memory: 400M
До этого, без mysqld --performance_schema=off
, сервер работал очень медленно, и через несколько минут никто не мог подключиться.
Вы можете добавить больше параметров в command, чтобы уменьшить использование ОЗУ / ЦП:
command:
- "mysqld"
- "--performance_schema=off"
- "--query_cache_size=2M"
- "--query_cache_limit=1M"
- "--foo=bar"