Mysql 交换物理内存空闲时使用的空间

Mysql 交换物理内存空闲时使用的空间,mysql,linux,io,swap,Mysql,Linux,Io,Swap,我最近在两台服务器之间进行了迁移(最新的服务器规格较低),即使服务器上没有负载,它也会一直冻结,以下是我的规格: HP DL120G5/Intel四核至强X3210/8GB RAM 自由-m输出: total used free shared buffers cached Mem: 7863 7603 260 0 176 5736 -/+

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

HP DL120G5/Intel四核至强X3210/8GB RAM

自由-m输出:

             total       used       free     shared    buffers     cached
Mem:          7863       7603        260          0        176       5736
-/+ buffers/cache:       1690       6173
Swap:         4094        412       3681
正如您所看到的,交换中有412MB的ysed,而几乎有80%的物理ram可用

我不知道这是否会引起任何问题,但在我的旧服务器中几乎没有使用交换,所以我认为这似乎不正确

我有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(不支持操作)

我不知道这意味着什么,也没有在谷歌上找到有用的信息

我忘了提到它是一个web托管服务器,所以它有标准的web托管设置(apache、php、mysql等等)


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

正如您现在可能已经意识到的那样,
free-m
输出显示使用了7603MiB(~7.6GiB),而不是free

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

根据您的描述,为了重新获得控制权,我要杀死的第一个进程是Mysql。如果您具有从另一台计算机到该框的ssh/rsh/telnet连接,则您可能必须从该计算机登录,以便从中获得可用的命令行,以
kill

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

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

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

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


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

对于8Gb的RAM,您真的需要交换吗?而且,setsockopt()是一个网络函数,这意味着您应该检查MySQL实例日志,以了解与操作有关的更普遍的错误。在交换方面,内核是智能的。如果某些代码或其他内存确实没有被使用,内核仍会将其分页,以便在内存中为磁盘缓存腾出更多空间,从而提高性能。@L0j1k:我在一台8Gig的家用计算机上,如果没有交换,我永远不会离开。它实际上可以提高性能,原因如上所述。@Linuxios我运行的是完全相同的安装程序,只使用了大约40 mb的交换空间,因此我假设交换空间使用量的增加不是内核智能性的一部分,因为这个问题:),我禁用了交换空间,我将拭目以待!但我开始认为这可能与手头的问题无关谢谢你的回答,但是缓存下的数字“5736”不意味着这是可用内存吗?有人能证实我的话吗?我得做点调查。我一直几乎忽略了共享/缓冲/缓存列。像往常一样,这种提高生产率的尝试有其危险性。。。你是对的。在大多数情况下,应用程序应该有足够的缓存内存。您可能会发现这一页很有帮助,特别是结尾的注释。@AL Kateb是的,缓存行中的数字是您实际拥有的可用内存。剩余的内存用于文件系统/块缓存,如果某些东西需要该内存,则将用于其他目的。(因此,Mem:列中的数字是相当无用的,通常会填充到接近100%)