MySQL 服务器 CPU 和 "kernel time" 使用率高

MySQL Server with high CPU and "kernel time" usage

我注意到 mysql 服务器的 CPU 为 100%,而 "kernel time"(我不确定这是什么意思)异常高,大约 70% .

此服务器上有很多连接(大约 400 个)和一些活动查询(大约 40 个)。这能解释这种行为吗?有什么问题或这是预期的吗?

编辑:

根据评论的建议,我检查了 'handler_read%' 变量: show global status like 'handler_read%'。以下是结果:

Handler_read_first          248684
Handler_read_key            3081370400
Handler_read_last           83333
Handler_read_next           3520958058
Handler_read_prev           330
Handler_read_rnd            2210158755
Handler_read_rnd_deleted    60107588
Handler_read_rnd_next       929907565

完整的 show statusshow variables 结果在这里: https://www.dropbox.com/s/98pnd1rzgfp4jtf/server_status.txt?dl=0 https://www.dropbox.com/s/rh0m8np0mosx6tp/server_variables.txt?dl=0

handler_read_rnd*high 值表明您的 table 未正确编入索引或者您的查询不是为了利用您拥有的索引而编写的。

由于系统调用开销和上下文切换 table 扫描使用更多 CPU。

在更改参数或投资硬件之前,我建议优化您的数据库:

  • 在有限的时间内激活慢速查询日志(另外您可以指定参数 log_queries_not_using_indexes 和 min_examined_row_limit)(慢速查询日志的大小可能增长得非常快)。
  • 使用 EXPLAIN 或 EXPLAIN EXTENDED 分析查询日志中的查询
  • 如果问题出现在生产服务器上,请先将内容复制到测试系统

一些设置太高或太低...

  • tmp_table_sizemax_heap_table_size都是16G——这就惨了!每个连接可能需要其中的一个或多个。将其降低到 RAM 的 1%。
  • 有大量Com_show_fields -- 向第3方供应商投诉。
  • Created_tmp_disk_tables 的数字很大 -- 这通常意味着索引或设计不当的查询。
  • Select_scan / Com_select = 77% -- 缺少很多索引?
  • Threads_running = 229 -- 他们可能互相绊倒了。
  • FLUSH STATUS 最近是 运行,因此一些 STATUS 值没有用。
  • table_open_cache 是 256 -- 有一些迹象表明更大的数字会更好。试试 1500。
  • key_buffer_size 仅占 RAM 的 1%;将其提高到 20%。

仍然...高 CPU 表示索引不佳 and/or 查询设计不当。让我们看看其中的一些,以及 SHOW CREATE TABLE.