在 Debian 上运行 Go (Golang) 程序的“调优”通常分为几个层面:系统层(Debian)、Go 运行时层、应用层(代码)。下面按实战角度给你一个清晰清单。
编辑 /etc/sysctl.conf:
# 文件描述符
fs.file-max = 1000000
# TCP
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
# 内存
vm.swappiness = 10
执行:
sysctl -p
/etc/security/limits.conf:
* soft nofile 1000000
* hard nofile 1000000
Go 1.5+ 默认 = CPU 核数,一般不要手动改
runtime.GOMAXPROCS(runtime.NumCPU())
⚠️ 容器环境下(Docker/K8s)要确保 GOMAXPROCS 不等于宿主机核数
可用:
export GOMAXPROCS=4
控制 GC 频率:
GOGC=100 # 默认
GOGC=200 # 更少 GC,内存更高
GOGC=50 # 更频繁 GC,延迟更低
示例:
GOGC=200 ./app
Go 不会自动感知 cgroup 内存限制
GOMEMLIMIT=512MiB
避免 OOM Kill。
import _ "net/http/pprof"
go func() {
http.ListenAndServe("0.0.0.0:6060", nil)
}()
分析:
go tool pprof http://localhost:6060/debug/pprof/heap
go tool pprof http://localhost:6060/debug/pprof/profile
make([]T, 0)sync.Pool
string ↔ []byte 频繁转换sem := make(chan struct{}, 8)
go build -ldflags="-s -w"
GOFLAGS="-gcflags=-N -l" # 调试
GOFLAGS="" # 生产
/etc/systemd/system/goapp.service
[Service]
ExecStart=/opt/app/app
Environment=GOMAXPROCS=4
Environment=GOGC=200
Environment=GOMEMLIMIT=800MiB
LimitNOFILE=1000000
systemctl daemon-reexec
systemctl restart goapp
top / htopcat /proc/<pid>/statuspprofGOGC / GOMEMLIMIT如果你愿意,可以告诉我:
我可以直接给你一套 针对性调优方案。