Сбои соединения PHP / MYSQL при большой нагрузке через mysql.sock

Я довольно много читал, прежде чем спрашивать об этом, поэтому позвольте мне предисловие, сказав, что у меня не заканчиваются соединения, или память, или процессор, и, насколько я могу судить, у меня также не заканчиваются файловые дескрипторы.

Вот что PHP бросает в меня, когда MySQL находится под большой нагрузкой:

Не удается подключиться к локальному серверу MySQL через сокет «/var/lib/mysql/mysql.sock» (11 «Ресурс временно недоступен»)

Это происходит случайным образом под нагрузкой — но чем больше я нажимаю, тем чаще php бросает это в меня. Пока это происходит, я всегда могу подключиться локально через консоль и из PHP через 127.0.0.1 вместо «localhost», который использует более быстрый сокет unix.

Вот несколько системных переменных, чтобы отсеять обычные проблемы:

cat /proc/sys/fs/file-max = 4895952
lsof | wc -l = 215778 (during "outages")

Максимальное использование доступных соединений: 26% (261/1000)

InnoDB буферный пул / размер данных: 10.0G / 3.7G (много места)

  • мягкий нофиле 999999
  • жесткий нофиле 999999

Я фактически использую MariaDB (версия сервера: 10.0.17-MariaDB MariaDB Server)

Эти результаты генерируются как при нормальной нагрузке, так и при запуске mysqlslap в нерабочее время, поэтому медленные запросы не являются проблемой — просто высокие соединения.

Любой совет? Я могу сообщить о дополнительных настройках / данных, если необходимо — mysqltuner.pl говорит, что все в порядке

и опять же, показательно то, что подключение по IP работает очень хорошо и быстро во время этих отключений — я просто не могу понять, почему.

Изменить: вот мой my.ini (некоторые значения могут показаться немного высокими из-за моих недавних изменений по устранению неполадок, и имейте в виду, что в журналах MySQL, системных журналах или dmesg нет ошибок)

socket=/var/lib/mysql/mysql.sock
skip-external-locking
skip-name-resolve
table_open_cache=8092
thread_cache_size=16
back_log=3000
max_connect_errors=10000
interactive_timeout=3600
wait_timeout=600
max_connections=1000
max_allowed_packet=16M
tmp_table_size=64M
max_heap_table_size=64M
sort_buffer_size=1M
read_buffer_size=1M
read_rnd_buffer_size=8M
join_buffer_size=1M
innodb_log_file_size=256M
innodb_log_buffer_size=8M
innodb_buffer_pool_size=10G

[mysql.server]
user=mysql

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
open-files-limit=65535

15

Решение

Скорее всего это связано с net.core.somaxconn
Какова стоимость /proc/sys/net/core/somaxconn

net.core.somaxconn

# The maximum number of "backlogged sockets".  Default is 128.

Соединения в очереди, которые еще не подключены. Любая вещь выше этой очереди будет отклонена. Я подозреваю, что это в вашем случае. Попробуйте увеличить его в соответствии с вашей нагрузкой.

от имени пользователя root

echo 1024 > /proc/sys/net/core/somaxconn
9

Другие решения

Это то, что может и должно быть решено с помощью анализа. Научиться делать это — отличный навык.

Анализ, чтобы выяснить, что происходит под большой нагрузкой … количество запросов, время выполнения должно быть вашим первым шагом. Определите нагрузку и затем выполните правильные настройки конфигурации базы данных. Вы можете найти, что вам нужно оптимизировать запросы SQL вместо этого!

Затем убедитесь, что настройки драйвера PHP db выровнены, чтобы полностью использовать соединения с базой данных.

Вот ссылка на документацию пула потоков MariaDB. Я знаю, что написано версия 5.5, но она по-прежнему актуальна, и страница ссылается на версию 10. В списке перечислены параметры, которые могут отсутствовать в вашем файле .cnf, который вы можете использовать.

https://mariadb.com/kb/en/mariadb/threadpool-in-55/

0

С самого начала я могу думать о max_connections как о возможном источнике проблемы. Я бы увеличил лимит, чтобы хотя бы исключить возможность.

Надеюсь, поможет.

0
По вопросам рекламы [email protected]