我正在为我的网站使用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吗?
如果你是,请按照下列步骤操作:
假设你每个进程消耗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)安装在顶层 。

这是PHP。
增加更多的内存,或减less并发PHP进程的数量
这不是很多。
您可以降低swappiness,首先用cat / proc / sys / vm / swappiness检查当前值,然后更改值sysctl -w vm.swappiness = 10
另外,你可以使用sudo swapoff a或者编辑/ etc / fstab来禁用swap
现在我很less使用交换,即使在像你这样的小型虚拟机上。
你可以让Apache使用更less的内存,但是这并不容易。
MaxClients 64 )和中等数量的线程(例如ThreadsPerChild 32 )。 你为什么不试图find哪个进程正在吃多less内存时发生重大交换
最佳
在find哪个过程正在进行有益的记忆之后,应该首先解决问题。 例如。 如果mysql查询占用太多的内存,也许你决定限制mysql服务器的内存,或者你可以做查询优化
那么256MB真的好像很小。 既然你提到了apache,而且我知道apache默认使用了prefork模式,它可能是真正的罪魁祸首。 考虑在worker模式下运行apache,只需要启动需要的模块(通常apache会自动启动大量的模块)或者用轻量级的Nginxreplaceapache。