我们使用VPS时常常苦恼于有限的内存。尤其是一些小内存的VPS,不得不执行各种优化以节省内存占用。因此,我们可能会需要为自己的VPS增加一块交换内存,即SWAP。SWAP其实是一块硬盘上的区域,系统会将内存中暂时不用的信息转移到SWAP区中,需要用到时再从SWAP中调入内存,这样就实现了内存的扩大。其原理和Windows系统中的页面文件(pagefile)类似。下面我们介绍怎样为系统添加SWAP内存。需要注意的是,OpenVZ虚拟的VPS不支持SWAP空间,网上有人声称可以用脚本的方式在OpenVZ虚拟的VPS中设置SWAP区,我将在文末说明这种方法的错误之处。Xen和KVM虚拟以及vmware虚拟的一般都是支持的。
首先,我们需要新建SWAP文件,这里我们建一个512MB的文件,记住SWAP不是越大越好,足够用就行了。用root账户登录VPS,执行:
1 2 3 | dd if=/dev/zero of=/vpsswap bs=1024 count=524288 mkswap /vpsswap swapon /vpsswap |
这样我们就建好了SWAP内存,此时我们执行
1 | free -m |
,应该可以看到一块511MB的SWAP内存了。
这样建好SWAP后有一个缺点,就是每次开机都需要执行一次swapon /vpsswap命令才能让SWAP工作。为了避免这个缺点,我们将这个命令加入系统开机加载项中即可(网上有一种说法是在文件/etc/fstab中添加一行,实测不知什么原因,未成功)。打开文件:
1 | /etc/rc.local |
在该文件最后一行添加:
1 | swapon /vpsswap |
这样,我们完成了全部的设置,每次系统开机将会自动启用这块SWAP空间。
最后来说一下网上传的比较广的OpenVZ虚拟VPS下增加SWAP区的方式的错误之处,网上所说的方法如下:(来源:https://www.pzo.cc/2455.html)
新建一文本文件,如swap.sh,内容如下:
1 2 3 4 5 | #!/bin/bash SWAP="${ 1:-512}" NEW="$[SWAP*1024]"; TEMP="${ NEW//?/ }"; OLD="${ TEMP:1}0" umount /proc/meminfo 2> /dev/null sed "/^Swap\(Total\|Free\):/s,$OLD,$NEW," /proc/meminfo > /etc/fake_meminfo |
然后执行这个脚本即可增加SWAP区,并且使用free -m的确可以查看到新增的SWAP内存。那么,这个方法有什么不靠谱的地方呢?我们可以仔细看一下这个shell脚本,就可以发现,脚本的操作实际上是伪造了一个内存的显示数据,从而欺骗了free这个工具。虽然执行free能看到swap区,但是实际上并没有增加。这一点我们可以从两方面得到证明:1,新增SWAP之后硬盘的剩余容量没有丝毫减少,这与SWAP的工作原理不符。2,给VPS进行增压测试,发现无论压力如何,SWAP区的内存占用都是零。因此,我们可以总结,这种增加OpenVZ VPS的SWAP区的方式是错误的。