我最近在 2 个服务器之间迁移(最新的具有较低的规范),即使服务器上没有负载,它也会一直卡住,以下是我的规范:
HP DL120G5/英特尔四核至强 X3210/8GB 内存
free -m 输出:
total used free shared buffers cached
Mem: 7863 7603 260 0 176 5736
-/+ buffers/cache: 1690 6173
Swap: 4094 412 3681
如您所见,交换区中有 412 MB ysed,而几乎 80% 的物理内存可用
我不知道这是否会造成任何麻烦,但我的旧服务器几乎没有使用交换,所以我认为这似乎不对。
我有 cPanel 许可证,所以我联系了他们的支持,他们注意到我有很高的 iowait,是的,当我运行 sar 时,我注意到它有时超过 60%,最常见的是 20%,但有时它达到 60% 甚至 70 %
我真的不知道如何诊断,我怀疑我的驱动器速度很慢,这可能会导致延迟,所以我使用 dd 进行了测试,速度为 250 mb/s,所以我认为传输速度还可以再加上硬件应该是全新的。
高负载通常发生在我使用 gzip 或 tar 提取文件(备份或恢复 cpanel 帐户)时。
值得一提的是,top 报告 mysql 使用了 100% 到 125% 的 CPU,有时它会达到更多,如果我跟踪 mysql 进程,我会不断收到此错误:
setsockopt(376, SOL_IP, IP_TOS, [8], 4) = -1 EOPNOTSUPP(不支持操作)
我不知道那是什么意思,也没有通过谷歌搜索得到有用的信息。
我忘了说它是一个物有所值的网络托管服务器,因此它具有网络托管的标准设置(apache、php、mysql .. 等)
那么我该如何正确诊断这个问题并找到解决方案,或者可能的原因是什么?
最佳答案
您现在可能已经意识到,free -m
输出显示 7603MiB (~7.6GiB) USED,不是免费的。
你的内存不足,它已经开始交换,这将大大减慢速度。由于大多数应用程序都不知道虚拟内存现在来自慢得多的磁盘,因此系统很可能看起来“挂起”而没有任何反馈来描述问题。
根据您的描述,我要杀死
以重新获得控制权的第一个进程是 Mysql。如果您从另一台机器通过 ssh/rsh/telnet 连接到此机器,您可能必须从那台机器登录才能获得可用的命令行以从中kill
。
对于正在发生的事情,我的第一个想法(假设?)是......
MySQL 正在尝试做一些不受当前配置支持的事情。它可能缺少库或未设置环境变量或任何数量的东西。
该操作分配了一些内存但失败了,并且在分配时没有清理分配。如果这是一个 shell 脚本,可以通过在开头放置一个事件
trap
命令来修复它,该命令运行一个释放内存和清理的函数。编写代码以在失败时不断重试,因此它会迅速耗尽您的所有内存。回到 shell 脚本说明,
trap
函数可能还会提示您是否真的要继续重试。
不是一个完整的答案,但希望能有所帮助。
关于mysql - 物理内存空闲时使用的交换空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14011855/