LINUX.ORG.RU
ФорумAdmin

Периодическая проблема с подключением к mysql

 , ,


1

2

Имеется ubuntu-10.04-LTS сервер с apache + mod_php и mysql.
Периодически в логах apache проскакивают сообщения
> Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
с указанием php-файла, в котором возникла ошибка.
Ошибка возникает не постоянно, а изредка, какой-либо закономерности её возникновения замечено не было.

Естественно по указанному пути находится действующий mysql сокет с правами rw для всех, и права на каталоги тоже позволяют добраться к сокету всем.

Логины/пароли в php указаны заведомо верные (делал их вывод в том месте кода, где mysql_connect() отрабатывал с ошибкой, в отдельный лог - все параметры правильные).

Также заранее хочу указать на то, что лимит подключений к mysql не достигается, иначе ошибка была бы «Too many connections», и mysqltuner показывал, что max подключений было ~80% от лимита.

Значение net.core.somaxconn было выставлено > 1000, max_connections в mysql =768. Соответственно при любом наплыве одновременных подключений в очередь попадало бы гарантированно больше, чем мог принять mysql. Раз лимит не достигался, значит somaxconn тут не при чём.

Пробовал даже уменьшить somaxconn до 5 и натравить (с того же хоста) на apache ab с 150..500 параллельными запросами. За время теста из десятка запусков ab ошибка проявилась только 1 раз. strace всех процессов apache во время проведения теста не показал ничего интересного:
нормальный коннект
> [pid 21418] connect(40, {sa_family=AF_FILE, path=«/var/run/mysqld/mysqld.sock»}, 110) = 0
проблемный
> [pid 20010] connect(41, {sa_family=AF_FILE, path=«/var/run/mysqld/mysqld.sock»}, 110 <unfinished ...>
В логах mysql и dmesg тоже тишина.

Тест проводил ночью при спаде активности на сервере, днём таких ошибок в логи сыпется значительно больше.

Сегодня пробовал перевести все сайты на работу с mysql по tcp - снова вылезли глюки:
PHP Warning: mysql_connect(): Lost connection to MySQL server at 'reading initial communication packet', system error: 110

Версии ПО (установлены из стандартных пакетов):
mysql-5.1.62
php-5.3.2
apache2-2.2.14

Идеи справиться с проблемой кончились. Может кто сталкивался с таким или знает с какой ещё стороны можно подойти ?

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

В энторнетах советуют (по крайней мере в TCP режиме) юзать localhost вместо 127.0.0.1, хотя лично я туго понимаю каким боком это помогает...

Вообщем я бы проверил заодно железо, возможно что-то глючит.

blind_oracle ★★★★★
()
Ответ на: комментарий от blind_oracle

А, вспомнил, при использовании локалхост оно как раз переходит на локальные сокеты, так что это вряд-ли поможет.

blind_oracle ★★★★★
()

Идентичные симптомы на работе (и can connect и lost), только:

  • хост винда клиент/сервер;
  • через сеть (даже больше: VPN через инет);
  • не так часто, как ты описал.

Сразу каюсь - ковырялся в конфиге (=«оптимизировал»), но ничего такого криминального - буферы всякие. Обычно грешил на сеть, но раз и на сокетах так. Хм. Мож бага?

Соединений штук 20 - не больше.

vahtu
()
Ответ на: комментарий от blind_oracle

Сменить драйвер - это переделать кучу всего :-) Я не разработчик, я - администратор. Мне нужно именно починить то, что есть.


По поводу железа тоже мысли были, но неделю назад, когда сервер был ещё не в работе, я тестировал память (memtester) и винты (smartctl -t long) - всё было в норме.

Да и в железе ли дело ? Если хорошо подумать, то при общении apache с mysql всё происходит внутри самого сервера, можно сказать в памяти (cpu+ram), другие железки при этом не задействованы.

spirit ★★★★★
() автор топика

Забыл:

  • Community Server 5.1.31;
  • Ч/з odbc;
  • Базы ~15GB, таблиц мало;
vahtu
()

А что с перформансом хоста в это время?

zgen ★★★★★
()

Ну и ss в момент отвала неплохо бы увидеть.

leave ★★★★★
()
Ответ на: комментарий от leave

mysql uptime сейчас уже более 20ч (вчера правили конфиг, перезапускали часто).
LA - 4..5, сервер 8-ядерный, 24Gb памяти

Глянул ещё раз в логи, а там похоже процессы устроили DoS :-)
possible SYN flooding on port 3306. Sending cookies.

tcpdump на syn пакеты к порту 3306 показывает 200..250 подключений/с.

ss с каким параметром запустить ? А то там выводится 24187 строк.

spirit ★★★★★
() автор топика

Увеличил thread_cache_size с 8 до 64, пока ошибки сыпаться прекратили, хотя до этого эффективность кэша была порядка 80%. Посмотрим что будет завтра.

http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_th...
---
Normally, this does not provide a notable performance improvement if you have a good thread implementation. However, if your server sees hundreds of connections per second you should normally set thread_cache_size high enough so that most new connections use cached threads.

spirit ★★★★★
() автор топика
Ответ на: комментарий от spirit

Драйвер насколько я помню меняется прозрачно, т.е. API остаётся тот же самый, просто PHP отвязывается от libmysqlclient, а юзает встроенный код (mysqlnd).

Скрипты переписывать не надо.

blind_oracle ★★★★★
()
Ответ на: комментарий от spirit
ss -o state established 'sport = :mysql'

И еще глянуть тут:

mysql -u root -e 'show processlist'
Предвижу много процессов в 'sleep', не закрывших соединение. Или медленные запросы, особенно при повышении кол-ва соединений в секунду. Это может исчерпать max_connections - дальше пойдет отлуп.

fjoe
()
Ответ на: комментарий от fjoe

Много процессов в sleep нет, show processlist показывает порядка 15..30 подключений, часто даже меньше 10, и это при 250..350 подключениях в секунду. Про max_connections я писал выше.

Как и предполагалось сегодня снова куча ошибок в логах. Будем копать дальше.

spirit ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.