温馨提示×

ubuntu下golang打包为何慢

小樊
35
2026-10-01 10:23:16
栏目: 编程语言

在 Ubuntu 下使用 Golang 打包(如 go build / go install / go test)感觉“慢”,通常不是单个原因,而是多个因素叠加。下面按最常见 → 较少见的顺序说明,并给出对应解决办法。


一、最常见原因

1. 没有开启 Go Module 缓存 / 第一次拉依赖

第一次构建时:

  • 下载所有依赖
  • 编译所有依赖包
  • 写入 $GOPATH/pkg/mod 和 build cache

✅ 表现:

  • 第一次慢
  • 第二次明显变快

✅ 解决:

go env -w GOPROXY=https://proxy.golang.org,direct
go clean -cache
go build

2. 开启了 Virus Scanner / 杀毒软件(Ubuntu 较少,但存在)

如:

  • clamav
  • 企业安全 agent
  • 实时监控 $GOPATH

✅ 表现:

  • CPU 不高
  • IO 很高
  • 编译时卡在写文件

✅ 解决:

# 临时停止
sudo systemctl stop clamav-freshclam

3. 使用机械硬盘 / 低性能磁盘

Go 编译会:

  • 大量小文件读写
  • 写 build cache

✅ 表现:

  • iostat 中 %util 很高
  • CPU 没跑满

✅ 解决:

  • 使用 SSD
  • 将 GOCACHE 放到 tmpfs:
go env -w GOCACHE=/tmp/gocache

4. CGO 开启(编译 C 代码)

如果项目或依赖用了:

  • sqlite
  • openssl
  • grpc 的某些实现

✅ 表现:

  • 调用 gcc
  • 编译时间成倍增加

✅ 检查:

go env CGO_ENABLED

✅ 关闭(如不需要):

CGO_ENABLED=0 go build

5. 并发数被限制

Go 默认使用所有 CPU:

go env GOMAXPROCS

但以下情况会慢:

  • 容器 CPU 限制
  • ulimit
  • 云服务器 CPU 被限频

✅ 检查:

nproc
go build -p 4 .

二、Ubuntu 特有因素

6. 文件系统问题(ext4 / overlay)

在:

  • Docker
  • WSL
  • 加密 home 目录

编译会变慢。

✅ 解决:

  • 不在加密目录编译
  • Docker 中挂载 volume 而非 copy

7. 内存不足导致 Swap

✅ 表现:

  • 编译中途卡住
  • free -h 看到 swap 使用

✅ 解决:

sudo swapoff -a
# 或加内存

三、Go 本身机制说明(不是“慢”)

8. 静态链接 + 全量编译

Go 不会像 Java 那样“只编译改动的类”:

  • 每个包都重新编译(除非 cache 命中)

✅ 正常表现:

  • 小项目:秒级
  • 大项目:几十秒~几分钟

四、快速自检清单(推荐)

# 1. 看编译时间
time go build

# 2. 看是否在用 cache
go build -x 2>&1 | grep cache

# 3. 看 CPU / IO
top
iostat -x 1

五、如果你愿意

你可以贴出:

  • go version
  • 项目规模(包数量)
  • 是否在 Docker / WSL
  • go build -x 的输出片段

我可以帮你精确定位是哪一步慢。

0 踩