Amazon EC2, mysql аборт починається через те, що InnoDB: mmap (x байт) не вдалося; errno 12


95

Я створив сервер мікропримірників на EC2 на основі того, що я прочитав тут

сервер mysql часто виходить з ладу, і втретє сервер mysql відсутній. Журнали лише показують

120423 09:13:38 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
120423 09:14:27 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
120423  9:14:27 [Note] Plugin 'FEDERATED' is disabled.
120423  9:14:27 InnoDB: The InnoDB memory heap is disabled
120423  9:14:27 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120423  9:14:27 InnoDB: Compressed tables use zlib 1.2.3
120423  9:14:27 InnoDB: Using Linux native AIO
120423  9:14:27 InnoDB: Initializing buffer pool, size = 512.0M
InnoDB: mmap(549453824 bytes) failed; errno 12
120423  9:14:27 InnoDB: Completed initialization of buffer pool
120423  9:14:27 InnoDB: Fatal error: cannot allocate memory for the buffer pool
120423  9:14:27 [ERROR] Plugin 'InnoDB' init function returned error.
120423  9:14:27 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
120423  9:14:27 [ERROR] Unknown/unsupported storage engine: InnoDB
120423  9:14:27 [ERROR] Aborting

Що насправді failed; errno 12? І як я міг би дати більше місця / пам’яті чи всього, що потрібно, щоб це виправити.

Я це виправляю кожен раз, перезавантажуючи всю систему та видаляючи всі журнали та перезавантажуючи сервер mysql. Але я знаю, що з моєю конфігурацією щось не так.

Також мій `my.cnf ', як показано нижче:

[mysqld]
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# max_allowed_packet=500M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0


innodb_buffer_pool_size         = 512M


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

У мене така ж проблема в мікроекземплярі EC2. Спробували встановити innodb_buffer_pool_size = 128М, і побачите, як це відбувається.
swxxii

Можливо, вам доведеться додати простір підкачки, якщо ви використовуєте мікропримірник: prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html
pmoubed

1
У мікроінстанціях EC2 немає місця заміну за замовчуванням, і його потрібно встановити вручну. В іншому випадку ви можете побачити безліч збоїв MySQL через брак пам'яті.
pmoubed

Відповіді:


163

Я зіткнувся з тією ж проблемою, коли спробував запустити wordpress на своєму мікроекземплярі без RDS.

Додавання сторінки Swap вирішило проблему для мене.

Ви можете виконати наступні кроки, щоб налаштувати місце для заміни.

Якщо це все ще не працює для вас, спробуйте скористатися послугою RDS.

===================================================

Я скопіював вміст блогу для запису. Кредит належить автору блогу pmoubed :

Мікроінстанційний обмінний простір Amazon EC2 - Linux

У мене є екземпляр Micro Micro від Amazon EC2. Оскільки Micro-екземпляри мають лише 613 Мб пам’яті, MySQL раз у раз аварійно завершував роботу. Після тривалих пошуків щодо MySQL, Micro Instance та Керування пам'яттю я з’ясував, що для екземпляру Micro немає місця SWAP за замовчуванням. Отже, якщо ви хочете уникнути аварійного завершення роботи, можливо, вам доведеться налаштувати простір підкачки для вашого мікропримірника. Насправді ефективність роботи краще, щоб включити своп.

Наведені нижче кроки показують, як зробити місце підкачки для вашого екземпляра Micro. Я припускаю, що у вас є обліковий запис AWS із запущеним екземпляром Micro.

  1. Біжи dd if=/dev/zero of=/swapfile bs=1M count=1024
  2. Біжи mkswap /swapfile
  3. Біжи swapon /swapfile
  4. Додайте цей рядок /swapfile swap swap defaults 0 0до/etc/fstab

Крок 4 необхідний, якщо ви хочете автоматично ввімкнути файл підкачки після кожного перезавантаження.

Деякі корисні команди, пов'язані з простором SWAP:

$ swapon -s   
$ free -k

$ swapoff -a
$ swapon  -a

Список літератури:

  1. http://www.thegeekstuff.com/2010/08/how-to-add-swap-space/
  2. http://cloudstory.in/2012/02/getting-the-best-out-of-amazon-ec2-micro-instance/
  3. http://cloudstory.in/2012/02/adding-swap-space-to-amazon-ec2-linux-micro-instance-to-increase-the-performance/
  4. http://aws.amazon.com/ec2/instan-types/

Дякую! Це мені допомогло!
Скасувати

8
FYI, це працювало для мене на цифровій океанській краплі (512 Мб). Не те, що це повинно когось здивувати, але у випадку, якщо хтось не впевнений, він, ймовірно, буде працювати на будь-якому сервері з тими ж проблемами.
jfacemyer

Дякую за цю рятівницю! Також було запущено мікроекземпляр з Ubuntu Server.
ECC-Dan

4
Для користувачів Digital Ocean я дотримувався цього підручника, і він спрацьовував як принадність: digitalocean.com/community/articles/…
Кріс Рей

Дуже дякую. Протягом останніх 24 годин витягую волосся, граю з різними розмірами буфера / кешу / запитів. Ви - рятувальник життя!
праншус

23

У мене ця проблема була і на мікроекземплярі Amazon EC2. Я спробував зменшити використання пам'яті inno_db, додавши в/etc/my.cnf

innodb_buffer_pool_size = 64M

Це не спрацювало, я спробував скинути його до 16М, і він все ще не працював. Тоді я зрозумів, що екземпляр в основному має нульову вільну пам'ять. Тому я спробував перезапустити апаш

http: перезапуск системи sudo
перезапуск системи mysdo

І все працювало чудово. Можливо, іншим рішенням є налаштувати apache, щоб якось не з'їдати стільки пам’яті.


2
MySQL все ще може вийти з ладу, тому вам може знадобитися додати простір для мікступу до свого мікроекземпляра.
pmoubed

Дякую, це має сенс. Я думаю, що я також можу спробувати обмежити кількість потоків, які апаш може породити.
wfbarksdale

Чудово працює. У мене ця проблема теж є, і перезавантаження httpd вирішило проблему.
Лайонел Чан,

1
Чудовий улов, такий же човен тут. Я налаштував свій апаш на використання менше оперативної пам'яті, а також створив файл обміну 512 м, але встановив vm.swappiness на 10, щоб він міг використовуватися лише в найменших масштабах.
newz2000

Перезапуск nginx та php-fpm також випустив достатню кількість пам'яті, щоб mysql запустився! Дякую!
msEmmaMays

4

Схоже, ви вимагаєте 128M пам’яті для innodb_buffer_pool_size у файлі my.cfg, який ви показуєте у публікації, але MySQL вважає, що ви вимагаєте 512M пам’яті:

Ініціалізація пулу буферів, розмір = 512.0M

Через кілька рядків повідомлення про помилку повідомляє, що MySQL не запускається, оскільки він не може зарезервувати достатньо (512 Мб) пам'яті для пулу буферів InnoDB:

Фатальна помилка: не вдається виділити пам’ять для пулу буферів

Це задає три питання:

  1. Скільки пам’яті на вашому екземплярі? Чи має бути достатньо пам’яті для розміщення 512M InnoDB намагається схопити за буферний пул, а також все, що виділяє MySQL, плюс ваші програми та додатки, а також операційну систему?
  2. Чому InnoDB намагається взяти більше, ніж ви думаєте, що слід?
  3. Чому MySQL перезапускається?

Ви можете відповісти на 1.

Що стосується 2., тут можуть бути розміщені декілька місць файлів опцій MySQL. Згодом знайдені файли заміняють параметри, зазначені в раніше знайдених файлах. Побачити

http://dev.mysql.com/doc/refman/5.5/uk/option-files.html

Випуск 3. може виникнути через стан пам'яті, який виникає десь після запуску. Ви повинні побачити вказівку на це далі в журналах, якщо це так.

Нарешті, але дещо не пов’язані між собою, ви використовуєте резервні копії EBS? Це, як правило, дуже рекомендується для серверів баз даних (власне, для будь-якого екземпляра, який забороняє особливі обставини). Більше про це див

https://stackoverflow.com/a/3630707/141172


2

Для мене ця саме проблема була виправлена ​​додаванням обсягу підкачки до мого екземпляра EC2. Мої служби просто витрачали всю пам’ять на коробці, і вони могли вийти з ладу. Не те, до чого я звик, будучи роками адміністратора RedHat / CentOS - Anaconda робить БАГАТО роботи, якої не робить безкоштовний екземпляр Ubuntu EC2.

Я просто створив 2 Гб том через веб-консоль, приєднав його до свого екземпляра і зробив "mkswap / dev / [whatever]", відредагував / etc / fstab, і збій припинився.

Ці екземпляри НЕ встановлюються, як установка на основі медіа-систем, до якої звикли більшість із нас - це позбавлена ​​голістю без пакетів, жодної належної файлової системи та таких речей, як AppArmor, які викликають усілякі проблеми, якщо ви цього не знаєте. та / або не знаю, як це налаштувати.


1

Проблема полягає в тому, що серверу не вистачає пам'яті для виділення для MySQL процесу. Існує декілька рішень цієї проблеми.

(1) Збільшити фізичну пам'ять. Додавання 1 ГБ додаткової оперативної пам’яті вирішить проблему. (2) Виділіть простір SWAP. Примірник Digital Ocean VPS за замовчуванням не налаштований для використання простору swap. Виділивши 512 Мб місця для обміну, ми змогли вирішити цю проблему. Щоб додати місця для заміни на сервері, виконайте наступні дії:

## As a root user, perform the following:
# dd if=/dev/zero of=/swap.dat bs=1024 count=512M
# mkswap /swap.dat
# swapon /swap.dat
## Edit the /etc/fstab, and the following entry.
/swap.dat      none    swap    sw      0       0 

Зменшити розмір пулу MySQL буфера

## Edit /etc/my.cnf, and add the following line under the [mysqld] heading.
[mysqld]
innodb_buffer_pool_size=64M

Також перевірте місце на диску. Переконайтеся, що у вас є достатньо місця.

df-h


1

ЛЕГКО ВІДПОВІДЬ:

* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld

ДЕТАЛЬНИЙ ВІДПОВІДЬ:

Це важливе питання, особливо для людей, які використовують дуже малий VPS, скажімо, 1 Гб оперативної пам'яті або менше. Якщо MySQL випадає, це може бути проблема з налаштуванням вашого сервера (Apache | nginx) або конфігурацією MySQL. DOS-атаки можуть спричинити посилений стрибок у використанні системних ресурсів (див. Зображення). Кінцевим результатом є те, що процес MySQL відбувається відключенням ядра. Для довгострокового рішення слід поглянути на оптимізацію конфігурацій Apache або MySQL.

Спік системних ресурсів, що спричиняє сплеск оперативної пам’яті (трохи раніше 18:00) та сплеск системних ресурсів, спричиняючи лише сплеск процесора опівночі вт 18

Існує ще кілька обговорень цих тем, а також керівництво MySQL та блог Percona:

Посібник по MySQL - Як MySQL використовує пам'ять:

https://dev.mysql.com/doc/refman/8.0/en/memory-use.html

Percona - Найкращі практики налаштування оптимального використання пам'яті MySQL:

https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/

Як оптимізувати продуктивність MySQL за допомогою MySQLTuner:

https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner/

Конфігурація використання пам'яті Apache:

/server/254436/apache-memory-usage-optimization

Посібник Apache з настройки продуктивності:

https://httpd.apache.org/docs/2.4/misc/perf-tuning.html

Налаштування сервера Apache:

https://www.linode.com/docs/web-servers/apache-tips-and-tricks/tuning-your-apache-server/

Однак, стосовно вашого початкового питання, так, ви можете написати сценарій тимчасового рішення, яке перевіряє, чи служба MySQL завантажена та активна, і перезапустить MySQL, якщо він не завантажений та активний.

Ви не згадали, яку операційну систему ви використовуєте. Це допоможе дати вам конкретну команду. Я надам вам приклад для CentOS linux.
Подивіться на наступний вихід команди systemctl status mysql. Ви бачите, що служба завантажена та активна .

[root@centos-mysql-demo ~]# systemctl status mysqld
 mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-06-18 18:28:18 UTC; 924ms ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 3350 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  Process: 3273 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 3353 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─3353 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

Jun 18 18:28:11 centos-mysql-demo systemd[1]: Starting MySQL Server...
Jun 18 18:28:18 centos-mysql-demo systemd[1]: Started MySQL Server.

Якщо послуга не завантажена, то виконується така команда, як:

systemctl status mysqld || systemctl restart mysqld 

зробить хитрість повторного запуску процесу. Ви можете сказати, що:

* * * * * systemctl status mysqld || systemctl restart mysqld

Однак у випадку, якщо mysql завантажений , але служба не активна , ваш cron нічого не зробить. Отже, вам слід скористатися більш детальною командою, наприклад:

* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld

У цьому випадку, якщо служба завантажена, але неактивна, наприклад, стан, що атака DOS може залишити вашу службу mysql, команда також перезапустить mysql. Використання --quietпрапора просто визначає команду лише для повернення коду стану, а не для виведення нічого на екран. Якщо ви опустите --quietпрапор, ви побачите вивід стану activeабоinactive .

Ви також можете створити трохи місця підкачки, щоб додати більше доступних ресурсів оперативної пам'яті на ваш сервер, таких як:

sudo dd if=/dev/zero of=/swapfile count=2096 bs=1MiB
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
swapon --summary
free -h

0

Використовуйте будь-яке із наступного рішення:

  1. Збільшити фізичну пам'ять. Додавання 1 ГБ додаткової оперативної пам’яті вирішить проблему.

  2. Виділіть простір SWAP за допомогою наведених нижче змін конфігурації:

конфігурація

dd if=/dev/zero of=/extraswap bs=1024 count=512M
mkswap  /extraswap 
swapon  /extraswap 
## Edit the /etc/fstab, and the following entry.
/extraswap      none    swap    sw      0       0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.