我正在经营一家年轻的非营利组织,旨在提供免费和低成本的网络托管服务。
自几天以来,我们的服务器负载一直在 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
您知道如何确定运行查询的脚本吗?谢谢您的帮助。
答案1
作为 mysql root 用户,尝试:
mysql> show processlist;
这将允许您识别导致负载的查询并使您能够将其追溯到您正在寻找的 php 脚本。
注意:如果 mysql 进程的 CPU 使用率较低(如顶部输出所示)但您遇到 >1 的负载,则很可能是 mysql 导致了过多的 IO。
答案2
显示完整流程清单;
这将为您提供服务器上当前正在运行的查询及其所花费的时间,复制并附加带有 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
答案3
如果你在 mysql 中启用了慢查询日志,它会为你提供任何占用大量资源的 SQL 语句的起点。它不会告诉你哪个 PHP 脚本是罪魁祸首,但你会得到数据库、表和 SQL,以及问题发生的时间;
http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html
慢查询日志包含执行时间超过 long_query_time 秒且需要检查至少 min_examined_row_limit 行的 SQL 语句。
运行以下查询;
set global slow_query_log = 1;
默认情况下,可以像这样访问慢查询日志;
mysqldumpslow /var/log/mysql/mysql-slow.log
这里有一些关于解析慢查询日志中的信息的示例;
https://easyengine.io/tutorials/mysql/slow-query-log/
您可以结合检查 Web 服务器日志文件来查找与长时间运行的查询同时发生的请求。例如,一旦您发现特别慢的查询,请检查 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)"