MySQL服务器,具有高CPU和;“内核时间”;使用

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

我注意到mysql服务器的CPU为100%,而“内核时间”(我不确定它的意思)异常高,大约为70%

此服务器上有许多连接(大约400个)和一些活动查询(大约40个)。这能解释这种行为吗?有什么不对劲吗?或者这是意料之中的

编辑:

根据一条评论的建议,我检查了“handler\u read%”变量:
显示全局状态,如“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分析查询日志中的查询
  • 如果问题发生在生产服务器上,请首先将内容复制到测试系统

处理程序读取*的值表明您的表没有正确索引,或者您的查询没有写入以利用您的索引

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

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

  • 在有限的时间内激活慢速查询日志(此外,您可以指定参数log\u querys\u not\u,使用\u索引和min\u inspected\u row\u limit)(慢速查询日志的大小可能增长得非常快)
  • 使用EXPLAIN或EXPLAIN EXTENDED分析查询日志中的查询
  • 如果问题发生在生产服务器上,请首先将内容复制到测试系统

许多设置过高或过低

  • tmp\u table\u size
    max\u heap\u table\u size
    为16G——这是灾难性的!每个连接可能需要其中一个或多个。将其降低到RAM的1%
  • 有大量的
    Com\u show\u字段
    ——向第三方供应商投诉
  • 创建的\u tmp\u disk\u表创建的大量数据
    ——这通常意味着索引或设计不良的查询
  • Select\u scan
    /
    Com\u Select
    =77%——缺少大量索引
  • 线程\u正在运行
    =229——它们可能相互绊倒
  • FLUSH STATUS
    最近运行,因此某些状态值没有用处
  • table\u open\u cache
    为256——有迹象表明,较大的数字会更好。试试1500
  • key\u buffer\u size
    仅为RAM的1%;提高到20%

尽管如此。。。高CPU意味着较差的索引和/或设计较差的查询。让我们看看其中的一些,再加上
SHOW CREATE TABLE

一些设置太高或太低

  • tmp\u table\u size
    max\u heap\u table\u size
    为16G——这是灾难性的!每个连接可能需要其中一个或多个。将其降低到RAM的1%
  • 有大量的
    Com\u show\u字段
    ——向第三方供应商投诉
  • 创建的\u tmp\u disk\u表创建的大量数据
    ——这通常意味着索引或设计不良的查询
  • Select\u scan
    /
    Com\u Select
    =77%——缺少大量索引
  • 线程\u正在运行
    =229——它们可能相互绊倒
  • FLUSH STATUS
    最近运行,因此某些状态值没有用处
  • table\u open\u cache
    为256——有迹象表明,较大的数字会更好。试试1500
  • key\u buffer\u size
    仅为RAM的1%;提高到20%

尽管如此。。。高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