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 status
和 show 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_size
和max_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
.
我注意到 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 status
和 show 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_size
和max_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
.