我的服务器正在交换,我该如何修复?

我的服务器正在交换,我该如何修复?

我正在使用slicehost.com 256MB 主机托管我的网站。

不幸的是,它几乎一直在交换。当我在控制台中输入时,free我得到了如下信息:

            total       used       free     shared    buffers     cached
Mem:        251140     228968      22172          0        596      17356
-/+ buffers/cache:     211016      40124
Swap:       524284      60944     463340

如果我reboot使用服务器,交换会停止一会儿然后重新开始。

我怎么能够:

1)找出哪些过程/功能导致交换

2)如何修复此问题

3)确定 256MB 是否太少,是时候升级而不是优化了

谢谢

// 使用 CakePHP/apache

答案1

1)尝试并ps aux观察/proc/$pid/status/proc/$pid/smaps

2)添加更多内存。

3)考虑到您当前的负载,256MB 显然太少了。

答案2

你使用 Apache 吗?

如果是,请执行以下操作:

  • 打开 top (只需在终端上输入 top 即可)
  • 按 Shift M 键按内存消耗排序
  • 在 RES 列中,你可以看到你的 Apache 实例预留了多少内存

假设每个进程消耗 20 Mb。

然后,做一个简单的数学运算。为 SO 留出 156Mb,然后将另外 100 除以一个 Apache 消耗的内存量:100/20 = 5

这将告诉你可以同时拥有多少个 Apache 进程。

然后,转到你的 apache 配置(/etc/apache2)并在主配置文件中找到以下设置: - StartServers - ServerLimit - MaxClients

并将它们全部设置为 5。

请记住,256 对于 Apache 设置来说太小了。我不会在内存少于 2Gb 的情况下运行 Apache。

答案3

为了诊断谁在战斗,我建议安装在顶上。Atop 将向您显示进程级别的更改。为了快速演示,我让 MySQL 使用它可用的所有内存,然后处理一些大文件,强制将 MySQL 内存换出,以便缓存我的大型测试文件。下面的屏幕截图显示了 MySQL 尝试从交换中读回内存(图像而不是文本,以便您可以看到突出显示)。

当 MySQL 尝试访问已交换的内容时,请注意 majflt 和 minflt 数字。您还可以查看其他内存统计信息,以及您希望从 top、ps 等获取的任何信息。{apt-get,yum} 安装于顶部

在顶部显示 majflt 和 minflt

答案4

您可以降低 swappiness,首先使用以下方法检查当前值cat /proc/sys/vm/swappiness然后改变值sysctl -w vm.swappiness=10

另外,你可以随时使用以下命令禁用交换:sudo swapoff 一个 或者编辑 /etc/fstab

如今我很少使用交换,即使在像您这样的小型虚拟机中也是如此。

相关内容