TCP 转发 Nginx VS iptables 哪个稳?

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

没有负载均衡的需求

7491 次点击
所在节点    NGINX
43 条回复
markgor
2022-05-16 17:31:06 +08:00
我更喜欢 iptable
稳定性的话 nginx 和 iptable 都差不到哪里,
性能的话我不清楚,毕竟我转发机公网带宽只有 5M 。
gxm44
2022-05-16 17:32:55 +08:00
感觉 iptables 更好些
ryd994
2022-05-16 17:40:11 +08:00
一个是 3 层,一个是 4 层,根本不是一回事
3 层的性能可能比 4 层差,但有专有硬件时可能比 4 层好。但是说回来大多数人应该接触不到这个级别的带宽。

4 层会处理好 TCP 超时和重传( terminate connection ),对于延迟高、不稳定的网络来说能提速。简单假设就是延迟和丢包率都减半,那 TCP 的流控自然会稳定很多。
heiher
2022-05-16 17:40:16 +08:00
从转发节点内部来看,用户态转发比 iptables 肯定包括了更多的上下文切换以及可能更多的 copy 开销。用户态转发是两条 tcp stream ,且有缓冲; iptables 转发是 raw packet 转发;考虑到网络延迟及对流控的影响,转发节点内部开销不一定是决定性因素。
alexsunxl
2022-05-16 17:55:44 +08:00
Nginx 简单一点。性能差别不太清楚。
iptables 有些情况要打开内核参数(比如需要 source 要改内网这样的参数)
fisherwei
2022-05-16 17:59:13 +08:00
iptables 是指 PAT 吗?那肯定是 iptables 更稳定呀
ab
2022-05-16 18:03:53 +08:00
@ryd994 所以推荐 nginx ?
tdtdttdd
2022-05-16 18:18:58 +08:00
都稳,防火墙占资源更少
ryd994
2022-05-16 18:51:36 +08:00
@heiher 理论上是这么个情况,实际上恰恰相反
用户态收发 TCP 数据高度依赖硬件加速。tso/lro
而 3 层转发需要修改每一个数据包,还不能碰 payload 。所以 3 层包处理是个很费 CPU 的工作。

这也是为什么云平台的虚拟防火墙的性能上不去。高效能网络都是要靠硬件加速。把虚拟化网络相关的操作也下放到专有硬件上。

不靠 sriov ,不靠 dpdk ,一般操作系统的单线程包转发性能也就 10G-20G 最多了。用好 RSS 可以更多,但那成本就高了。而且对单个连接无效。

jumbo frame 也是个办法,但那也属于硬件支持了。

但是普通的 CPU 收发 40G ,100G ,其实都不是什么难事。因为操作系统此时收发的实际上是 65535 字节的超大包。网卡 tso 会拆分成 1500 的普通包发出。接收时也同理。
geeglo
2022-05-16 19:28:57 +08:00
@ryd994 你这理论明显站不住脚啊。

首先,传输层转发要拆包改 dst ip ,应用层转发也要拆包改,你说费 CPU 这事,用户态程序做的事情更多,CPU 反而能省下?

另外,您说的应用层优化问题就更奇怪了,应用层层最终也要丢到传输层去传输,TCP 超时机制,重传机制,什么时候是靠应用层去实现的?
geeglo
2022-05-16 19:36:25 +08:00
可以这么理解
有个快递要转运,你打电话给快递公司,他们帮你在中转站的时候就寄到你要的地址去。iptables 做的事情。

nginx 类似于快递员到你楼下了,然后你再通知他转运。
heiher
2022-05-16 19:48:24 +08:00
@geeglo
@ryd994

我理解当有网卡加速来处理 tcp stream 与 iptables 处理 raw packet 的区别,借用快递类似的话,接收:raw packet 是能一次运送(DMA)很多个 packet ,且每个 packet 都带有收发人地址,快递员到达时按一下门铃(中断)让接收人( CPU )处理,CPU 需要修改每个 packet 上的收发人地址。而 tcp stream 的话,网卡收到若干个 raw packet ,将同一个 tcp stream 的 packet 在网卡上合并成一个较大的 packet ,大 packet 只带有一个收发人地址(因为同 stream 都相同),通知 CPU 处理,CPU 只需改一次收发人地址即可。在内核态、用户态交互上,只要 buffer 不大小,上下文切换的次数也是比较少的。
geeglo
2022-05-16 20:03:15 +08:00
@heiher
还是有点区别的。
合并、拆小 这些动作你也说了在网卡的 hardware offload 阶段,同 buff 大小的情况下,内核态也是只改一次。

只要包到了应用层,肯定是要有其他动作的,相应的优化技术比如 0 拷贝等也存在消耗。

其实我感觉,无论是内核优化,还是应用层优化,各路大神已经转移重心了,在往着专用硬件,专用芯片的方向,比如 fpga 。
heiher
2022-05-16 20:10:28 +08:00
@geeglo iptables 可以过滤到 tcp 流中每一个具体的 packet 的转发与否,所以可推测这种情况下在与网卡的交互上没有启用相关的硬件加速技术。记得之前在有些光猫上使用 iptables 实现某些操作还需要关闭硬件加速,否则根本走不到 iptables 的路径上。

具体情况具体对待吧,利用好硬件加速会更香。
geeglo
2022-05-16 20:13:46 +08:00
@heiher 哦,你这么一说,我得去看看文档,感谢。
heiher
2022-05-16 20:23:11 +08:00
@geeglo 有结论来分享一下哈,把推测证实或证伪,细节具体化,感谢~
haah
2022-05-16 21:24:27 +08:00
“稳”貌似是网络层的任务吧!与应用层貌似关系不大。
haah
2022-05-16 21:25:04 +08:00
要是内网,UDP 也稳呀!
among
2022-05-16 21:31:26 +08:00
临时用用,nginx 挺好。
victorc
2022-05-16 22:09:51 +08:00
都很稳,如果不是特别需要考虑性能,用 nginx ,方便调试

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

https://www.v2ex.com/t/853232

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

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

© 2021 V2EX