nginx 是怎么实现 tps>2000 的, 理论上这不可能呀

32 天前
 bthulu

短链接有 time_wait 时间, 最少 30 秒.

可用端口最多 65535.

那理论上短链接最大 TPS 只有 65535/30=2184, nginx 是用了啥魔法突破了 TCP 协议限制吗?

2398 次点击
所在节点    程序员
25 条回复
seedhk
32 天前
班门弄斧一下,有问题请指正:

"可用端口最多 65535."

1. 就像 1 楼 说的:
站在服务器接收数据的角度,一般都是指定某个端口,比如 80 端口用于接收请求。

可用端口数是站在客户端的角度来说的,因为客户端发起一个请求,除非绑定了端口,否则都是随机选择一个高位端口。


"那理论上短链接最大 TPS 只有 65535/30=2184"

2.TCP 通过四元组确定一个链接是否重用

源 IP 地址 (srcIp)
源端口号 (srcPort)
目的 IP 地址 (dstIp)
目的端口号 (dstPort)
对于服务器来说,dstIp 和 dstPort 是固定的,而 srcIp 和 srcPort 是可变的。

所以,在 IPV4 中,绝对理想的情况下(不考虑操作系统,内存大小,请求耗时,请求大小,time_wait 等)
一个服务端能接受的最大请求数应该是:

客户端 ip 数×客户端 port 数


#10
"nginx 不是服务端呀, nginx 是做反向代理, 是客户端"

nginx 作为反向代理接收数据时,这时候他就已经是“服务端”了,绑定了某个端口(比如 80)
seedhk
32 天前
接 #21

如果 你是按照 #18 的写法的话,那么讨论的问题其实是,客户端最多能同时向外发送多少个请求,从这个角度来说,你说的确实没错。

但是这和 nginx 有啥关系呢
ysc3839
31 天前
反向代理换成 Unix socket 就解决问题了
ysc3839
31 天前
@ysc3839 实在不能换,127.0.0.0/8 整个网段都能作为回环地址使用,换着用也能解决问题。
paceewang1
31 天前
你这个提问的方式有点问题,大部分兄弟都是没仔细看你的问题的😂,nginx 确实在某些反代的场景需要和后端建立 1 到 1 的多个单独长连接,比如说 ws ,tcp 等,这种情况下确实会出现端口耗尽的情况,解决的话可以在 nginx 上绑定虚拟 ip+端口。

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

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

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

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

© 2021 V2EX