MySQL 进程的 CPU 使用率超过 100%

MySQL 进程的 CPU 使用率超过 100%

我的 LAMP 服务器出现了一些问题。最近一切都变得非常慢,尽管我网站上的访客数量没有太大变化。当我运行top命令时,它显示 MySQL 进程占用了 150-200% 的 CPU。这怎么可能呢,我一直以为 100% 是最大值?

我正在运行具有 1.5 GB RAM 的 Ubuntu 9.04 服务器版本。

my.cnf设置:

key_buffer      = 64M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 200
table_cache            = 512
table_definition_cache = 512
thread_concurrency     = 2

read_buffer_size = 1M
sort_buffer_size = 4M
join_buffer_size = 1M

query_cache_limit   = 1M  # the maximum size of individual query results
query_cache_size    = 128M

以下是输出MySQLTuner

MySQLTuner 输出

命令top

顶部输出

这个问题可能是什么原因造成的?我可以对我的服务器进行更改my.cnf以防止服务器挂起吗?

答案1

  1. 增加密钥缓冲区(您的当前大小为 64MB,但总索引为 116M,因此至少应为 128MB)。应该可以立即提供帮助。
  2. 跑步mysql优化mysql修复在你的桌子上
  3. 增加表缓存/减少表总数以增加表缓存命中率。也许您有一些未使用或旧的表可以删除。

其他推荐的配置选项:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • 长查询时间 = 4
  • 记录未使用索引的查询

过一段时间再检查日志文件。

答案2

运行top -H以查看所有正在运行的线程,而不仅仅是整个进程。此外,如果您1在 top 中按下 键,它将显示各个 CPU/核心的 CPU 使用率。

答案3

您的处理器有多个核心,或者您有多个处理器。如果您有两个核心,并且一个进程使用了​​两个核心的 100%,则它会在顶部显示为 200%。

同样,这很可能按预期工作 - 您的配置没有任何问题。如果您经常遇到挂起,根据您发布的内容,您可能需要考虑在表中添加适当的索引(或优化查询)。

答案4

我注意到一个问题,与 CPU 无关。如果您在同一台服务器上使用 Apache 和 MySQL,您可能会遇到糟糕的情况(内存)当你的 Apache 活动增加时。

MySQLTunner 会告诉您,使用 200 个可用连接(您的最大连接设置)将填满 RAM。假设您将 Apache 限制为 150 个进程,当 MySQL 和 Apache 尝试使用 150 个连接时,您肯定没有足够的 RAM(因为 Apache 也是一个消耗 RAM 的大户)。

所以这是关于 RAM 的,你可能还没有受到影响:-) 顶级命令只显示 15 个 apache 进程(但你的平均负载为 3/6/16,这意味着风暴发生在 15 分钟前,现在正在离开)。

关于CPU问题,补充一下沙卡兰迪,这可能是由于一个单一的查询。它可能在一个巨大的表上,或者执行大量的重新索引任务,或者使用大量的临时文件,索引丢失(删除?)等。检测它的唯一方法是激活慢查询日志(可能阈值较高,如 8)。然后使用mysqlsla工具来分析这个慢查询日志,并对已识别的查询运行一些解释。

相关内容