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

Определить php-скрипт, вызывающий огромную нагрузку на MySQL

Я управляю молодой некоммерческой организацией, целью которой является предоставление бесплатного и недорогого веб-хостинга.

Уже несколько дней загрузка нашего сервера составляет около 1,5, иногда до 7. top показывает мне, что MySQL - плохой мальчик:

PID  USER   PRI  NI  VIRT   RES   SHR  S CPU%  MEM%  TIME+   Command
26362 mysql 20   0   2757M  762M  5872 S 16.0  7.7   3h54:51 /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --log-error=/var/lib/mysql/shadow.err --open-files-limit=50000 --pid-file=/var/lib/mysql/shadow.pid

У вас есть представление о том, как я могу определить сценарий, выполняющий запрос? Спасибо за помощь.

Если вы включите журнал медленных запросов в mysql, это даст вам отправную точку для любых операторов SQL, которые требуют много ресурсов. Он не скажет вам, какой сценарий PHP был виновником, но у вас будет база данных, таблица и SQL, а также время возникновения проблемы;
http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html

Журнал медленных запросов состоит из операторов SQL, выполнение которых заняло более long_query_time секунд и требовало проверки не менее min_examined_row_limit строк.

Выполните следующий запрос;

set global slow_query_log = 1;

По умолчанию журнал медленных запросов доступен следующим образом;

mysqldumpslow /var/log/mysql/mysql-slow.log

вот несколько примеров анализа информации в журнале медленных запросов здесь;
https://easyengine.io/tutorials/mysql/slow-query-log/

Вы можете совместить это с изучением файлов журнала веб-сервера, чтобы найти запросы, которые возникли одновременно с длительным запросом. Например, если вы обнаружили особенно медленный запрос, проверьте файлы журнала apache или nginx;

[root@vps001 www]# vi /var/log/httpd/access_log

покажет вам, какой php файл соответствует конкретному запросу времени;

185.142.237.8 - - [03/Jul/2016:04:27:14 +0000] "POST /xmlrpc.php HTTP/1.1" 200 370 "-" "Googlebot/2.1 (+http://www.google.com/bot.html)"

ПОКАЗАТЬ ПОЛНЫЙ СПИСОК ПРОЦЕССОВ;

Это даст вам текущие запросы на вашем сервере и время, затрачиваемое на него, скопируйте и добавьте запрос с EXPLAIN EXTENDED и оцените результат, внесите соответствующие изменения в запрос, добавив индексы, изменив типы данных и т. Д.

Вы не должны использовать значения переменных по умолчанию, вы всегда должны изменять некоторые из переменных для достижения высокой производительности, например query_cache_size, key_buffer, table_cache, sort_buffer, read_rnd_buffer_size, thread_cache и т. Д.

Ссылка : http://www.botskool.com/geeks/how-reduce-server-load-mysql-caching-and-optimization

Как пользователь root mysql попробуйте:

 mysql> show processlist;

Это позволит вам определить запрос, вызывающий нагрузку, и отследить его до искомого скрипта php.

Примечание. Если загрузка ЦП процессом mysql низка (как показано в верхнем выводе), но вы испытываете нагрузку> 1, вероятно, mysql вызывает слишком много операций ввода-вывода.