确保Golang安装路径(GOROOT)、工作空间(GOPATH)及二进制文件路径(PATH)正确配置。推荐将以下内容添加到~/.bashrc或/etc/profile(全局生效)中:
export GOROOT=/usr/local/go # 默认安装路径,根据实际调整
export GOPATH=$HOME/go # 工作空间,用于存放项目和依赖
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin # 添加Go命令到PATH
执行source ~/.bashrc(或对应文件)使配置生效。若使用Go Modules(推荐),可忽略GOPATH的强制设置。
从Go 1.11+开始,使用Go Modules替代传统GOPATH模式,避免依赖冲突。初始化模块:
go mod init your_project_name # 在项目根目录执行
添加依赖时会自动下载至$GOPATH/pkg/mod,无需手动管理GOPATH。
国内访问Golang官方包仓库较慢,建议配置代理:
export GOPROXY=https://goproxy.cn,direct # 国内常用代理
添加到环境变量中,提升依赖下载速度。
GOMAXPROCS)GOMAXPROCS控制同时执行Go代码的CPU核心数,默认值为CPU核心数。可通过以下方式设置:
export GOMAXPROCS=$(nproc)(nproc获取CPU核心数)runtime.GOMAXPROCS(runtime.NumCPU())通过GOGC环境变量调整GC触发频率(默认100%,即内存翻倍时触发):
GOGC值(如export GOGC=75):更频繁触发GC,减少内存占用,但增加CPU开销。GOGC值(如export GOGC=200):减少GC次数,提升性能,但增加内存压力。debug.SetGCPercent(75)。通过初始化大内存块(Ballast)扩大堆内存,减少GC频率。示例:
func main() {
ballast := make([]byte, 10*1024*1024*1024) // 10GB球体
runtime.KeepAlive(ballast) // 防止被GC回收
// 业务代码
}
适用于内存密集型应用,可显著降低GC次数。
sync.Pool缓存频繁创建的对象,避免重复分配。示例:var pool = sync.Pool{
New: func() interface{} { return make([]byte, 1024) },
}
buf := pool.Get().([]byte)
defer pool.Put(buf)
goroutine处理并发任务,但需控制数量(如用worker pool避免过多goroutine导致调度开销)。channel替代共享内存,避免竞态条件。Go自带encoding/json性能一般,推荐使用easyjson(代码生成方式):
go install github.com/mailru/easyjson@latest
easyjson -all your_struct.go # 生成序列化/反序列化代码
easyjson比原生库快3-5倍,适合高频JSON处理场景。
-ldflags "-s -w"去除调试信息和符号表,减少二进制大小(约30%-50%)。示例:go build -ldflags="-s -w" -o myapp
-gcflags="-N -l"禁用内联和优化,便于调试。默认CentOS对单个进程的文件描述符限制较低(1024),需修改/etc/security/limits.conf:
* soft nofile 65536 # 软限制
* hard nofile 65536 # 硬限制
修改后重新登录生效,避免高并发时出现“too many open files”错误。
修改/etc/sysctl.conf优化网络和内存性能:
net.core.somaxconn = 65535 # 监听队列最大长度
net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列长度
net.ipv4.ip_local_port_range = 1024 65535 # 本地端口范围
net.ipv4.tcp_tw_reuse = 1 # 复用TIME-WAIT连接
net.ipv4.tcp_fin_timeout = 30 # TIME-WAIT超时时间(秒)
net.ipv4.tcp_tw_recycle = 1 # 快速回收TIME-WAIT连接(注意:可能影响NAT环境)
执行sysctl -p使配置生效。
Go内置pprof工具,可分析CPU、内存、goroutine等性能瓶颈:
net/http/pprof包,启动性能分析服务:import _ "net/http/pprof"
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
go tool pprof分析:go tool pprof http://localhost:6060/debug/pprof/profile # CPU分析(默认30秒)
go tool pprof http://localhost:6060/debug/pprof/heap # 内存分析
go tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile
通过火焰图直观查看热点函数。通过go test -bench命令测试代码性能,比较优化前后的差异:
go test -bench=. -benchmem # 测试所有benchmark函数,显示内存分配情况
示例输出:
BenchmarkAdd-8 100000 12345 ns/op 2048 B/op 10 allocs/op
其中ns/op表示每操作耗时(纳秒),B/op表示每次操作分配的内存(字节),allocs/op表示分配次数。