博文記錄
Debian 2020-04-05 14:45:40 1498 0

在小内存机器上编译程序会导致 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 使其生效。

索引目录
media iamge
StudioEIM - 冒险者讲习所
0:00