Linux 编译错误:cc: fatal error: Killed signal terminated program cc1

近日临时在 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)。对于内存不足,增加物理内存才是终极合理的解决方案。