Вечер добрый у нас есть высоконагружаемый проект
Который разнесён по 2 серверам.
1ый сервер (centos 6): 8 core 3400MHZ. 32 gig memory.
На 1ом сервере находиться php скрипты сайта, css, js и тд.
Сборка: PHP 5.3.3 (cli) (built: Jul 9 2015 17:39:00)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
with XCache v3.2.0, Copyright (c) 2005-2014, by mOo
with XCache Cacher v3.2.0, Copyright (c) 2005-2014, by mOo
nginx version: nginx/1.8.0
php собран как php-fpm.
2ой сервер (debian 7): 12 core 3800MHZ. 64 gig memory.
На 2ом сервере мы используем mysql 5.5.46
Оба сервера стоят на 1 свиче и соеденины между собой в одну сеть.
С 1ого сервера мы подключаемся к mysql по внутреннему ip: 192.168.1.1
конектимся к БД через mysql_connect
Скрипт-движок сайта устроен так что сверху мы открываем соединение require_once './config.php';
снизу закрываем mysql_close($con);
У нас проблема в том из за большого количества соединений изредка особенно при онлайне свыше 4000 человек бывает выдаёт:
Can't connect to MySQL server on '192.168.1.1' (99)
В период онлайна на сайте 4000-5500 человек нагрузки на оба сервера нет:
В данный момент возможно нашу проблему бы решил переход на постоянные соединения mysql_pconnect(),
но мы не можем конектиться к базе данных mysql с помощью mysql_pconnect(), так как у нас php собран как php-fpm и не являеться модулем apache.
Все тяжелые запросы которые долго выполнялись отследили с помощью long_query_time и оптимизировали!
В данный момент база данных mysql принимает: ~ 4 000 запросов в секунду. В сутки ~ 360 000 000 запросов.
root@mysql ~ # hdparm -t /dev/sda
/dev/sda:
Timing buffered disk reads: 1418 MB in 3.00 seconds = 472.50 MB/sec
Конечно не ссд, но результат очень хороший, скорость очень близка к ссд.
В данном случае так как у нас происходит большое количество соединений с mysql то нам нужно отстроить очередь на соединения с mysql? Но увеличение back_log не помогает.
Как нам отстроить очередь на соединение с mysql базой чтобы не соединения не отваваливались и не выдавали Can't connect to MySQL server on '192.168.1.1' (99), а ждали своей очереди?
Все настройки mysql не пропускает
Настройки my.cnf