确保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
表示分配次数。