(1)前段时间将自己的阿里云服务器上的系统由centos 6.5换为了ubuntu 14,其他的硬件配置都没有发生改变,将服务器上的数据恢复并且重新安装了golang的编译环境后,发现使用go build编译稍微大一点的golang项目就会报错:
/usr/local/go/pkg/tool/linux_amd64/6l: running gcc failed: Cannot allocate memory
一直想不通为啥换了个系统就会报这个错,字面意思是gcc分配内存失败,应该是内存不够用,机器配置是1G内存,free -m 发现尚有400M的内存未使用,难道剩余400M的内存还不够go build命令编译代码使用?好吧,既然如此我就给它释放内存,kill掉众多的进程之后再进行go build编译,发现又可以编译了。之后发现偶尔能编译偶尔又不能编译,看样子确实是内存不够,可是为啥之前的centos系统上没有出现这种状况呢,一直不相信简单的“内存不够”就可以解释这一问题,因为之前的centos系统上是正常的,我甚至觉得可能是gcc版本的问题,猜测只有较高版本的gcc才会报这个错误。后来也曾在“golang天朝”论坛上发过帖子,并表达自己的猜测,认为不是内存不够这么简单,结果被别人鄙视不看英文……
不想花钱升级机器硬件,难道我只有装回centos?今天执行free -m偶然间注意到了swap的数值貌似一直是空的,我思考若是我添加swap交换空间是否能解决这一问题呢,毕竟swap其实就是用硬盘空间虚拟出的内存,一个内存的缓冲区。于是就给它加了个1G的文件作为swap,居然直接就可以用go build,再也不用担心gcc对我说Cannot allocate memory了。简单的记录一下添加文件作为swap的步骤:
创建1个1GB的file
-
sudo
dd
if
=
/dev/zero
of=
/mnt/1GB
.swap bs=1M count=1024
格式化为Swap file
sudo mkswap /mnt/1GB.swap
把swap file加入到系统中
-
sudo
swapon
/mnt/1GB
.swap
将swap永久添加
在/ect/fstab中加入新的Swap分区-
sudo
vim/etc/fstab
在最后加入下列内容
-
/mnt/1GB
.swap none swap sw 0 0
1G的内存交换区文件已经创建。
(2)删除swap分区
有时可能会需要删除swap分区,该如何正确进行删除分区哪?
首先停止swap分区:
sudo swapoff /mnt/1GB.swap
删除swap分区文件:
sudo rm -rf /mnt/1GB.swap
删除“/etc/fstab”指定文件
这样就可以手工添加和删除swap分区。