温馨提示×

linux运行golang卡怎么办

小樊
44
2026-10-24 17:51:14
栏目: 编程语言

在 Linux 上运行 Go(Golang)程序“卡住/卡死/卡顿”,原因很多,需要分情况排查。下面按常见原因 → 排查方法 → 解决办法给你一个实用清单。


一、先确认“卡”在哪

先区分是:

  1. 程序启动卡住(一直不输出)
  2. 运行中卡住(某一步不动)
  3. CPU 100% 但没结果
  4. 内存暴涨后卡死

可用:

top
htop
ps -ef | grep 你的程序

二、最常见原因 & 解决办法

1️⃣ 死锁(Deadlock)

Go 最常见“卡住”原因。

表现

  • 程序无任何输出
  • 最后可能报:
fatal error: all goroutines are asleep - deadlock!

常见原因

  • channel 没人接收
  • WaitGroup 数不对
  • 忘记 close channel

排查

go build -race
./你的程序

示例错误写法

ch := make(chan int)
ch <- 1 // 没人接收,卡死

解决

  • 用 buffered channel
  • 确保有 goroutine 接收
  • 正确使用 sync.WaitGroup

2️⃣ goroutine 泄漏(程序越来越卡)

表现

  • 内存慢慢涨
  • 响应越来越慢
  • top 里 goroutine 数巨大

排查

go tool pprof

代码中加:

import _ "net/http/pprof"

然后:

go tool pprof http://localhost:6060/debug/pprof/goroutine

解决

  • channel 要 close
  • context 要 cancel
  • 不要无限 go func()

3️⃣ 系统资源不足(OOM)

表现

  • 突然卡死
  • dmesg 中有 OOM
dmesg | grep -i oom

解决

free -h
ulimit -a

限制内存:

ulimit -v 512000

4️⃣ 磁盘 / IO 阻塞

表现

  • CPU 不高
  • 程序卡在文件 / 网络

排查

iostat
lsof -p 进程ID
strace -p 进程ID

解决

  • 使用 bufio
  • 异步 IO
  • 检查 NFS / 网络挂载

5️⃣ GOMAXPROCS 设置不对(多核机器)

export GOMAXPROCS=核心数

查看:

nproc

6️⃣ 使用了 CGO 卡住

如果你用了:

import "C"

排查

CGO_ENABLED=0 go build

三、快速自查清单 ✅

  • [ ] 是否死锁
  • [ ] 是否 goroutine 泄漏
  • [ ] 是否 OOM
  • [ ] 是否 IO 阻塞
  • [ ] 是否 CGO 问题
  • [ ] 是否 GOMAXPROCS 不对

四、如果你愿意,我可以更精准帮你

你可以告诉我:

  1. 程序是 命令行 / Web / 后台服务?
  2. 卡住时 CPU / 内存 情况?
  3. 有没有 报错信息?
  4. 是否是 刚部署到 Linux 才卡?

我可以直接帮你定位代码问题。

0 踩