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(n2)
冒泡排序)。bufio
包包裝os.File
或net.Conn
,減少系統調用次數;http.Transport
的連接池(MaxIdleConns
、IdleConnTimeout
參數)。使用-ldflags
去除調試信息,減小二進制文件大?。?/p>
go build -ldflags="-s -w" -o myapp
-s
:去除符號表;-w
:去除DWARF調試信息。關閉CGO(避免依賴動態庫),生成純靜態二進制文件:
CGO_ENABLED=0 go build -a -installsuffix cgo -o myapp
適用于CentOS等Linux系統,無需安裝額外依賴。
通過upx
工具進一步減小二進制文件大?。▔嚎s率可達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
),避免過多日志輸出影響性能。