【问题标题】:swap space used while physical memory is free物理内存空闲时使用的交换空间
【发布时间】:2012-12-23 14:42:46
【问题描述】:

我最近在两台服务器之间迁移(最新的规格较低),即使服务器上没有负载,它也会一直冻结,以下是我的规格:

HP DL120G5 / Intel 四核 Xeon X3210 / 8GB RAM

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 .. 等)

那么我该如何正确诊断这个问题并找到解决方案,或者可能的原因是什么?

【问题讨论】:

  • 有了 8Gb 的 RAM,你真的需要交换吗?
  • 而且,setsockopt() 是一个网络函数,这意味着您应该检查您的 MySQL 实例日志以了解与操作有关的更普遍的错误。
  • 说到交换,内核很聪明。如果某些代码或其他内存确实没有被使用,内核仍会将其分页以为磁盘缓存腾出更多内存空间,从而提高性能。
  • @L0j1k:我在一台有 8gigs 的家用电脑上,如果没有交换,我永远不会去。由于上述原因,它实际上可以提高性能。
  • @Linuxios 我运行的是完全相同的设置,并且只使用了大约 40 mb 的交换空间,所以我假设交换空间使用量的增加并不是这个确切问题的内核智能的一部分:) ,我禁用了交换,我将拭目以待!但我开始认为这可能与手头的问题无关

标签: mysql linux io swap


【解决方案1】:

您现在可能已经意识到,free -m 输出显示 7603MiB (~7.6GiB) USED,而不是免费的。

您的内存不足,它已开始交换,这将大大减慢速度。由于大多数应用程序不知道虚拟内存现在来自速度慢得多的磁盘,因此系统很可能会出现“挂起”,而没有任何反馈来描述问题。

根据您的描述,我为重新获得控制权而使用kill 的第一个进程将是 Mysql。如果您从另一台机器通过 ssh/rsh/telnet 连接到此框,您可能必须从该机器登录才能获得到 kill 的可用命令行。

我对正在发生的事情的第一个想法(假设?)是......

  • MySQL 正在尝试执行不支持的操作,因为当前配置了此计算机。它可能缺少库或未设置环境变量或任何数量的东西。

  • 该操作分配了一些内存,但失败并且在执行时没有清理分配。如果这是一个 shell 脚本,可以通过在开头放置一个事件trap 命令来运行一个释放内存并清理的函数来修复它。

  • 编写代码是为了在失败时不断重试,因此它会迅速耗尽您的所有内存。回到 shell 脚本说明,trap 函数可能还会提示您是否真的要继续重试。

不是一个完整的答案,但希望会有所帮助。

【讨论】:

  • 感谢您的回答,但是缓存下的数字“5736”不是表示这是可用内存吗?任何人都可以确认我吗
  • 不得不做一些研究。我几乎总是忽略共享/缓冲区/缓存列。像往常一样,这种提高生产力的尝试是有危险的……你是对的。在大多数情况下,应用程序应该有足够的缓存内存。您可能会发现此页面linuxatemyram.com/play.html 很有帮助,尤其是末尾的注释。
  • @AL-Kateb 是的,这是正确的,缓存行中的数字是您拥有的实际可用内存。剩余内存用于文件系统/块缓存,如果需要该内存,将用于其他目的。 (因此 Mem: 列中的数字相当无用,它通常会填充到接近 100%)
猜你喜欢
  • 2014-09-01
  • 2016-12-24
  • 2014-03-14
  • 2017-10-27
  • 2012-03-16
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
相关资源
最近更新 更多