CentOS默认的文件描述符限制(nofile)较低,无法满足高并发场景需求。需修改/etc/security/limits.conf文件,添加以下内容:
* soft nofile 65536(软限制,用户可临时调整至更高值)
* hard nofile 65536(硬限制,系统最大允许值)。
修改后需重新登录或执行ulimit -n 65536使设置生效。
通过优化TCP/IP和进程调度参数,提升网络和进程处理能力。编辑/etc/sysctl.conf文件,添加/修改以下参数:
net.core.somaxconn = 65535(监听队列最大长度,避免连接被拒绝);net.ipv4.tcp_max_syn_backlog = 65535(SYN队列长度,提升TCP连接建立效率);net.ipv4.ip_local_port_range = 1024 65535(本地端口范围,支持更多并发连接);net.ipv4.tcp_tw_reuse = 1(允许复用TIME_WAIT状态的连接,减少资源占用);net.ipv4.tcp_fin_timeout = 30(TIME_WAIT状态超时时间,加快连接回收)。sysctl -p使配置生效。GOMAXPROCS控制Golang程序使用的CPU核心数,默认值为runtime.NumCPU()(自动匹配CPU核心数)。可通过以下方式调整:
export GOMAXPROCS=8(根据实际CPU核心数设置,如8核服务器);main()函数中添加runtime.GOMAXPROCS(runtime.NumCPU())(适用于需要动态调整的场景)。GC是Golang的核心机制,不当设置会导致CPU占用过高或内存泄漏。通过GOGC环境变量调整GC触发频率(默认100%,即堆内存增长100%时触发):
GOGC值(如export GOGC=75):增加GC频率,减少内存占用(适用于内存敏感型应用);GOGC值(如export GOGC=200):减少GC频率,提升性能(适用于内存充足的应用)。debug.SetGCPercent(75)动态设置。频繁的内存分配会增加GC压力,需通过以下方式复用对象:
var pool = sync.Pool{
New: func() interface{} { return make([]byte, 1024) },
}
buf := pool.Get().([]byte)
defer pool.Put(buf)
for i := 0; i < n; i++ { s := fmt.Sprintf("...") }改为预分配切片或复用字符串。channel控制并发数量(如使用worker pool模式),避免过多goroutine导致调度开销(如runtime.NumGoroutine()监控goroutine数量);atomic包)或减小锁粒度(如将大锁拆分为小锁)。bufio包包装文件、网络流(如bufio.NewReader(conn)),减少系统调用次数;sql.DB的SetMaxOpenConns、resty库的连接池)复用连接,避免频繁建立/关闭连接。使用-ldflags参数去除调试信息和符号表,减小二进制文件大小(提升启动速度和加载效率):
go build -ldflags="-s -w" -o myapp(-s去除符号表,-w去除调试信息)。
关闭CGO(CGO_ENABLED=0),生成纯静态二进制文件,避免依赖系统动态库(提升跨平台兼容性和运行效率):
CGO_ENABLED=0 go build -a -installsuffix cgo -o myapp(-a强制重新编译,-installsuffix cgo避免与动态库冲突)。
通过upx工具进一步压缩二进制文件(减少磁盘占用和启动时间):
sudo yum install upx;upx --best myapp(--best表示最高压缩率,可能增加少量启动时间)。Golang内置pprof工具,可分析CPU、内存、阻塞等性能问题:
_ "net/http/pprof",并启动HTTP服务:go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
go tool pprof http://localhost:6060/debug/pprof/profile(CPU分析,30秒采样)或go tool pprof http://localhost:6060/debug/pprof/heap(内存分析)生成报告,查看热点函数。使用testing包编写基准测试(BenchmarkXXX函数),对比不同优化方案的性能:
func BenchmarkMyFunction(b *testing.B) {
for i := 0; i < b.N; i++ {
MyFunction()
}
}
执行go test -bench=. -benchmem查看每次操作的耗时和内存分配情况。
prometheus/client_golang库暴露指标);INFO而非DEBUG),避免过多日志输出影响性能(如使用zap等高性能日志库)。