在亚马逊的主机搭建我的个人博客一个多月了,最近安装了一些插件,以来丰富我的博客的功能,另外好几个插件是统计和管理型的,这样让我对自己对小站有更详细的了解。

然而也就装了三四个插件后,网站访问变得出奇慢,基本上可以说是无响应。这个时候申请ssh登陆服务器也会超时,如果之前登陆过的话,每输入任何一个字母都等很久,多数命令并不能执行返回cannot allocate memory的错误。起初我以为是cpu或者网络传输到达免费额度了,所以数据传不过来或者cpu计算能力不够。一直觉得1G内存用来跑一个网站绰绰有余了,就没考虑内存出问题,可是其他问题查了一个遍都正常,那只能是内存用完了。实际测试确实是这个问题。

这是我都个人小站待机时候都内存状态,没有任务也没有客人访问都时候,物理内存就用掉900多M,可见不添加虚拟内存毫无疑问会卡死。

最好的解决方法就是增加内存,可是这同时增加支出。。。我作为学生本来就用的amazon免费资源,所以这条路走不通了。

第二个很好的方法就是增加交换内存。把硬盘的一部分拿出来,当内存不够用的话可以暂时存在这里做个缓冲。亚马逊免费套餐也良心的很,硬盘最大可以达到30G而且是SSD,之前传输文件速率能达到71M/S,已经相当棒了。所以我着手开始给我的虚拟机增加虚拟内存。一般来说服务器提供商默认是不设置虚拟内存的,所以我们添加后应该能大幅度提高使用性能。

有两种方法:

  1. 使用一个文件作为交换内存
  2. 新增一个分区作为交换分区

第一种方法很方便也是我喜欢用的,并且也有利于之后调整虚拟内存的大小,只需要更改那个文件大小就可以了。看下边的步骤。

下边步骤都需要root权限,su切换到root或者用sudo

首先如果你设置过或者默认有虚拟内存,需要先停用掉: swapoff -a

然后新建一个文件用来当作交换文件用:

dd if=/dev/zero of=/swapfile bs=1M count=1024

这个命令生成一个在根分区的空文件,大小为1G,可以根据个人喜好更改地点和大小。总大小为bs*count:块大小与块数量都乘积。
mkswap /swapfile
swapon /swapfile

运行这两个命令就开启了虚拟内存。

下一步设置开机自动加载,不然刚才的虚拟内存只对本次有效:

在/etc/fstab 写入下边的配置:

/swapfile none swap defaults 0 0

或者编辑/etc/rc.local文件,加入以下内容(具体根据自己的文件路径):

swapon /swapfile

这样用文件作为交换分区就设置好了,如果以后需要更改大小就很简单,先swapoff -a停用掉交换分区,把之前的swapfile删掉再重新生成一个满意大小的文件就可以了,下边开启以及设置开机自启动命令相同。

可以用free -m 查看一下,是不是多出了swap内存。

第二种方法设置一个swap磁盘分区:

首先是停掉现有的swap分区:swapoff -a

用fdisk命令(例: fdisk /dev/xvda1)对磁盘进行分区,添加swap分区,新建分区,在fdisk中用“t”命令将新添的分区id改为82(Linux swap类型),最后用w将操作实际写入硬盘(没用w之前的操作是无效的)。

mkswap /dev/xvda2 格式化swap分区,这里的xvda2要看您加完后p命令显示的实际分区设备名

swapon /dev/xvda2 启动新的swap分区

为了让系统启动时能自动启用这个交换分区,可以编辑/etc/fstab,加入下面一行
/dev/xvda2  swap swap defaults 0 0

我个人是使用第第一种方式亲测效果很好,第二种方式是根据前人在其他系统上情况移植过来的,我自己没有亲自测试,所以如果有需要用第二种方法的话一定要每一步都小心。

我在自己设置swap时候参考了很多他人都教程,在此表示由衷都感谢。

https://stackoverflow.com/questions/26985229/ssh-and-bash-fork-cannot-allocate-memory-vps-ubuntu

http://lovelive.blog.51cto.com/9451728/1895083

http://www.cnblogs.com/wuxie1989/p/5888595.html

One thought on “给Linux新加或者修改Swap交换内存(Amazon EC2 )”

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.