Назад | Перейти на главную страницу

Проблема MySQL с множеством одновременных подключений

вот шестиядерный с 32 ГБ ОЗУ. Я установил MySQL 5.1.47 (backport). Конфигурация почти стандартная, за исключением max_connections, для которой установлено значение 2000. С другой стороны, на nginx есть PHP5.3 / FastCGI. Есть очень простое приложение php, которое нужно обслуживать. NGINX может обрабатывать тысячи запросов параллельно на этой машине. Это приложение обращается к MySQL через mysqli. При использовании непостоянных соединений в mysqli возникает проблема при достижении 100 одновременных соединений.

[ошибка] 14074 # 0: * 296 FastCGI отправлен в stderr: "Предупреждение PHP: mysqli :: mysqli (): [2002] Ресурс временно недоступен (пытается подключиться через unix: ///tmp/mysqld.sock) в / var /www/libs/db.php в строке 7

Я не знаю, как это решить. Подключение к mysql через tcp ужасно медленное. Интересно то, что при использовании постоянных соединений (добавьте 'p:' к имени хоста в mysqli) первые 5000-10000 тысяч запросов завершаются с той же ошибкой, что и выше, до тех пор, пока не будет достигнуто максимальное количество подключений (с веб-сервера, установленного на 1500). После первых запросов MySQL сохраняет 1500 открытых соединений, и все в порядке, так что я могу выполнять свои 1500 одновременных запросов. А? Возможно ли, что это проблема PHP FastCGI?

Похоже, что соединения не очищаются своевременно. "show processlist" должен отображать соединения, если это так. Глядя на документацию MySQL, кажется, что это может быть обычным явлением для PHP, если не были изменены определенные параметры PHP. Вы можете просмотреть статью и комментарии на http://dev.mysql.com/doc/refman/5.0/en/too-many-connections.html

Другая возможность, вызванная очень медленными TCP-соединениями, - это, возможно, MySQL (или tcpwrappers) пытается выполнить поиск имени хоста для доступа, и поиск идет медленно. Это кажется маловероятным при использовании сокетов unix, но в случае, если он пытается сопоставить имена хостов localhost или system, возможно, стоит посмотреть, можно ли перенести какие-либо правила доступа на IP или удалить.

Возможно, что если вы подключитесь 10 000 раз за один раз, 1500 из этих 10 000 будут приняты, а остальные 8500 будут отклонены (например, не будут задерживаться до тех пор, пока постоянное соединение не станет доступным). Затем последующие запросы будут использовать постоянный пул размером 1500.

Есть ли проблема с открытием постоянных соединений один раз при запуске сервера?

на какой ОС это работает? У Windows ужасно долгое время ожидания TCP-соединений. Что-то порядка 90 секунд. Вы должны внести некоторые правки в реестр, чтобы вернуться к чему-то более короткому. Также помогает поднять лимит портов с 10k до чего-то большего.

Вы также отрегулировали параметр max_user_connections? Возможно, nginx рассматривается как отдельный пользователь и ограничивается этим параметром.