高并发服务器注意事项


对于高并发(1万+连接)的服务器,以下是 完整的优化 checklist,涵盖 系统层、网络层、应用层 的关键配置:


1. 系统资源限制

1.1 文件描述符(FD)

# 用户级别(修改 /etc/security/limits.conf)
* soft nofile 100000
* hard nofile 100000

# 系统级别(修改 /etc/sysctl.conf)
fs.file-max = 1000000
  • 验证ulimit -ncat /proc/sys/fs/file-max

1.2 进程/线程数

# 用户级别(limits.conf)
* soft nproc 60000
* hard nproc 60000

# 系统级别(sysctl.conf)
kernel.pid_max = 200000

2. 网络层优化

2.1 TCP 队列

# SYN 队列(半连接)
net.ipv4.tcp_max_syn_backlog = 65536

# Accept 队列(全连接)
net.core.somaxconn = 65536

# 快速回收 TIME_WAIT(避免端口耗尽)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
  • 验证netstat -s | grep -i "listen"(检查 SYNs dropped)。

2.2 端口范围

# 扩大客户端端口范围
net.ipv4.ip_local_port_range = 1024 65535

2.3 连接跟踪(Conntrack)

# 增大连接跟踪表(防丢包)
net.netfilter.nf_conntrack_max = 1000000
net.netfilter.nf_conntrack_buckets = 65536

3. 服务器应用层优化

3.1 Go 代码关键配置

// 监听时显式设置 Backlog(必须 >= somaxconn)
ln, err := net.Listen("tcp", ":20007")
if tcpLn, ok := ln.(*net.TCPListener); ok {
    tcpLn.SetDeadline(time.Now().Add(10 * time.Second)) // 避免阻塞
}

// 使用多 Goroutine Accept(CPU 核心数 × 2)
for i := 0; i < runtime.NumCPU() * 2; i++ {
    go acceptConnections(ln)
}

// 连接复用(HTTP 客户端)
var transport = &http.Transport{
    MaxIdleConns:        10000,
    MaxIdleConnsPerHost: 10000,
    IdleConnTimeout:     90 * time.Second,
}

3.2 避免阻塞操作

  • I/O 操作:使用非阻塞或异步模式(如 epoll/kqueue)。
  • 日志/DB:异步写入或批量提交。

4. 客户端优化

4.1 控制并发量

sem := make(chan struct{}, 10000) // 限制并发量
for i := 0; i < 100000; i++ {
    sem <- struct{}{}
    go func() {
        defer func() { <-sem }()
        conn, err := net.Dial("tcp", "server:20007")
        // 处理错误和重试...
    }()
}

4.2 连接复用

  • HTTP:使用 http.Client 连接池。
  • TCP:实现自定义连接池(如 sync.Pool)。

5. 监控与排查工具

5.1 实时监控

# 查看连接状态
ss -s
netstat -ant | awk '{print $6}' | sort | uniq -c

# 查看 FD 使用
lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | head

# 抓包分析
tcpdump -i any port 20007 -nn -vv -w dump.pcap

5.2 压测工具

# 使用 wrk/ab 测试
wrk -t16 -c10000 -d30s http://server:20007

# 检查服务器资源
htop
dstat -tcmnd

6. 高级优化(可选)

  • 内核调优
    # 减少 TCP 延迟
    net.ipv4.tcp_low_latency = 1
    
    # 禁用 Nagle 算法(低延迟场景)
    net.ipv4.tcp_nodelay = 1
    
  • 多机负载均衡:使用 Nginx/HAProxy 分散连接。
  • SO_REUSEPORT:允许多进程监听同一端口(Linux 3.9+)。

总结流程图

高并发服务器优化步骤:
1. 调整系统限制(FD/进程数) → `limits.conf` + `sysctl.conf`
2. 优化 TCP 队列 → `somaxconn` + `tcp_max_syn_backlog`
3. 服务器代码优化 → 多 Goroutine Accept + 非阻塞 I/O
4. 客户端控制 → 限流 + 连接复用
5. 监控 → `ss`/`netstat` + 抓包

按此 checklist 逐步调整后,你的服务器应能稳定支撑 1万+ 并发连接。如果仍有问题,优先检查 SYN 丢弃Accept 队列溢出 的日志!

posted @ 2025-04-07 14:53  guanyubo  阅读(72)  评论(0)    收藏  举报