MySQL CPU 使用率高,RAM 使用率低

MySQL CPU 使用率高,RAM 使用率低

我有以下规格:

8vCPU / 32 GB 内存 / 160 GB 磁盘托管在 Digital Ocean 上

该 Web 应用程序基于 Laravel(PHP)构建,目前正在为 550 个并发用户提供服务。

这些是流程:

17767 mysql     20   0 29.160g 4.160g  18804 S 214.3 13.2  25:55.25 mysqld
20455 www-data  20   0  496504  45364  31252 S  19.9  0.1   0:11.90 apache2
21849 www-data  20   0  496420  44828  30868 S  10.4  0.1   0:08.25 apache2
20470 www-data  20   0  494500  43232  31188 S   8.8  0.1   0:09.81 apache2
 2422 www-data  20   0  496436  41656  27660 R   8.5  0.1   0:02.39 apache2
29369 www-data  20   0  494324  42960  31048 R   8.5  0.1   0:04.87 apache2
28830 www-data  20   0  494320  41632  29700 S   8.1  0.1   0:02.57 apache2
21160 www-data  20   0  496392  44796  30804 S   7.8  0.1   0:08.95 apache2
20899 www-data  20   0  494424  42572  30552 R   7.2  0.1   0:07.29 apache2
20971 www-data  20   0  496432  45092  31060 S   6.8  0.1   0:07.21 apache2
21589 www-data  20   0  496468  44692  30612 S   6.5  0.1   0:06.98 apache2
32660 www-data  20   0  496520  44816  30796 R   6.5  0.1   0:03.80 apache2
21650 www-data  20   0  494460  42984  30996 S   5.5  0.1   0:06.84 apache2
...
...
...

MYSQL 的 CPU 使用率为 214%,而且似乎我的所有努力都无法降低这个数字。

查看 Digital Ocean 提供的图表,当前总体 CPU 使用率为 80%,而 RAM 仅为 25%。这很奇怪吗?我一直认为 RAM 通常是性能的瓶颈,而不是 CPU。

这是我的 MYSQL 设置

key_buffer_size     = 16M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 16
myisam-recover-options  = BACKUP
max_connections        = 500
wait_timeout        = 20000
query_cache_limit   = 2M
query_cache_size=0
query_cache_type=0
tmp_table_size = 320M
max_heap_table_size = 320M
log_error = /var/log/mysql/error.log
expire_logs_days    = 10
max_binlog_size   = 100M
innodb_buffer_pool_size=22G
innodb_buffer_pool_instances=22
innodb_log_file_size=5G
innodb_read_io_threads=8G
innodb_write_io_threads=8G

我感觉我已经用尽了所有办法。我浏览了许多互联网帖子,调整了许多变量,例如innodb_buffer_pool_sizeinnodb_buffer_pool_instance等,以更好地表示硬件,使用 mysql 调谐器并遵循其所有建议,我花了很多很多小时检查代码的每一部分,记录每个缓慢的查询和请求,并优化应用程序,但这也只带来了最小的改变。我是不是遗漏了什么?还是我到了需要再次增强服务器的地步?25% 的内存使用率异常低……

任何建议都会有很大帮助。谢谢。

答案1

由于声誉不佳,我无法发表评论。我是新来的!但请将此视为评论。

需要考虑的一些事项。Inno_buffer_pool_size 似乎过多,并且根据文档;*“缓冲池大小必须始终等于或等于 innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances”*

几个月前我遇到过类似的问题,在修改了所有我能想到的东西之后,我终于通过备份配置文件(在我的情况下是 /etc/my.cnf.d/server.cnf)并删除除绑定 IP 地址和端口等基本内容之外的所有内容解决了它。

重新加载 mysql 后问题消失了,所以我知道这是我所做的更改的组合。我重新引入了每个更改,每次都重新启动,直到原来的问题再次出现。我不记得是哪个选项,但我摆弄了一下并对其进行了更好的调整。

看起来交换对您来说不是问题,但请留意可能发生的任何磁盘交换。

再次重申,这是一条评论。:)

答案2

您至少需要发布以下输出

显示完整流程清单;

并从那里可能启用慢查询日志记录:

slow_query_log=1

长查询时间=0

然后过一会儿发布输出:

mysqldumpslow -st /path/to/slow.log | head -100

然后我们可以看看哪些查询正在消耗你的 CPU,以及是否可以让它们消耗更少的 CPU。

数据库性能优化 5% 是配置,95% 是查询优化,除非配置确实严重错误。不过,如果你相信 mysqltuner 告诉你的任何东西,那么严重错误的配置也是有可能的,例如 80 亿个 io 线程……

答案3

innodb_read_io_threads=8G
innodb_write_io_threads=8G

不!!

每个 io_thread 占用一定量的 RAM、CPU、系统等。“8”是合理的;“8G”是非常不合理。​​我很惊讶系统没有崩溃。

您是否更改了其他设置?

相关内容