Go Install Singal Killed - 内存不足导致go编译程序进程被OS杀死

AI 摘要: 在512M内存的云服务器上进行go install时报signal:killed错误,原因是内存不足。

背景:在一台 512M 内存的云服务器上,通过 go install 安装应用程序,报 signal:killed 错误

1. 问题背景

今天在一台 512M 的 CentOS 机器上,执行go install安装一个 go 程序,编译进程被系统 kill 掉了,查了下是因为内存不足,采用 Swap 分区解决下

1
2
3
# 现象
→ go install github.com/lupguo/parrot-translate@latest
go build github.com/go-redis/redis/v8: /usr/local/go/pkg/tool/linux_amd64/compile: signal: killed

1.1. 查看 linux 系统日志 /var/log/message

2. 解决方案

swap 分区开启: http://cn.linux.vbird.org/linux_basic/0230filesystem.php#fstab

开启 swap 交换分区,临时解决服务器内存资源不足情况,具体 swap 开启可以参考鸟哥文章,基本步骤如下:

2.1. 基于 swap 文件方式 (采用)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 创建swap文件
dd if=/development/zero of=/tmp/swap bs=1M count=512
# mkswap格式化
mkswap /tmp/swap
# swapon启动
swapon /tmp/swap
# swap观察
free -h
swapon -s
# swapon停止
swapoff /tmp/swap

2.2. 基于分区表方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 基于磁盘分区
fdisk /development/hdc
 n: 创建新分区, +512M大小
 p: 打印当前分区
 m: 帮助
 t: 修改系统ID
 w: 写入
parrprobe重载分区表
创建swap格式: mkswap /development/hdc7
free观察
swapon /development/ddc7
swapon -s 观察

3. 补充: Go1.17 版本把 go get 和 go install 语义重新区分清楚了

go 1.17 版本,把go getgo install语义区分清楚了,通过go install pkg@version替代了

参考:https://golang.org/doc/go-get-install-deprecation

大意:从 Go 1.17 开始,go get不推荐用来安装可执行文件,采用go install替代;1.18 版本go get则将不再构建包,仅用于添加、更新或删除 go.mod,即go get将始终表现得好像启用-d依赖标志。

1
2
3
4
5
go get -v github.com/lupguo/parrot-translate
go get: installing executables with 'go get' in module mode is deprecated.
	Use 'go install pkg@version' instead.
	For more information, see https://golang.org/doc/go-get-install-deprecation
	or run 'go help get' or 'go help install'.