CentOS上Golang性能优化方法
/etc/security/limits.conf
文件,添加* soft nofile 65536
和* hard nofile 65536
,提升单个进程可打开的文件描述符数量;或通过ulimit -n 65535
临时生效。/etc/sysctl.conf
,调整以下参数以提升网络和内存性能:net.core.somaxconn=65535
(增加TCP连接队列长度)、net.ipv4.tcp_max_syn_backlog=65535
(提升SYN请求队列容量)、net.ipv4.tcp_tw_reuse=1
(允许复用TIME_WAIT状态的连接)、vm.swappiness=10
(降低内存交换频率,减少磁盘I/O)。修改后执行sysctl -p
使配置生效。sync.Pool
复用对象(如数据库连接、缓冲区),避免在循环中创建临时对象;优先使用切片(slice
)而非数组,通过make([]T, 0, capacity)
预分配内存,防止动态扩容带来的多次分配。context.Context
或sync.WaitGroup
管理goroutine生命周期);使用带缓冲的channel(如ch := make(chan int, 100)
)减少阻塞,或通过信号量(如chan struct{}
)限制并发数量(如限制同时运行的goroutine不超过CPU核心数的2倍)。map
替代切片做快速查找),避免嵌套循环;根据场景选择高效的数据结构(如用bytes.Buffer
替代字符串拼接,减少内存分配);避免使用反射(reflect
包),反射会显著降低性能,必要时可用代码生成替代。-ldflags="-s -w"
去除调试信息和符号表,减小二进制文件大小(通常可减少30%~50%),提升启动速度;通过-gcflags="-N -l"
禁用编译器优化和内联(仅用于调试);启用并行编译(-p
参数,如go build -p $(nproc)
),利用多核CPU加速编译过程。GOMAXPROCS
为CPU核心数(export GOMAXPROCS=$(nproc)
),让Go运行时充分利用多核资源;调整GOGC
(垃圾回收触发阈值,默认100%,即堆内存增长100%时触发GC),可根据应用特点降低至50%~70%(减少GC频率)或提高至150%~200%(减少GC对应用的影响)。net/http/pprof
包开启性能分析接口(import _ "net/http/pprof"
),使用go tool pprof http://localhost:6060/debug/pprof/profile
分析CPU使用情况,go tool pprof http://localhost:6060/debug/pprof/heap
分析内存分配;生成火焰图(go tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile
),直观查看热点函数。go test -bench=. -benchmem
对关键函数或模块进行基准测试,对比优化前后的性能差异(如执行时间、内存分配次数),确保优化有效。INFO
级别,避免DEBUG
级别的过多日志输出),减少日志对性能的影响。io.Copy
替代手动读写),减少内核态与用户态的切换次数;批量处理IO操作(如批量写入数据库),降低系统调用开销。