Я довольно много читал, прежде чем спрашивать об этом, поэтому позвольте мне предисловие, сказав, что у меня не заканчиваются соединения, или память, или процессор, и, насколько я могу судить, у меня также не заканчиваются файловые дескрипторы.
Вот что 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 (много места)
Я фактически использую 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
Скорее всего это связано с 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
Это то, что может и должно быть решено с помощью анализа. Научиться делать это — отличный навык.
Анализ, чтобы выяснить, что происходит под большой нагрузкой … количество запросов, время выполнения должно быть вашим первым шагом. Определите нагрузку и затем выполните правильные настройки конфигурации базы данных. Вы можете найти, что вам нужно оптимизировать запросы SQL вместо этого!
Затем убедитесь, что настройки драйвера PHP db выровнены, чтобы полностью использовать соединения с базой данных.
Вот ссылка на документацию пула потоков MariaDB. Я знаю, что написано версия 5.5, но она по-прежнему актуальна, и страница ссылается на версию 10. В списке перечислены параметры, которые могут отсутствовать в вашем файле .cnf, который вы можете использовать.
С самого начала я могу думать о max_connections как о возможном источнике проблемы. Я бы увеличил лимит, чтобы хотя бы исключить возможность.
Надеюсь, поможет.