LINUX.ORG.RU
ФорумAdmin

Nginx + Php-fpm + зависание Mysql

 , ,


1

2

Данные сервера qemu virtual cpu 8 cores + 36GB RAM .На сервере с стоит связка Nginx + Php-fpm + Mysql.

Нагрузка на сервер достаточно большая . Единовременно к php скрипту могут обращаться около 3-4 тысяч пользователей.
Когда пользователей в половину меньше (2 тысячи) приложение работает стабильно..На php-fpm уходит 10%, mysql - 25-30% В пиковые (3-4 тысячи пользователей)моменты происходит вот какая ситуация - Mysql загружает cpu под 90 % , php-fpm загружается на 2-3% и начинает плодить новые потоки . В mysql-slow-log начинают сыпаться запросы от 2 секунд и выше ..
Если я правильно понимаю, то зависает именно mysql. Подскажите как можно оптимизировать со стороны mysql или php . Конфиги прилагаются

root@vm1:~# uname -a
Linux vm1 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux

root@vm1:~# php -v
PHP 5.4.39-0+deb7u1 (cli) (built: Mar 20 2015 15:16:28)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
    with eAccelerator v1.0-dev, Copyright (c) 2004-2012 eAccelerator, by eAccelerator

php-fpm config http://pastebin.com/fWtEnnNx php pool config http://pastebin.com/QDbbK73T

root@vm1:~# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4070440
Server version: 5.5.42-MariaDB-1~wheezy-log mariadb.org binary distribution

mysq config http://pastebin.com/qig4nEtF

root@vm1:~# nginx -v
nginx version: nginx/1.2.1

nginx main config http://pastebin.com/E9cT6kj6 nginx virtual host http://pastebin.com/R6SQxrMP

Для начала советую залить конфиги на какой-нибудь pastebin. Ну и пост поправить соответственно.

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

Для MySQL.
1. Использовать вместо glibc -> libjemalloc.
2. tmpdir вынести в tmpfs.
3. innodb-buffer-pool-size -> делать через innodb_buffer_pool_instances.
4. В тупую не увеличивать параметры, например max-connections 4000 -> есть стата, что хотя бы 3000 из них используется?
5. Для innodb_buffer_pool_size -> посмотреть сколько нужно выставить - через mysqltuner.
6. query_cache_size 32M -> мало, обычно выставлюсь 128M -> выше встречается деградация.
7. query_cache_limit -> от 128K до 1M, в зависимости от базы. Обычно, лучше если больше мелких. Чем несколько крупных.
8. Если соединения через tcp -> лучше пустить через сокет (locahost).
9. innodb_log_file_size -> нужно рассчитывать в зависимости от «нагрузки»
https://poiuty.com/index.php?title=Как_рассчитать_innodb_log_buffer_size

Пример конфига => http://pastebin.com/TQymc0Sq
Остальное в зависимости от нагрузки. Поставь munin + плагины для MySQL и собери стату.

poiuty ()
Последнее исправление: poiuty (всего исправлений: 1)
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 10
pm.start_servers int
Число дочерних процессов, создаваемых при запуске. Используется, только когда pm установлен в dynamic.
Значение по умолчанию: min_spare_servers + (max_spare_servers - min_spare_servers) / 2.

https://php.net/manual/ru/install.fpm.configuration.php

poiuty ()

Не увидел лог из mysqltuner
http://pastebin.com/eKQANyUP -> такой конфиг подойдет.

В остальном - собирать статистику. Смотреть какие запросы тормозят.
Проверять эти запросы через describe. https://poiuty.com/index.php?title=MySQL_Index
Например если SELECT делает без индекса и «читает» 100500 строчек => это проблема запроса, а не сервера.
Смотреть что происходит в момент лага - через mytop.Разбирать access логи.

poiuty ()

Перейте на Percona (на сайте есть даже конфигуратор). Если приложение поддерживает то планировать переход на postgres. Поставить плагин мониторинга для percona, и там уже смотреть.

anonymous_sama ★★★★★ ()
Последнее исправление: anonymous_sama (всего исправлений: 1)
Ответ на: комментарий от poiuty

Nginx поправил

pm = dynamic
pm.max_children = 75
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500

Адаптировал конфиг который вы выложили , закоментировав некоторые опции http://pastebin.com/Nd4XQiBj . забыл упомянуть что размер базы ~3GB .Так же обновил до mariadb10. Так же установил графики мунин. В данный момент беспокоит что обращению к диску стало на порядок чаще с этим конфигом . Нагрузка на процессор возросла тоже . Вот еще графики которые как мне показалось интересы , они пока короткие так как конфиг установил недавно https://yadi.sk/i/asVv79ZifWFZU, https://yadi.sk/i/6p9CoEJffWFZa , https://yadi.sk/i/EeU6bkA2fWFZg ..

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

https://yadi.sk/i/asVv79ZifWFZU - мало запросов которые попадают в кеш.
Попробуйте увеличить query_cache_limit до 1M.
Вы сделали 32Gb под innodb_buffer_pool

innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 8

Так будет 4Gb.

innodb_buffer_pool_size = 1G
innodb_buffer_pool_instances = 4

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