文章简介: 本文是我在《F5 NGINX Sprint 2022》大会分享的文字版整理。《NGINX网络协议栈优化》有两个关键词,第一个是网络协议,因此不涉及 NGINX 的业务模块。第二个关键词是性能优化,目标是让NGINX的性能达到目前硬件架构的极限。
很高兴大家回到这次深潜之旅,让我们继续挖掘 NGINX 的潜力。今天我的分享包括四个部分。首先从整体上来看一下 NGINX的协议栈如何进行优化。接着我们将按照 OSI七层网络模型,自上而下依次讨论HTTP协议栈、TLS/SSL协议栈以及TCP/IP协议栈。
首先要明确NGINX的优化方向。优化的目标在我看来可以用三个词表示——快、多、省。
- “快”是指降低请求的时延,请求时延是用户能够感知到的最明显因素。
- “多”指的是 NGINX正在处理的所有TCP连接数量以及收发的总字节数,比如总吞吐量能否打满网卡。
- “省”指处理一个 TCP 连接时所消耗的资源要尽量的少,这样我们的并发连接才能够达到千万、亿级别。
在做协议栈优化时,我们必须同时兼顾知识深度和广度。开发习惯从实现的角度看问题,知识面倾向深度。而运维更关注服务部署、运行,比如要了解IDC地理位置、网络规划、服务器硬件配置等情况,因此知识面是倾向广度的。NGINX运行在 Linux 或者 FreeBSD 等操作系统上,操作系统的内核协议栈和进程调度机制都会影响 NGINX 性能,所以优化内核参数时相对更需要深度。了解 NGINX 所在网络环境,针对丢包率、网卡特性、CPU特性、交换机和防火墙的规格、协议特性等要素优化 NGINX 时,相对又会偏重广度。
NGINX 协议栈优化方法论
首先我们看下面两张图,先同步下思路。
NGINX架构
第一张图由 NGINX 官方提供,我们从三个层面来解读它。