Linux Socket性能优化需采用epoll、禁用Nagle算法、增大缓冲区、启用SO_REUSEPORT及sendfile零拷贝:一、epoll替代select/poll,设非阻塞模式并高效事件处理;二、setsockopt启用TCP_NODELAY降低延迟;三、调大SO_RCVBUF/SO_SNDBUF适配BDP;四、SO_REUSEPORT实现内核级负载均衡;五、sendfile()避免数据拷贝提升文件传输效率。

检查并切换为 epoll 非阻塞 I/O 模型
大量并发连接下,select/poll 的线性扫描开销会急剧上升,成为 CPU 和延迟瓶颈。
- 确认 socket 已设为非阻塞:调用 fcntl(sockfd, F_SETFL, O_NONBLOCK),避免 recv/send 阻塞线程
- 用 epoll_create1(0) 创建实例,注册监听 socket 和每个客户端 fd,事件类型设为 EPOLLIN | EPOLLET(边缘触发更高效)
- 循环调用 epoll_wait() 获取就绪 fd,只处理活跃连接,避免遍历全部描述符
- 注意:accept() 返回的新连接也必须立即设为非阻塞,否则可能卡住整个事件循环
禁用 Nagle 算法并启用快速 ACK
小包交互类应用(如 RPC、实时信令)中,Nagle 算法和延迟 ACK 会叠加引入 20–200ms 不等的额外延迟。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 连接建立后(connect() 成功或 accept() 返回后),设置 TCP_NODELAY = 1
- 对低延迟敏感场景,可额外启用 TCP_QUICKACK = 1(需内核 ≥ 4.1,且仅对当前 socket 生效)
- 避免在吞吐型场景(如文件传输)盲目开启 TCP_NODELAY,否则可能增加报文数量和路由器压力
按带宽延迟积(BDP)调大收发缓冲区
默认缓冲区(通常 128–256KB)在千兆网+10ms RTT 场景下仅能支撑约 1.2MB/s,远低于链路能力。
- 计算建议值:BDP = 带宽(bps) × RTT(s) × 2;例如 1Gbps + 10ms → ≈ 2.5MB
- 调用 setsockopt() 设置 SO_RCVBUF / SO_SNDBUF,值至少为 BDP 的 1.5–2 倍
- 同步调整内核上限:net.core.rmem_max 和 wmem_max 需 ≥ 应用设置值,否则会被截断
- 验证是否生效:用 getsockopt() 读回实际大小,或查 /proc/net/sockstat
启用 SO_REUSEPORT 与合理内核参数
单端口多进程负载不均、TIME_WAIT 积压、连接队列溢出,都会表现为“连接慢”“拒绝连接”“响应抖动”。
- 在 socket() 后、bind() 前设置 SO_REUSEPORT = 1,让内核直接分发新连接到空闲 worker,消除惊群
- 增大连接队列:调高 net.core.somaxconn(如 65535)和应用 listen() 的 backlog 参数
- 缓解 TIME_WAIT 压力:启用 net.ipv4.tcp_tw_reuse = 1(仅客户端有效),慎用 tcp_tw_recycle(已废弃)
- 必要时启用 BBR 拥塞控制:echo bbr > /proc/sys/net/ipv4/tcp_congestion_control


















