Linux 网络性能的 15 个优化建议!
原文中文,约7000字,阅读约需17分钟。
📝
内容提要
减少网络IO操作、合并网络请求、部署在同一机房、减少内存拷贝、使用成熟的网络库
🔎
延伸解读
网络IO开销的本质与优化方向
文章指出,即使本地网络IO也涉及用户态与内核态切换、协议栈处理和软中断,跨机通信还增加DMA拷贝和网络往返延迟。因此,优化核心是减少不必要的网络操作,例如合并请求、使用长连接,并选择成熟网络库如Redis、Swoole来降低开销。
部署位置与内网调用的实际影响
将调用者与被调用机器部署在同一机房可大幅降低RTT,同机房延迟约零点几毫秒,跨地区则可能达30-40毫秒。内网调用应使用内网域名,避免外网请求带来的延迟、带宽成本和NAT单点瓶颈,从而提升稳定性和性能。
内核参数调优的关键点
调整网卡RingBuffer大小可应对瞬时丢包,但可能增加延迟。配置充足的端口范围、开启端口reuse和recycle能缓解端口不足和TIME_WAIT问题。同时需监控连接队列溢出,通过tcp_syncookies和调整backlog及somaxconn来避免握手丢包。
高级优化技术的适用场景
减少内存拷贝可使用mmap和sendfile,eBPF的sockmap和sk redirect能绕开协议栈提升本机IO性能。Kernel-Bypass技术如DPDK适合对网络要求极高的场景。这些方案需权衡复杂性和收益,并非所有服务都必需。
❓
Q&A
如何减少网络IO操作带来的开销?
尽量避免过多的网络IO操作,减少不必要的开销,尤其是在本地网络中。
合并网络请求有什么好处?
合并多次网络请求为一次可以节省CPU开销和降低延迟。
为什么要将调用者与被调用机器部署在同一机房?
这样可以减少网络延迟,降低跨机房通信的耗时。
如何优化内存拷贝以提高网络性能?
可以使用mmap和sendfile系统调用来减少内存拷贝。
使用成熟的网络库有什么优势?
成熟的网络库如Redis和Swoole可以提高网络IO效率,简化开发过程。
如何配置端口范围以避免性能问题?
应配置充足的端口范围,避免因端口不足导致的性能问题。
🏷️