MySQL CPU使用率高(300-400%)



最近几天我的MySQL CPU使用率有问题,我的平均CPU使用率为300%。MySQL版本为5.7,数据库容量约为150MB。感谢您的帮助。

服务器规格:

Intel(R) Xeon(R) CPU E3-1225 V2 @ 3.20GHz
16GB DDR3

从mysqladmin 日志

Uptime: 271  Threads: 6  Questions: 202964  Slow queries: 0  Opens: 311  
Flush tables: 1  Open tables: 254  Queries per second avg: 748.944

我的My.cnf

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0
[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
bind-address            = 127.0.0.1
key_buffer_size         = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
myisam-recover-options  = BACKUP
max_connections        = 2000
query_cache_limit       = 1M
query_cache_size        = 16M
log_error = /var/log/mysql/error.log
expire_logs_days        = 10
max_binlog_size   = 100M
query_cache_type=ON
query_cache_size=256M
innodb_buffer_pool_size=12G
innodb_log_buffer_size=128M
innodb_write_io_threads = 4
innodb_read_io_threads  = 4

mysqltuner日志https://pastebin.com/raw/xv4FPjpe

findfragtables.sql日志https://pastebin.com/raw/TGP5qjtV

ulimit-ahttps://pastebin.com/raw/AeYKtqHH

显示引擎INNODB状态https://pastebin.com/raw/bEZG5GEc

显示全局状态(2018年10月30日12:28 UTC+2(https://pastebin.com/raw/1zFsTYNf

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql    15632  277  8.8 16271348 1447256 ?    Sl   13:58 169:28 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

当整个数据集都适合缓冲池时,就不需要等待I/O,这通常是瓶颈,因为它比RAM慢得多。

因此,如果对RAM(缓冲池(中已经存在的数据运行大量只读查询,那么约束资源就是CPU,因为它从RAM中扫描和搜索数据。这就是为什么你的CPU负载看起来如此之高。它只是一直忙于工作,因为它不必等待任何其他事情。

证据处于"缓冲池和内存"下的InnoDB状态:

页面读取7814,创建70,写入38057.32读取/s,0.00创建/s,3.55写入/s缓冲池命中率1000/1000,年轻制造率0/1000而非0/1000

"已创建"统计数据是第一次必须加载到缓冲池中的页数。它太低了,因为实际上所有的页面都已经在缓冲池中了。

"命中率"是查询请求页面的次数,而该页面已经在缓冲池中,因此无需再次从磁盘加载。这是1000/1000,表示每次请求页面时,页面都已加载。或者至少99.9%的时间。

按照建议调整缓冲池的大小后,您可能已经重新启动了MySQL Server,这将收回缓冲池的内容。重新启动后,您的查询将从磁盘读取页面以将它们恢复到缓冲池,因此它们必须等待I/O。但最终,您将再次达到所有数据都在缓冲池中的程度,我预测您将看到CPU负载再次增加。

我还注意到,在您的InnoDB状态"ROW OPERATIONS"中:

0.05插入/s,0.50更新/s,0.00删除/s,4970813.64读取/s

还有每秒查询的速率:

平均每秒查询次数:748.944

这意味着每秒大约750个查询导致每秒读取近500万行。平均每个查询超过6600行。这是

我怀疑这是您的高CPU负载的根本原因。您的查询平均会扫描很多页面,即使这些页面在RAM中。

考虑到您的整个数据库只有大约150MB,这是非常令人惊讶的。

您应该分析每个频繁运行的查询,以确定是否有一些索引可以帮助缩小搜索范围,这样您就不必在每个查询中检查如此多的行。

你可能会喜欢我的演示文稿"如何设计索引,真的",或者我演示它的视频:https://www.youtube.com/watch?v=ELR7-RdU9XU

尝试从减少innodb_buffer_pool_size

innodb_buffer_pool_size=12G

将:

innodb_buffer_pool_size=1G

相关内容

最新更新