在小内存机器上编译程序会导致gcc编译时因内存不足而被系统杀死。
不想通过apt或者yum的包管理安装程序,又想通过编译运行程序方便扩展和移植,此时可以通过创建swap虚拟内存的形式来执行编译。
不过缺点就是,用硬盘换换取的虚拟内存空间依赖于硬盘的性能,这会大大折扣编译速度。如非无奈之举,何尝如此行事。
经过测试在debian上编译PHP,峰值内存大概需要1.2G左右。所以我们只需要创建2G虚拟内存用于即可。
创建一块2G大小的文件
dd if=/dev/zero of=/swapfile bs=1M count=2048
将创建的文件转换为Linux交换分区
mkswap /swapfile
激活swap文件
swapon /swapfile
查看swap文件
swapon -s
结果参考:
Filename Type Size Used Priority
/swapfile file 2047996 246432 -1
如果你不想用了,也可以将swap分区关闭。
swapoff /swapfile
最后可以直接删除掉。
rm -rf /swapfile
如果你通过以上教程成功开启swap分区,但是编译时虚拟内存依然没有被使用。
make时依然会被系统kill掉。
此时你可以通过,修改系统使用swap优先级来改变。
编辑系统内核参数文件:/etc/sysctl.conf
增加或修改swappiness的值,swappiness的值越大,表示越积极使用swap分区,越小表示越积极使用物理内存。
vm.swappiness = 80
最后通过 sysctl -p
使其生效
如果配置完成后,虚拟内存依然没有被使用。你参考如下方式:
依然编辑内核参数文件:/etc/sysctl.conf ,添加以下选项。
vm.panic_on_oom = 2
panic_on_oom = 0 时开启内核oom保护机制,会杀掉超出资源消耗的进程。panic_on_oom = 1 时则会关闭此功能。
但是我自己这里是指0或1都没有什么用,无奈之举,设置为2之后。发现刚刚已经开启虚拟内存分区已经没了。
我重新激活分区之后,再尝试进行编译,发现此时虚拟内存已经被充分使用了。
此后,你可以将oom设置为0或者1,需要注意的是每次修改内核参数文件后,都需要通过执行 sysctl -p
使其生效。