TCP 转发 Nginx VS iptables 哪个稳?

2022-05-16 17:23:30 +08:00
 ab

没有负载均衡的需求

8388 次点击
所在节点    NGINX
43 条回复
ryd994
2022-05-21 14:00:55 +08:00
@FabricPath
@tkl
@heiher
找到了这封邮件: https://www.spinics.net/lists/netdev/msg107539.html
可见 LRO 在特定情况下是有性能优势的,也可见 iptables 无法使用 LRO 。
但是我忽略了 GRO 的影响。有 GRO 的情况下,LRO 的“边际收益”并不大,更不用说内存拷贝的开销了。
所以 iptables 更快是对的。但原因并不是 iptables 更简单所以一定更快这么简单。

昨天上班时和 Stephen Hemminger 聊了一下这个问题,结论如下:
1. 如果网络不稳定,带宽不太高,那 nginx 等 L4 代理能改善 timing 和 congestion control ,throughput 会更好一点。
2. 这封邮件说的情况可能存在,但肯定是个非常少见的 corner case 。支持 LRO 的设备本来就少,Linux 社区也倾向于废弃 LRO 改用 GRO 。
3. 所以如果是比较干净的网络,那还是用 iptables 更快。
4. 如果想要 nginx 的灵活性,但又想要 iptables 的性能,可以考虑 BPF/XDP 。
FabricPath
2022-05-22 20:19:03 +08:00
@ryd994 在 L4LB 场景下,如果能测出 nginx 能比 ipvs 更快,我也想学习一下这到底是什么样的条件和场景,无论是 latency 还是 throughput
ryd994
2022-05-23 01:45:08 +08:00
@FabricPath 如果耍赖,不给用 GRO ,那就有可能。
nginx 可以用 LRO ,iptables 不行。也不一定是 Nginx ,可以是其他能更好利用 0 copy/1 copy 的用户态软件。

用 iptables 实现的是 L3 代理。L3 代理受到 end-to-end 限制,而 L4 代理不受。如果能在内核态实现 L4 代理或者允许 L3 代理放宽 end-to-end 限制,那当然可能得到更高的性能。

上面的邮件就是有人忽略限制硬开 LRO ,获得了比 GRO 更好的性能。
但是这个案例能否在用户态重现,那就很难讲了。因为 Linux 在 socket 到 socket 的情况下,并没有 0 copy API ,splice 也用不了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/853232

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX