近日临时在 CentOS 服务器上重新编译 php,下载源码、解压、configure 配置需要的选项,直到 make 过程中突然中断,报错:
cc: fatal error: Killed signal terminated program cc1
确认不是代码版本问题和编译配置错误,于是怀疑云主机内存不够(还在跑应用,top查看可用内存不足1GiB)。百度一下果然有内存不够引起这个错误的。
以下是使用交换分区的临时解决方案(先 su 为 root 用户):
# dd if=/dev/zero of=/swapfile bs=64M count=16
# mkswap /swapfile
# swapon /swapfile
# make
# swapoff /swapfile
# rm /swapfile
前面每一行命令对应的说明如下:
# 用 dd 命令创建大小为 64 * 16 = 1024 GiB 的空白文件为 /swapfile,如果不够可以把 16 改为 32、64等(即 2 GiB、4 GiB等,以此类推,只要硬盘够大)
# mkswap 初始化 /swapfile 文件为交换分区
# swapon 设置 /swapfile 文件为系统交换分区
# 重新执行刚才失败的 make
# 卸载 /swapfile 交换分区
# 删除 /swapfile 文件,释放磁盘空间
注意,增加交换分区只是个对运行内存不够用的临时替代方案,代价是磁盘空间消耗,以及对应物理磁盘的频繁读写。隐患:一方面磁盘访问比内存访问慢得多,另一方面会影响磁盘使用寿命(尤其对SSD)。对于内存不足,增加物理内存才是终极合理的解决方案。