一个Linux机器可以有多少个打开的UDP或TCP/IP连接?

5

可用的内存,带宽、CPU和网络连接当然是存在限制的,但这些通常可以进行纵向扩展。除此之外,Linux 系统还有其他限制因素吗?是否可以在不修改内核的情况下克服这些限制?我猜想,即使没有其他限制,限制因素也将成为千兆以太网。但对于高效协议而言,需要 50K 并发连接才能使其超负荷运行。在达到这个数量之前,是否会出现其他问题?

我在考虑使用软件 UDP 和/或 TCP/IP 负载均衡器。不幸的是,在开源社区中似乎没有类似的负载均衡器,除了 HTTP 协议之外。但我有能力编写一个使用 epoll 的负载均衡器。我预计,需要做很多微调才能使其具有可扩展性,但这是可以逐步完成的工作,我会成为一个更好的程序员。

4个回答

4
您可能会遇到一些困难的参数是jitter。随着您扩展每个盒子的连接数,不可避免地会给所述系统的所有资源带来压力。因此,转发函数的jitter特性可能会受到影响。
根据您的目标要求,这可能是一个问题或不是问题:如果您计划主要支持弹性流量(不太容易受到jitter延迟的影响),那就没问题。如果不弹性流量的比例很高(例如交互式语音/视频),那么这可能更成为问题。
当然,在这种情况下,您总是可以过度设计;-)

你提到了一个很好的观点,即抖动和延迟对不弹性流量的影响(即特别是你会使用UDP的那种流量)。 - Eloff
4
谁给我的帖子点了踩,能解释一下吗?匿名点踩并不礼貌,请留言说明原因。 - jldupont
对于TCP,另一个问题是传入数据的数量。传入数据占用内核缓冲区,直到被用户进程处理。如果您的应用程序无法“足够快地”处理内存,则内核可能会耗尽缓冲区并出现紧急情况。可以通过在每个套接字上设置较小的Rx缓冲区大小来改善这种情况。 - Martin Del Vecchio
...而且小的Rx缓冲区大小反过来可能会导致"underrun"情况出现...但是,嘿,没有免费的午餐 :-) - jldupont

2
如果您打算拥有一个服务器,为每个客户端保持一个socket打开,则需要仔细设计,以便能够高效地检查来自10k+客户端的传入数据。这被称为10k问题。
现代Linux内核可以处理比10k更多的连接,通常至少是100k。您可能需要进行一些调整,特别是许多TCP超时(如果使用TCP),以避免关闭/过时的套接字占用大量资源,如果许多客户端频繁连接和断开连接。
如果您使用netfilter的conntrack模块,则可能还需要对其进行调整以跟踪那么多的连接(这与tcp / udp套接字无关)。
有很多负载均衡技术,其中最著名的是LVS(Linux虚拟服务器),它可以作为真实服务器集群的前端。我不知道它可以处理多少连接,但我认为我们在生产中使用它至少有50k个连接。

1
对于你的问题,你只受到硬件限制的约束。这是Linux系统的设计哲学。你所描述的正是你的限制因素。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接