Nginx这个冷门参数,半数运维都不知道,却能降低26%的延迟
|
admin
2026年7月18日 23:24
本文热度 28
|
Nginx有这么一个参数,能让请求延迟降低26%甚至更多,而要做的仅仅是加一行listen配置。我们都知道,TCP请求的逻辑是先握手,握手成功后再传输数据。但是,你是否有观察过握手时间在整个请求时间中占比是多少呢?从结果可以看出,握手耗时23ms,占了整个请求耗时的一半时间。其实原理很简单,Nginx中开启fastopen,这个参数表示可以在握手阶段传输数据,即在SYN包中携带数据,握手和传输并行,从而降低整体延迟。重载服务后通过抓包验证是否开启成功,观察是否出现tfo标志位,如有则说明开启成功。其中,fastopen=512中的512是TFO专用连接队列的长度,独立于传统的SYN队列和Accept队列。普通的tcp请求必须走完SYN队列,Accept队列才能被Nginx处理。而TFO连接在SYN包到达时数据已经存在,内核需要立即为这个连接分配资源,这个资源就是TFO队列。例如,峰值5000连接/秒,平均处理50ms,那么对接就为250,保守一点可提升1-2倍。从结果可以看出,开启TFO后,请求时间(time for request) 从 4.2ms 降至 3.1ms,降幅达到了26%,延迟大幅度降低。从单个请求对比也能看出明显的延迟降低,握手时间从23ms降低到了8ms。这还没算上高并发下连接复用带来的叠加延迟降低。压测数据中 26% 只是平均延迟的降低幅度,如果放在公网环境单次请求带来的延迟降低会更多。TFO携带数据在握手完成前就被应用层处理,可能加剧SYN Flood攻击。需要同步做一些安全感防护。比如:配合 syn_cookie 保护(Linux默认启用)。监控 TcpExtTCPFastOpenPassiveFail 指标变化情况等。
阅读原文:点击这里
该文章在 2026/7/18 23:24:24 编辑过