2015-03-03 3 views
13

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

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

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

Это происходит случайно при загрузке - но чем больше я нажимаю, тем чаще 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,0 г/3.7g (много о номере)

  • мягкий nofile 999999
  • жесткий nofile 999999

Я на самом деле работает MariaDB (версия сервера: 10.0.17-MariaDB MariaDB Server)

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

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

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

Edit: вот мой 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 
+0

Что ваш диск I/O, как? если ваше узкое место не попало в память, процессор или соединения, скорее всего, это связано с дисковым вводом/выводом при загрузке, не поддерживаемым .sock. Вы пытались не использовать сокет? – user3036342

+0

В моем абсолютном худшем случае все еще было 0% iowait (и html-страницы работают хорошо и быстро, консоль быстрая и т. Д., А не проблема с IO-диском) - я могу попробовать не использовать локальный сокет, но это просто порождает проблемы сети вводя кучу, больше загружает стек TCP уже загруженного сервера. Я бы предпочел остаться с более быстрым и рекомендуемым методом локальных сокетов. –

+0

Его возможная ошибка. Попробуйте изменить свою версию. –

ответ

7

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

net.core.somaxconn 

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

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

в качестве привилегированного пользователя запуска

echo 1024 > /proc/sys/net/core/somaxconn 
+0

Было установлено значение 4096, я вчера его изменил, когда нашел, что он опубликован как решение для проблемы php-fpm/nginx с локальными гнездами. Теперь, когда трафик низкий, у меня была возможность попробовать его снова, и я обнаружил, что ошибки ушли! Я собираюсь наградить вас щедростью на этом, потому что я считаю, что вы правы! Скорее всего, это преступник, спасибо! –

+1

Это был окончательный список параметров, измененных относительно net.core: net.core.somaxconn = 4096 net.core.netdev_max_backlog = 4096 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 –

+0

Хорошо знать что ваша проблема исправлена. спасибо –

0

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

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

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

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

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

+0

Я ценю вашу откровенность, но я делал это довольно долго, следил за лучшими практиками, читал много книг по этому вопросу и никогда не сталкивался с этой проблемой раньше. Я размещаю здесь, потому что независимо от запроса (как показано, используя только mysqlslap) для установки умеренной (<25% загрузки процессора) на машине, я получаю эти ошибки от PHP-FPM, и все время база данных быстро реагирует через TCP или командная строка.оптимизация базы данных не влияет на это явление. Я не часто задаю вопросы здесь, только очень трудные вещи. –

+0

Я не хочу быть грубым, но я не ищу «читать руководство» в качестве решения. У меня не хватает процессора, ОЗУ или файловых дескрипторов, База данных не замедляется, она прекрасно реагирует. В dmesg и mysql нет ошибок. Вероятно, это ОС или проблема с php, я не уверен, какой именно, я здесь, чтобы получить некоторую помощь, потому что после обширных исследований я в тупике - я прочитал руководства. –

+0

Эта методология используется для решения таких проблем. Я только хотел, чтобы вы просмотрели настройки, а не RTFM. Одевают. –

0

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

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

+0

Спасибо за ответ. Я упоминал выше, что я отслеживаю это: Наивысшее использование доступных подключений: 26% (261/1000) –

Смежные вопросы