Skip to content

Day 6:单二进制部署+压测——Go的性能有多猛

今天做什么

编译部署 + 压测。看看 Go 的分析引擎到底能扛多少并发。

编译

bash
# 编译成单一二进制
go build -ldflags="-s -w" -o doc-analyzer

# 文件大小
ls -lh doc-analyzer
# -rwxr-xr-x  12M  doc-analyzer

# 放进 Docker(Dockerfile 只有3行)
cat > Dockerfile << 'EOF'
FROM scratch
COPY doc-analyzer /doc-analyzer
ENTRYPOINT ["/doc-analyzer"]
EOF

docker build -t doc-analyzer .
# 镜像大小:约 12MB

压测

go
// 内置压测工具
func (s *AnalyzerServer) runBenchmark() {
    ctx := context.Background()
    doc := generateLargeDoc() // 1万字文档

    // 串行基准
    start := time.Now()
    for i := 0; i < 10; i++ {
        s.analyzer.chain.Analyze(ctx, doc)
    }
    serialTime := time.Since(start)

    // 并发基准(50个并发)
    start = time.Now()
    g, ctx := errgroup.WithContext(ctx)
    for i := 0; i < 50; i++ {
        g.Go(func() error {
            _, err := s.analyzer.chain.Analyze(ctx, doc)
            return err
        })
    }
    g.Wait()
    parallelTime := time.Since(start)

    fmt.Printf("串行 10份:%v(单份 %v\n", 
        serialTime, serialTime/10)
    fmt.Printf("并发 50份:%v\n", parallelTime)
    fmt.Printf("加速比:%.1fx\n", 
        float64(serialTime)/float64(parallelTime)*5) // 50/10 = 5 倍工作量
}

性能报告

bash
./doc-analyzer --benchmark

# 典型输出(MacBook Pro M1):
# 串行 10份:3.2s(单份 320ms)
# 并发 50份:1.8s
# 加速比:8.9x
# 内存峰值:86MB

和 Python 版的对比

指标Python (FastAPI)Go (net/http + gRPC)
内存占用280MB86MB
镜像大小350MB12MB
50并发耗时8.2s (asyncio)1.8s (goroutine)
部署步骤venv + pip + uvicorn一个二进制

项目复盘

6 天,从文件解析到生产级 gRPC 服务:

Day做了什么Go 亮点
1文档解析 Pipelineos.ReadFile + 分段切割
2Eino Chain 链式处理compose.NewChain + Lambda
3goroutine 并发 50 份errgroup + 信号量限流
4MD5 缓存sync.Map 并发安全缓存
5gRPC 服务化protoc → 多语言客户端
6编译部署 + 压测12MB 镜像,8.9x 加速比

项目二完成。Go 做文档分析:更快、更小、更容易部署。