服务器没有响应,顶部输出显示以下内容:mysql 消耗的 CPU 超过 500%
重启服务器能解决这个问题吗?重启后我还会遇到同样的问题吗?
# top
top - 06:30:38 up 82 days, 17:43, 1 user, load average: 117.87, 105.81, 85.65
Tasks: 328 total, 27 running, 299 sleeping, 0 stopped, 2 zombie
Cpu(s): 0.1%us, 99.4%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.5%st
Mem: 35847720k total, 35823272k used, 24448k free, 788k buffers
Swap: 0k total, 0k used, 0k free, 39552k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15661 mysql 21 0 1192m 282m 904 R 550.8 0.8 1304:06 mysqld
118 root 17 -5 0 0 0 D 69.4 0.0 27:03.12 kswapd0
26835 root 18 0 10992 936 416 R 62.8 0.0 0:13.51 top
26831 root 19 0 72872 864 224 R 37.2 0.0 0:07.18 php
26881 root 18 0 79944 1528 228 R 18.3 0.0 0:04.96 php
更新:
我在一台 34 GB 的机器上动态地将 myisam 键缓冲区增加到 8 GB,将查询缓存增加到 100MB,将表缓存增加到 256(没有将其添加到 my.cnf)。这导致机器在一天之内失去响应。
我重新启动了mysql服务,问题仍然存在。
由于动态更改此设置,内存是否会产生碎片?
我需要重新启动服务器吗?
答案1
您有两个问题:
您没有交换。这使得系统无法从物理内存中清除无用的数据。这就是导致
kswapd
旋转和闪烁的原因。有些东西正在消耗大量内存。不管它是什么,它都不在您显示的代码片段中。
答案2
您的机器内存不足,奇怪的事情发生了。您有 ~34gb 的 RAM,几乎全部被使用。剩余的可用空间可能是由于 而保留的min_free_kbytes
。
由于内存即将用完,内核可能会疯狂地尝试整理内存碎片并释放一些较大的块(请参阅/proc/buddyinfo
获取碎片图)。因此,当 mysql 请求内存时,内核会让进程等待,同时进行内存碎片整理(尝试释放足够大的块),从而使进程的 CPU 时间激增。
所以这里真正的问题是你的所有内存都到哪里去了?你可以按 M (shift+m) 按 top 中的内存排序。
编辑(回答您的其他问题):
服务器重启可能有助于解决问题,但这可能是暂时的。动态更改 MySQL 设置不会产生这种影响(除非代码中有一些重大错误,但不太可能)。因此,无论设置是在运行时更改的,还是从冷启动更改的,您都可能再次陷入这种情况。
至于这些设置是否是原因,我无法回答。我不熟悉 MySQL 的性能调优。
答案3
检查您的存储子系统。系统上的磁盘是否有问题?