Всем привет. В общем такое дело. Значит есть железо 4 ядра по 3.2, 32 RAM, Linix CentOS. Стоит на нем nginx, php-fpm, mysql. Есть софт, который работает в 2000 потоков. Каждый поток в секунду делает примерно по 2 запроса к серверу. Проблема в том, что сервер долго грузится и запросы обрабатываются очень долго. Как уже я только не выставлял настройки worker_processes, worker_connections, pm.max_spare_servers, pm.start_servers и тд. И равному кол-ву ядер ставил, и вообще дахрена выставлял. Результат один и тот же. Запросы долго обрабатываются, но ресурсы сервера максимум задействуются только на 30%. Cpu постоянно в норме ( < 50%), рам тоже. Mysql сервер не лагает от нагрузки, все в пределах нормы. Проблема только в долгих запросах. Даже на статику(без php). Прошу помощи, в какую сторону идти и какие настройки лучше всего выставить.
статика - включи кеш в nginx что за запросы, к php вывести 123? или к mysql c join и прочим?) смотри php-fpm.log смотри mysql-slow.log
там сплошные записи вида: Code: [24-May-2015 23:52:02] NOTICE: [pool www] child 29223 started [24-May-2015 23:52:14] NOTICE: [pool www] child 29159 exited with code 0 after 28.894163 seconds from start [24-May-2015 23:52:14] NOTICE: [pool www] child 29224 started [24-May-2015 23:52:18] NOTICE: [pool www] child 29161 exited with code 0 after 27.491981 seconds from start [24-May-2015 23:52:18] NOTICE: [pool www] child 29225 started [24-May-2015 23:52:20] NOTICE: [pool www] child 29163 exited with code 0 after 24.817942 seconds from start [24-May-2015 23:52:20] NOTICE: [pool www] child 29226 started [24-May-2015 23:52:27] NOTICE: [pool www] child 29223 exited with code 0 after 24.862892 seconds from start [24-May-2015 23:52:27] NOTICE: [pool www] child 29227 started [24-May-2015 23:52:28] NOTICE: [pool www] child 29162 exited with code 0 after 36.953496 seconds from start [24-May-2015 23:52:28] NOTICE: [pool www] child 29228 started [24-May-2015 23:52:29] NOTICE: [pool www] child 29158 exited with code 0 after 44.276996 seconds from start [24-May-2015 23:52:29] NOTICE: [pool www] child 29229 started [24-May-2015 23:52:37] NOTICE: [pool www] child 29226 exited with code 0 after 17.089888 seconds from start [24-May-2015 23:52:37] NOTICE: [pool www] child 29237 started вроде ничего интересного к mysql
Посмотри утилизацию дисков и можно копать в сторону тюнинга MySQL. Может где индексов не хватает или попробовать вынести таблицу в память. Это уже зависит от архитектуры сервиса.
Советую начать с узкого места - mysql wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl perl mysqltuner.pl Включи логирование медленных запросов nano /etc/mysql/my.cnf (/etc/my.cnf) long_query_time = 1 log_slow_queries = /var/log/mysql/mysql-slow.log
2000 потоков спамящие 2 запроса/сек и 32мб ОЗУ и задействовано 30% то есть 10Мб ОЗУ обрабатывают 4000 запросов ежесекундно... Вы ничего не путаете? Чем то на бред смахивает. Чем мониторите нагрузку?
В результате работы скрипт дает рекомендации что делать (в скрине не указаны), но я бы обратил на неправильно конфигурирование ключей конфигурации, отвечающих за максимальные объем выделяемой памяти под операции (query_cache_size, join_buffer_size и тд) - максимальный объем потребляемой памяти может быть в какой то момент выше чем у тебя установленно, а так же то что у тебя почти каждый пятый запрос расценивается как slow. Какой тип таблиц ты используешь в основном, я так понял - MyISAM? Поменяй на InnoDB, Aria/MyISAM больше для гостевых книг подходит. Еще советую посмотреть slow-log и оптимизировать запросы - добавить индексы или удалить лишние, explain тебе в помощь. Сто процентов, что проблема именно в этом.
Спасибо. Проблема в том, что в slow-log идут почему-то практически все запросы, даже например обычный легкий селект на таблицу, в которой только 10 записей.
Скорей всего тормозит мускуль. Если запросы однотипные используйте memcached или аналоги. Для БД используйте sphinx (если данные в запросах однотипные) или его аналоги. Оптимизируйте саму систему чтение/запись данных + параметры sysctl.conf Оптимизируйте сетевой стек.
Возможно из за блокировки на чтение (неподходящий уровень изоляции и тд) самый обычный SELECT может выполняться бесконечно долго. Какой тип таблиц - MyISAM или InnoDB? Попробуйте сделать EXPLAIN запроса самого простого и скиньте сюда результат что он покажет. Например, EXPLAIN SELECT * FROM news.
MyISAM не подойдет под твои нужды, смени на InnoDB. Почитай http://ruhighload.com/post/Работа+с+индексами+в+MySQL В твоем примере тебе индексы не помогут, тк всего 55 записей, но на таблицах побольше лучше сделай хотя бы простые индексы на тех колонках, по которым делаешь выборку. И скинь полный вывод mysqtuner.pl
Спасибо большое за помощь. Code: >> MySQLTuner 1.4.0 - Major Hayden <[email protected]> >> Bug reports, feature requests, and downloads at http://mysqltuner.com/ >> Run with '--help' for additional options and output filtering [OK] Currently running supported MySQL version 5.5.31-log [OK] Operating on 64-bit architecture -------- Storage Engine Statistics ------------------------------------------- [--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED -InnoDB +MRG_MYISAM [--] Data in MyISAM tables: 267M (Tables: 21) [--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17) [!!] Total fragmented tables: 9 -------- Security Recommendations ------------------------------------------- [OK] All database users have passwords assigned -------- Performance Metrics ------------------------------------------------- [--] Up for: 12m 23s (234K q [315.233 qps], 57K conn, TX: 106M, RX: 17M) [--] Reads / Writes: 49% / 51% [--] Total buffers: 11.0G global + 15.4M per thread (500 max threads) [OK] Maximum possible memory usage: 18.5G (59% of installed RAM) [!!] Slow queries: 15% (36K/234K) [OK] Highest usage of available connections: 13% (67/500) [OK] Key buffer size / total MyISAM indexes: 10.7G/262.0K [OK] Key buffer hit rate: 100.0% (535K cached / 94 reads) [OK] Query cache efficiency: 37.1% (20K cached / 55K selects) [OK] Query cache prunes per day: 0 [OK] Sorts requiring temporary tables: 0% (0 temp sorts / 7K sorts) [!!] Temporary tables created on disk: 99% (7K on disk / 7K total) [OK] Thread cache hit rate: 99% (67 created / 57K connections) [OK] Table cache hit rate: 58% (64 open / 109 opened) [OK] Open file limit used: 2% (74/2K) [!!] Table locks acquired immediately: 83% -------- Recommendations ----------------------------------------------------- General recommendations: Run OPTIMIZE TABLE to defragment tables for better performance MySQL started within last 24 hours - recommendations may be inaccurate Temporary table size is already large - reduce result set size Reduce your SELECT DISTINCT queries without LIMIT clauses Optimize queries and/or use InnoDB to reduce lock wait