Mysql Настройка количества max_connections

Активист

Активист
Команда форума
По умолчанию в MySQL параметр равен 151. Такой вопрос - в связке php 7.0-fpm где у нас следующие конфиг:

echo '[www-data]
listen.owner = www-data
listen.group = www-data
user = www-data
group = www-data
listen = /run/php/www-data/php-7.0-fpm.sock
pm = dynamic
pm.max_children = 20
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500
; request_slowlog_timeout = 5s
; slowlog = /var/log/php-7.0-fpm/www-data.slow.log
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f [email protected]
php_admin_value[session.save_path] = /var/lib/php5
php_admin_flag[opcache.enable] = off' > /opt/php-7.0-fpm.d/www-data.conf

Т.е. максимально у нас может быть активных 20 FPM процессов (CPU 12 ядер). Как понимаю, один FPM процесс может обрабатывать только один запрос (параллельно запросы он обрабатывать не может?). При этом у нас там есть еще 3 соединения (mysql console и master/master репликация.

20 запросов на PHP вполне себе нормально. Вопрос такой, стоит ли ограничить max_connection в 25 коннектов при такой конфигурации сервера? Не приведет ли это к too many connections?

Одновременно на сайте человек 50-170 в пики, но 24 FPM-ов вполне себе справляются. Как понимаю, логичнее их вообще уменьшить до 12 по количеству ядер? Запросы обрабатываются fpm-ом где за 30-50 мс.

Еще заметил, что при show processlist; есть коннекты со статусом sleep (хотя pconnect естественно не используется, а используется PDO). Сами коннеты со статусом sleep входят в эти 25 коннектов лимита?
 

Активист

Активист
Команда форума
разве это не daemon подобный webserver который на каждого клиента создаст новый socket?
Ну сокет допустим он создает (и ставит в очередь на выполнение), но по логике один children обрабатывает только один запрос в своем же thread'e.
 

fixxxer

К.О.
Партнер клуба
А зачем вообще ограничивать max_connections? Поставить заведомо достаточное число и все, скажем, 512. Неактивные соединения ресурсов не потребляют (структурку размером в несколько байт можно не считать).

Смысл в таком ограничении я вижу только на шаред-хостинге, где неизвестно какой код, и кто-то может нагородить pconnect-ов с тяжелой транзакцией в каждом.
 

Активист

Активист
Команда форума
А зачем вообще ограничивать max_connections? Поставить заведомо достаточное число и все, скажем, 512. Неактивные соединения ресурсов не потребляют (структурку размером в несколько байт можно не считать).
Теоретически появится ситуация, при которой будут создавать ненужные соединения. А на каждое соединение выделяется много памяти (для кешей и т.п.), https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl говорит что у меня памяти не хватит :)
 

fixxxer

К.О.
Партнер клуба
на каждое соединение выделяется
Не на соединения, а на запросы и на транзакции, разные все же вещи.
Теоретически появится
Ну, если непонятно какой код крутится - тогда, да, вполне может быть.
 

WMix

герр M:)ller
Партнер клуба
Как понимаю, логичнее их вообще уменьшить до 12 по количеству ядер
глупости, на одном ядре вполне себе 100 псевдо параллельных процессов уживается, погляди в top и осозной что их у тебя уже больше 12.
пока 1 процесс спит (ожидает ответа от mysql) другой работает
 

Активист

Активист
Команда форума
fixxxer прав, - оставь по дефолту. А когда станет не хватать, добавишь.
У тебя же не фейсбук, чтобы делать подобные тонкие настройки.
Ну хорошо, я хочу понять как устроен php fpm и сколько теоретически php fpm в условиях экстремальной нагрузки может забрать памяти mysql. Из программирования c++ thread safe процесс может выполнять только один процесс в приделах потока (иначе должно быть деления на различные ядра тех или иных процессов, но у нас это php fpm master proccess). Так все таки, в условии, что у меня PHP с закрытием коннектов на MySQL после выполнения, может ли у меня превысить количество коннектов от размера pm.max_children ? Dedlock лочит процесс PHP FPM? Это не просто интерес, сегодня у меня 150 коннектов одновременно, завтра 5000.
Вообще, сейчас возникла проблема задержки репликации типа master-master на MySQL, редко, но возникают случаи когда auto increment как primary key дублируется на двух MySQL серверах (в связки master master), срочно перепиливаем всё ПО (как систему хранения данных, так и системы АИС АРМ сотрудников на UUID в CHAR36 и BINARY(16) с целью ухода от проблем отказа реплики. Кстати, сталкивался ли кто с проблемами реплики в MySQL когда auto_increment на двух ведущих серверах конфликтовал?
 

WMix

герр M:)ller
Партнер клуба
(иначе должно быть деления на различные ядра тех или иных процессов
https://ru.wikipedia.org/wiki/Диспетчер_операционной_системы

и это не thread это процесс типа fork.

Так все таки, в условии, что у меня PHP с закрытием коннектов на MySQL после выполнения, может ли у меня превысить количество коннектов от размера pm.max_children
по идеи нет
 

Активист

Активист
Команда форума
глупости, на одном ядре вполне себе 100 псевдо параллельных процессов уживается, погляди в top и осозной что их у тебя уже больше 12.
пока 1 процесс спит (ожидает ответа от mysql) другой работает
Нее, php-fpm по коду (из c++, насколько позволяют мои знания c++) работает как multiple process one thread ber proccess, но при этом есть мастер процесс (php-fpm master) который управляет дочерними процессами (multiple process). Погуглю.
 

fixxxer

К.О.
Партнер клуба
В php-fpm
1) нет никаких тредов,
2) нет никакого С++, классический C.

Есть мастер, который слушает сокет, есть воркеры, которые обрабатывают запросы. Один воркер одновременно обрабатывает один запрос. Количество воркеров задается в конфигурации php-fpm.

php-fpm в этом смысле ничем принципиально не отличается от apache(mod_prefork) + mod_php.
 

fixxxer

К.О.
Партнер клуба
может ли у меня превысить количество коннектов от размера pm.max_children
Может:
1) pconnect
2) несколько соединений в рамках одного запроса
3) пока выполнялся долгий запрос/транзакция, воркер отвалился по таймауту
4) ...
 

Активист

Активист
Команда форума
Согласен) Правда мои знания делитанта не разделяют понятия c и cpp, поскольку что gcc, что vc builder поддерживает как c, так и сpp.
 

Активист

Активист
Команда форума
Может:
1) pconnect
2) несколько соединений в рамках одного запроса
3) пока выполнялся долгий запрос/транзакция, воркер отвалился по таймауту
4) ...
Если я уверен, что pconnect не используется, несколько запросов в приделах одного скрипта быть не может, и долгие транзакции тоже отсутсвуют, значит я могу лимитировать количество соедининей как n+2, где n - количество максимальных children процессов?
 

fixxxer

К.О.
Партнер клуба
Да, вполне. Хотя я бы оставил запас побольше на всякий случай. Мало ли, что-то сломалось и все с консоли в этот mysql вдруг полезли. Ну плюс еще репликация это тоже соединения.
 

Активист

Активист
Команда форума
Добавим. Вопрос был в плане понимания.

Коллеги, сейчас столкнулся с проблемой типа dublicate primary key. Читал интернеты и наткнулся на то, что (как и я) в добавил в конфик [mysqld] опцию "#binlog_format=row", судя по отзывам - глючит безбожно (mysql 5.5) - бред, даже со слейвов, с которых снимаю резервную копию возникают ошибки. Сейчас опцию отключил.

В целом, как лучше реплику настроить для бОльшей стабильности для 5.5? statement все же?

И вообще, три года назад имел глупость начать работать то ли с MySQL то ли с auto_increment, все было хорошо, пока не появилась реплика, уходить от MySQL уже сложно. Сейчас что хочу сделать. Уйти от всех auto_increment, сделать uuid (как char 36, так и binary (16) с индексом), с целью, что бы каждая запись у меня все же была уникальна в приделах базы. Как, правильное решение для double primary key? Кто как это решал, а если не решал, то как бы поступил? В целом, вся система хранит немного данных (3 млн заказов, 10 млн событий журнала (хранить 5 лет)), 50 млн координат (срок хранения 1 год). Самые важные данные - транзакции (и информация о них), там их примерно 2,5 млн (на 3 млн заказов). Данные растут где-то на 100-200 тысяч в месяц от базового роста. В связке master-master репликации кто как решал те или иные, возникающие проблемы, в процессе эксплуатации?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Добавим. Вопрос был в плане понимания.

Коллеги, сейчас столкнулся с проблемой типа dublicate primary key. Читал интернеты и наткнулся на то, что (как и я) в добавил в конфик [mysqld] опцию "#binlog_format=row", судя по отзывам - глючит безбожно (mysql 5.5) - бред, даже со слейвов, с которых снимаю резервную копию возникают ошибки. Сейчас опцию отключил.

В целом, как лучше реплику настроить для бОльшей стабильности для 5.5? statement все же?

И вообще, три года назад имел глупость начать работать то ли с MySQL то ли с auto_increment, все было хорошо, пока не появилась реплика, уходить от MySQL уже сложно. Сейчас что хочу сделать. Уйти от всех auto_increment, сделать uuid (как char 36, так и binary (16) с индексом), с целью, что бы каждая запись у меня все же была уникальна в приделах базы. Как, правильное решение для double primary key? Кто как это решал, а если не решал, то как бы поступил? В целом, вся система хранит немного данных (3 млн заказов, 10 млн событий журнала (хранить 5 лет)), 50 млн координат (срок хранения 1 год). Самые важные данные - транзакции (и информация о них), там их примерно 2,5 млн (на 3 млн заказов). Данные растут где-то на 100-200 тысяч в месяц от базового роста. В связке master-master репликации кто как решал те или иные, возникающие проблемы, в процессе эксплуатации?
И щас окажется, что у него там MyISAM.
 
  • Like
Реакции: WMix

Активист

Активист
Команда форума
И щас окажется, что у него там MyISAM.
Нет. Но транзакции я не использую, под no_sql готовлюсь (все проверки на стороне обрабатывающих серверов, в т.ч. отсутсвуют foreign keys). Единственное по мимо оптимизаций там innodb_per_table=1 (разделенные таблицы по файлам).

Так, что если бы был myisam - я бы вообще замучался?))
 

WMix

герр M:)ller
Партнер клуба
Нее, php-fpm по коду (из c++, насколько позволяют мои знания c++) работает как multiple process one thread ber proccess, но при этом есть мастер процесс (php-fpm master) который управляет дочерними процессами (multiple process). Погуглю.
и я об этом, threads тут нет (threads это в первую очередь общая память у 2х threads, когда тебе нужно указывать synchronized для методов, как будто ты транзакцию проводишь)
 
Сверху