У меня есть виртуальная машина Azure с CentOS 7.1, Apache 2.4.6 и MariaDB 5.5. Виртуальная машина имеет 2 ядра и 3,5 ГБ ОЗУ. На сервере размещен только небольшой сайт WordPress с почти нулевым трафиком.
Последние два дня MariaDB постоянно вылетает с ошибкой OOM. Я перепробовал столько разных вещей для настройки производительности, но пока ничего не помогло. Это текущая конфигурация из файла my.cnf
:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# 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
performance_schema = off
innodb_buffer_pool_size = 1024M
key_buffer_size = 50M
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
Apache - это предварительная версия, и я добавил следующие настройки:
KeepAlive On
KeepAliveTimeout 3
StartServers 1
MinSpareServers 3
MaxSpareServers 6
ServerLimit 24
MaxClients 24
MaxRequestsPerChild 3000
Я тоже пробовал использовать настройки по умолчанию, и он без разницы. Вот примеры ошибок из журнала MariaDB:
160124 15:04:53 mysqld_safe Number of processes running now: 0
160124 15:04:53 mysqld_safe mysqld restarted
160124 15:05:47 [Note] /usr/libexec/mysqld (mysqld 5.5.44-MariaDB) starting as process 4014 ...
160124 15:05:47 InnoDB: The InnoDB memory heap is disabled
160124 15:05:47 InnoDB: Mutexes and rw_locks use GCC atomic builtins
160124 15:05:47 InnoDB: Compressed tables use zlib 1.2.7
160124 15:05:47 InnoDB: Using Linux native AIO
160124 15:05:48 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137756672 bytes) failed; errno 12
160124 15:05:48 InnoDB: Completed initialization of buffer pool
160124 15:05:48 InnoDB: Fatal error: cannot allocate memory for the buffer pool
160124 15:05:48 [ERROR] Plugin 'InnoDB' init function returned error.
160124 15:05:48 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
160124 15:05:48 [ERROR] mysqld: Out of memory (Needed 128917504 bytes)
160124 15:05:48 [ERROR] mysqld: Out of memory (Needed 96681984 bytes)
160124 15:05:48 [ERROR] mysqld: Out of memory (Needed 72499200 bytes)
160124 15:05:51 [Note] Plugin 'FEEDBACK' is disabled.
160124 15:05:52 [ERROR] Unknown/unsupported storage engine: InnoDB
160124 15:05:52 [ERROR] Aborting
Что я могу сделать? У меня есть другие виртуальные машины в Azure с такими же характеристиками, на которых работает гораздо больше и более сложных сайтов, и у них нет сбоев.
EDIT Вот как выглядит память в течение одной минуты после запуска MariaDB:
[root@linuxvm admin]# systemctl start mariadb
[root@linuxvm admin]# free -m
total used free shared buff/cache available
Mem: 3442 670 2573 2 198 2577
Swap: 511 68 443
[root@linuxvm admin]# free -m
total used free shared buff/cache available
Mem: 3442 1181 2052 2 207 2059
Swap: 511 64 447
[root@linuxvm admin]# free -m
total used free shared buff/cache available
Mem: 3442 1523 1709 2 209 1715
Swap: 511 64 447
[root@linuxvm admin]# free -m
total used free shared buff/cache available
Mem: 3442 1829 1397 2 214 1404
Swap: 511 64 447
[root@linuxvm admin]# free -m
total used free shared buff/cache available
Mem: 3442 2713 506 2 222 515
Swap: 511 63 448
[root@linuxvm admin]# free -m
total used free shared buff/cache available
Mem: 3442 3206 93 2 143 59
Swap: 511 63 448
Я просто вставлю это сюда если кому-то это нужно, потому что я буквально наткнулся на ответ сейчас, методом проб и ошибок, после целого дня устранения этой проблемы. Я прочитал так много сообщений и блогов, и ни один из них не рекомендовал добавлять директиву max_connections
в my.cnf
.
После добавления следующих строк все мои проблемы исчезли, и MariaDB / MySQL перестали занимать всю память. Возможно, вам потребуется скорректировать значения для вашего конкретного сценария.
[mysqld]
max_connections = 50
innodb_buffer_pool_size = 1024M
По умолчанию на виртуальных машинах Linux не включена свопинг ...
Когда вы запускаете виртуальную машину, выбирается случайный «вычислительный узел», имеющий емкость размером выбранная вами виртуальная машина. Compute Node - это просто сильно модифицированная машина с установленным Hyper-V. Диск с ОС; / dev / sda не является локальным для этого сервера и, следовательно, не так быстро, как локальное хранилище. (а также с учетом регулирования, проверьте количество операций ввода-вывода в секунду, которое позволяет размер вашей виртуальной машины.)
Однако вы получите локальный временный диск на / dev / sdb, который подходит для подкачки. (/ dev / sdb). Проблема в том, что ваша виртуальная машина не всегда может быть размещена на одном вычислительном узле. (Если размер вашей виртуальной машины изменен или она выключена более чем на 5 минут, она считается «освобожденной», что означает, что при повторном запуске она имеет высокую вероятность использовать другой вычислительный узел, на котором не будет вашего локального диска.
Чтобы решить эту проблему, виртуальные машины Linux используют программное обеспечение под названием WALinuxAgent, которое, помимо прочего, позволяет создавать файл подкачки.Каждый раз, когда ваша виртуальная машина запускается, агент будет создавать файл подкачки на временном диске.
По умолчанию он не включен, но вы можете включить его в: /etc/waagent.conf[1248 visible Измените n на y и перезагрузитесь, таким образом, если mysqld использует слишком много памяти, OOM-killer не сработает и не отключит вашу виртуальную машину.