Как заставить MySQL использовать меньше памяти?

#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"