Подтвердить что ты не робот

Ошибки соединения 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 (много места)

  • soft nofile 999999
  • hard nofile 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
4b9b3361

Ответ 1

Скорее всего, это связано с 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 

Ответ 2

Это то, что можно и нужно решить путем анализа. Изучение того, как это сделать, - это отличное умение иметь.

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

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

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

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

Ответ 3

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

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