Чрезвычайное количество открытых соединений между Web и сервером БД - PullRequest
0 голосов
/ 20 января 2012

Я использую 2 сервера, 1 веб (nginx / php), 1 базу данных (mysql).

Nginx имеет около 1500 активных процессов в секунду, а состояние mysql показывает в среднем около 15 текущих подключений.

Теперь сегодня я начал бегать: netstat -npt | awk '{print $5}' | grep -v "ffff\|127\.0\.0\.1" | awk -F ':' '{print $1}' | sort -n | uniq -c | sort -n

Это показало, что было более 7000 активных соединений от моего веб-сервера до IP-адреса моего сервера базы данных. Это похоже на крайность. Я не использую постоянные соединения в PHP для подключения к Mysql.

Я также пытался использовать mysql_close (), но, похоже, это не имеет значения.

На веб-сервере netstat показывает более 7000 подключений к серверу базы данных

На сервере базы данных netstat показывает всего 300 подключений к веб-серверу

Есть идеи, почему так много открытых соединений?

Ответы [ 2 ]

1 голос
/ 20 января 2012

Попробуйте проверить только установленные соединения:

netstat -npt | grep ESTABLISHED | awk ...
0 голосов
/ 21 января 2012

Каков статус этих соединений? Я предполагаю, что это TIME_WAIT. Когда у вас есть 1500 запросов / с, вы открываете и закрываете 1500 соединений TCP. И для закрытия соединения требуется некоторое время (в протоколе указаны некоторые тайм-ауты, поэтому даже на локальном хосте закрытие не происходит мгновенно - больше информации здесь здесь ).

В этом нет ничего плохого - 7000 соединений - это немного (однако постоянные соединения, как указано далее, будут немного быстрее). Вы можете иметь до 65536 соединений между вашим веб-сервером и сервером базы данных. Также обратите внимание, что это не ваш общий лимит открытых соединений, как обычно считается. Это ограничение не для вашего IP-адреса, а для каждой пары IP (каждая пара src-ip и dst-ip может иметь 65536 соединений между ними). ​​

При использовании nginx я предполагаю, что вы используете PHP в режиме Fast-CGI. Таким образом, для этих 1500 запросов / с у вас должно быть несколько процессов PHP, ожидающих их обработки (у меня также есть около 2000-5000 запросов / с на одном из моих серверов и 50-250 процессов PHP). Для такого большого количества соединений и относительно небольшого числа процессов PHP лучше использовать постоянные соединения. Каждый процесс PHP будет делать одно постоянное соединение с базой данных. Таким образом, у вас будет около 100 подключений к MySQL, но они останутся открытыми, поэтому нет необходимости делать трехстороннее TCP-рукопожатие и закрывать каждый веб-запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...