CentOS默认的文件描述符限制较低,无法满足高并发场景需求。需修改/etc/security/limits.conf
文件,添加以下内容:
* soft nofile 65536
* hard nofile 65536
执行ulimit -n 65535
使配置立即生效。
编辑/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超时时间(秒)
vm.swappiness = 10 # 减少内存交换(值越小越优先使用物理内存)
执行sysctl -p
使配置生效。
GOMAXPROCS
控制Go程序使用的CPU核心数,默认值为CPU核心数。可通过以下方式设置:
export GOMAXPROCS=$(nproc)
(nproc
命令获取CPU核心数);main()
函数中添加runtime.GOMAXPROCS(runtime.NumCPU())
。GC是Go的性能瓶颈之一,可通过GOGC
环境变量调整触发频率(默认100%,即内存增长100%时触发GC):
export GOGC=75
(降低至75%,更频繁触发GC以减少内存占用);debug.SetGCPercent(75)
(动态调整GC阈值)。sync.Pool
复用对象:避免在循环中创建临时对象(如[]byte
、struct
),减少GC压力;slice = slice[:0]
清空后复用)、字符串拼接使用strings.Builder
。go func()
),可使用worker pool
模式控制并发数;sync.RWMutex
(读写锁)或无锁数据结构(如atomic
包),减少goroutine竞争。map
代替slice
做快速查找、sync.Map
用于高并发场景);O(n log n)
排序替代O(n²)
冒泡排序)。bufio
包包装os.File
或net.Conn
,减少系统调用次数;http.Transport
的连接池(MaxIdleConns
、IdleConnTimeout
参数)。使用-ldflags
去除调试信息,减小二进制文件大小:
go build -ldflags="-s -w" -o myapp
-s
:去除符号表;-w
:去除DWARF调试信息。关闭CGO(避免依赖动态库),生成纯静态二进制文件:
CGO_ENABLED=0 go build -a -installsuffix cgo -o myapp
适用于CentOS等Linux系统,无需安装额外依赖。
通过upx
工具进一步减小二进制文件大小(压缩率可达50%~70%):
sudo yum install upx # 安装upx
upx --best myapp # 最高压缩级别
注意:压缩会增加启动时间,适合对启动速度不敏感的场景。
import _ "net/http/pprof"
;go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
go tool pprof http://localhost:6060/debug/pprof/profile
(CPU分析)、http://localhost:6060/debug/pprof/heap
(内存分析)生成报告,找出热点函数。使用testing
包编写基准测试,对比优化前后的性能:
func BenchmarkMyFunction(b *testing.B) {
for i := 0; i < b.N; i++ {
MyFunction()
}
}
执行go test -bench=. -benchmem
查看结果(关注ns/op
、allocs/op
指标)。
INFO
而非DEBUG
),避免过多日志输出影响性能。