服务器没有响应

服务器没有响应

服务器没有响应,顶部输出显示以下内容: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

您有两个问题:

  1. 您没有交换。这使得系统无法从物理内存中清除无用的数据。这就是导致kswapd旋转和闪烁的原因。

  2. 有些东西正在消耗大量内存。不管它是什么,它都不在您显示的代码片段中。

答案2

您的机器内存不足,奇怪的事情发生了。您有 ~34gb 的 RAM,几乎全部被使用。剩余的可用空间可能是由于 而保留的min_free_kbytes

由于内存即将用完,内核可能会疯狂地尝试整理内存碎片并释放一些较大的块(请参阅/proc/buddyinfo获取碎片图)。因此,当 mysql 请求内存时,内核会让进程等待,同时进行内存碎片整理(尝试释放足够大的块),从而使进程的 CPU 时间激增。

所以这里真正的问题是你的所有内存都到哪里去了?你可以按 M (shift+m​​) 按 top 中的内存排序。

编辑(回答您的其他问题):
服务器重启可能有助于解决问题,但这可能是暂时的。动态更改 MySQL 设置不会产生这种影响(除非代码中有一些重大错误,但不太可能)。因此,无论设置是在运行时更改的,还是从冷启动更改的,您都可能再次陷入这种情况。
至于这些设置是否是原因,我无法回答。我不熟悉 MySQL 的性能调优。

答案3

检查您的存储子系统。系统上的磁盘是否有问题?

相关内容