![MySQL 进程的 CPU 使用率超过 100%](https://linux22.com/image/535058/MySQL%20%E8%BF%9B%E7%A8%8B%E7%9A%84%20CPU%20%E4%BD%BF%E7%94%A8%E7%8E%87%E8%B6%85%E8%BF%87%20100%25.png)
我的 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:
命令top
:
这个问题可能是什么原因造成的?我可以对我的服务器进行更改my.cnf
以防止服务器挂起吗?
答案1
- 增加密钥缓冲区(您的当前大小为 64MB,但总索引为 116M,因此至少应为 128MB)。应该可以立即提供帮助。
- 跑步mysql优化和mysql修复在你的桌子上
- 增加表缓存/减少表总数以增加表缓存命中率。也许您有一些未使用或旧的表可以删除。
其他推荐的配置选项:
- 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工具来分析这个慢查询日志,并对已识别的查询运行一些解释。