我的服务器正在交换,我该如何解决?

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

不幸的是几乎所有的时间都在交换。 当我input控制台时,我得到如下所示:

  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是否太less,是升级而不是优化的时间

谢谢

//使用CakePHP / apache

1)尝试ps aux并查看/proc/$pid/status/proc/$pid/smaps

2)添加更多的内存。

3)256MB显然太less了你的当前负载。

你使用的是Apache吗?

如果你是,请按照下列步骤操作:

  • 打开顶部(只需在terminal上键入顶部)
  • 按移位M按内存消耗进行sorting
  • 在Column RES上,你可以看到你的apache实例保留了多less内存

假设你每个进程消耗20Mb。

然后,做一个简单的math。 为SO留出156Mb,另一个100除以一个apache消耗的内存量:100/20 = 5

这会给你多less个可以同时进行的apache进程。

然后,进入你的Apacheconfiguration(/ etc / apache2),并在主configuration文件中find以下设置: – StartServers – ServerLimit – MaxClients

并把它们全部设置为5。

请记住,256对于apache安装来说太小了。 我不会运行less于2Gb的内存的Apache。

为了诊断谁在战斗,我build议安装在上面 。 Atop会告诉你一个过程级别的变化。 为了进行快速演示,我引导MySQL使用所有可用的内存,然后使用一些大文件强制MySQL内存换出,以便caching我的大型testing文件。 下面是一个屏幕截图,显示MySQL试图从swap中读取内存(图像而不是文本,因此您可以看到高亮显示)。

当MySQL试图达到已经被换出的东西时,注意majflt和minflt数字。 你也可以看到其他内存统计信息,以及任何你想从top,ps等获得的东西(apt-get,yum)安装在顶层

顶上显示majflt和minflt

  1. 这是PHP。

  2. 增加更多的内存,或减less并发PHP进程的数量

  3. 这不是很多。

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

另外,你可以使用sudo swapoff a或者编辑/ etc / fstab来禁用swap

现在我很less使用交换,即使在像你这样的小型虚拟机上。

你可以让Apache使用更less的内存,但是这并不容易。

  • 禁用服务器上的非必要服务。
  • 使用PHP中的worker MPM模块作为FastCGI(它与PHP不兼容)。
  • configuration工作模块以使用中等数量的MaxClients(例如MaxClients 64 )和中等数量的线程(例如ThreadsPerChild 32 )。
  1. 你为什么不试图find哪个进程正在吃多less内存时发生重大交换

    最佳

  2. 在find哪个过程正在进行有益的记忆之后,应该首先解决问题。 例如。 如果mysql查询占用太多的内存,也许你决定限制mysql服务器的内存,或者你可以做查询优化

  3. 那么256MB真的好像很小。 既然你提到了apache,而且我知道apache默认使用了prefork模式,它可能是真正的罪魁祸首。 考虑在worker模式下运行apache,只需要启动需要的模块(通常apache会自动启动大量的模块)或者用轻量级的Nginxreplaceapache。