2013-06-09 3 views
1

Вот вещь: У меня есть сервер приложений, называется A, а сервер БД, называется Б.Соединение Mysql не выпущено?

На B (DB), когда я бегу netstat -ntp | grep 'A's IP' | wc -l, я вижу более 400 соединений TCP. И когда я подключен к MySQL с помощью клиента MySQL и запустить select count(*) from processlist where host like 'A's IP%', я вижу более 400 результатов тоже, так что кажется, что и MySQL & OS согласен есть более 400 открытых соединений с А.

Однако, когда я входа в A, запустите netstat -ntp | grep 'B's IP' | wc -l, я вижу только более 100 соединений TCP.

Как это может случиться? Я использую netstat неправильно, или что? Я просто не понимаю, почему два хоста не согласны с тем, сколько TCP-соединений между ними.

Быстрое обновление: На самом деле у нас есть 6 различных проектов на A (некоторые из них - Rails 3.2, Some - Rails 2.3), один из них redmine. Я беру результат show processlist на B, сравнивая его с netstat -ntp на A, выяснил, что непревзойденные соединения на B - из разных проектов, включая redmine.

PS: Обе ОС CentOS 5.4, MySQL является Percona 5.1.57-rel12.8-журнал

PS2: Мы перезагружается все серверы/оборудований, но проблема все еще существует. Поскольку это получилось совершенно неожиданно, я предполагаю, что проблема/ошибка всегда есть, но мы этого не замечали, пока не достигли 1000 максимальных подключений, которые мы установили. Так какие-то дикие догадки? Это может быть ошибка кода приложения (activerecord или mysql gem)? Ошибка ОС? или что?

ответ

1

Приложения на A, вероятно, не закрывают свои соединения с MySQL при завершении.

Когда процесс завершается на А, соединения они владеют должны быть отброшены автоматически с помощью операционной системы, но по-прежнему В ожидании сигнала от А.

В конечном итоге освободить эти соединения, когда (баз данных) Время -выход задержки.

Трудно быть более конкретным, не зная больше о применении на А, но нет ничего удивительного отсюда (если вы не ожидали приложений на быть сломаны :)

+0

На самом деле это приложение Rails с использованием ActiveRecord и DbCharmer для подключения нескольких БД, здесь ничего особенного. Я нашел эту проблему, когда на днях я вижу ошибку mysql too many connections, она просто вышла из-под контроля, так что вы все-таки думаете, что это ошибка приложения? –

+0

Да, это так. Вы можете уменьшить проблему, уменьшив значение ['wait_timeout'] (http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_wait_timeout) или [' interactive_timeout'] (http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_interactive_timeout) на B, но это только обходной путь, что-то не так на A. – RandomSeed

+1

Я просто сделал быстрый тест. На машине a, 'mysql -h 'b's ip'' blah blah для подключения к MySQL на машине b. Между тем, когда я запускаю 'netstat' или mysql show processlist на машине b, я вижу соединение там. Затем на машине a я убиваю процесс 'kill -9 process_id', а затем запускает' netstat' снова на машине b, соединение уходит, и оно также не существует в 'show processlist'. –

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