MySQL服务器,具有高CPU和;“内核时间”;使用
我注意到mysql服务器的CPU为100%,而“内核时间”(我不确定它的意思)异常高,大约为70% 此服务器上有许多连接(大约400个)和一些活动查询(大约40个)。这能解释这种行为吗?有什么不对劲吗?或者这是意料之中的 编辑: 根据一条评论的建议,我检查了“handler\u read%”变量:MySQL服务器,具有高CPU和;“内核时间”;使用,mysql,mariadb,windows-server-2012-r2,Mysql,Mariadb,Windows Server 2012 R2,我注意到mysql服务器的CPU为100%,而“内核时间”(我不确定它的意思)异常高,大约为70% 此服务器上有许多连接(大约400个)和一些活动查询(大约40个)。这能解释这种行为吗?有什么不对劲吗?或者这是意料之中的 编辑: 根据一条评论的建议,我检查了“handler\u read%”变量: 显示全局状态,如“handler\u read%”。结果如下: Handler_read_first 248684 Handler_read_key 308
显示全局状态,如“handler\u 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
Handler_read_first 248684
处理程序读取键3081370400
Handler_read_last 83333
Handler_read_next 3520958058
处理器读取前330
处理程序读取\u rnd 2210158755
处理程序读取并删除60107588
处理器读取下一个929907565
完整的显示状态
和显示变量
结果如下:
处理程序读取*的高值表明您的表没有正确索引,或者您的查询没有被写入以利用您的索引 由于系统调用开销和上下文切换,表扫描使用更多CPU 在更改参数或投资硬件之前,我建议您优化数据库:
- 在有限的时间内激活慢速查询日志(此外,您可以指定参数log\u querys\u not\u,使用\u索引和min\u inspected\u row\u limit)(慢速查询日志的大小可能增长得非常快)李>
- 使用EXPLAIN或EXPLAIN EXTENDED分析查询日志中的查询
- 如果问题发生在生产服务器上,请首先将内容复制到测试系统
- 在有限的时间内激活慢速查询日志(此外,您可以指定参数log\u querys\u not\u,使用\u索引和min\u inspected\u row\u limit)(慢速查询日志的大小可能增长得非常快)李>
- 使用EXPLAIN或EXPLAIN EXTENDED分析查询日志中的查询
- 如果问题发生在生产服务器上,请首先将内容复制到测试系统
和tmp\u table\u size
为16G——这是灾难性的!每个连接可能需要其中一个或多个。将其降低到RAM的1%max\u heap\u table\u size
- 有大量的
——向第三方供应商投诉Com\u show\u字段
- 为
——这通常意味着索引或设计不良的查询创建的\u tmp\u disk\u表创建的大量数据
/Select\u scan
=77%——缺少大量索引Com\u Select
=229——它们可能相互绊倒线程\u正在运行
最近运行,因此某些状态值没有用处FLUSH STATUS
为256——有迹象表明,较大的数字会更好。试试1500table\u open\u cache
仅为RAM的1%;提高到20%key\u buffer\u size
尽管如此。。。高CPU意味着较差的索引和/或设计较差的查询。让我们看看其中的一些,再加上
SHOW CREATE TABLE
一些设置太高或太低
和tmp\u table\u size
为16G——这是灾难性的!每个连接可能需要其中一个或多个。将其降低到RAM的1%max\u heap\u table\u size
- 有大量的
——向第三方供应商投诉Com\u show\u字段
- 为
——这通常意味着索引或设计不良的查询创建的\u tmp\u disk\u表创建的大量数据
/Select\u scan
=77%——缺少大量索引Com\u Select
=229——它们可能相互绊倒线程\u正在运行
最近运行,因此某些状态值没有用处FLUSH STATUS
为256——有迹象表明,较大的数字会更好。试试1500table\u open\u cache
仅为RAM的1%;提高到20%key\u buffer\u size
尽管如此。。。高CPU意味着较差的索引和/或设计较差的查询。让我们看看其中的一些,再加上
SHOW CREATE TABLE
一些更多的信息可能会有所帮助,例如处理程序变量的值:SHOW变量如“handler\u read%”是您正在使用MyISAM的表吗?它本身不使用太多缓存,只依赖于文件系统缓存,因此比Innodb执行更多的系统调用(ReadFile/WriteFile)。这只是一个猜测,基于高内核时间。为了彻底理解,您需要一些能够输出调用堆栈的分析器(在Windows上,您可能希望使用Windows PErformance Toolking(可能来自当前的Windows SDK)中的xperf)。或者,您也可以使用性能模式-但我本人对此并不十分熟悉,因此无法给出一个好的建议。此外,状态显示大约230个活动线程,而不是采取“显示状态”时的40个。“显示进程列表”可以让我们了解查询在做什么。有多少内存?Innodb关闭了吗?在任务管理器中,该框上有64GB内存。mysqld只使用了其中的1.3GB:)更多信息会有所帮助,例如,处理程序变量的值:显示像“handler\u read%”这样的变量是您正在使用MyISAM的表吗?它本身不使用太多缓存,只依赖于文件系统缓存,因此比Innodb执行更多的系统调用(ReadFile/WriteFile)。这只是一个猜测,基于高内核时间。为了一个t