可能有多少个套接字连接?


77

有谁知道一个现代标准根服务器上可以有多少个tcp-socket连接?(通常,每个连接上的流量都较少,但是所有连接都必须一直处于打开状态。)

编辑:我们将使用Linux服务器。


1
对于Windows,请参阅以下问题[Windows并发tcp / ip连接的最大数量是多少?] [1] [1]:stackoverflow.com/questions/413110/…–
lsalamon

Answers:


86

我实现了1600k并发空闲套接字连接,同时在Linux桌面(16G RAM,I7 2600 CPU)上达到了57k req / s。这是一个用epoll用C编写的单线程http服务器。源代码是在github上,一个在此博客

编辑:

我使用JAVA / Clojure在同一台计算机上完成了600k并发HTTP连接(客户端和服务器)。详细信息,HN讨论:http : //news.ycombinator.com/item?id=5127251

连接费用(使用epoll):

  • 应用程序每个连接需要一些RAM
  • TCP缓冲区2 * 4k〜10k或更多
  • epoll需要一些内存来存储文件描述符,来自epoll(7)

每个注册文件描述符在32位内核上大约花费90个字节,在64位内核上大约花费160个字节。


2
哈哈哈... 1000万连接数 highscalability.com/blog/2013/5/13/…–
Lothar

5
@Bangash我的评论与Erlang毫无关系,或者除了leef在一个盒子上发表有关100万个套接字连接的评论外,其他任何事情都没关系,但是这个答案讲的是160万个-因此似乎有点愚蠢的评论。Erlang很棒-支持CouchDB。但是,我在这里看不到您的评论有何意义。
wallacer

23

这不仅取决于所讨论的操作系统,还取决于配置(可能是实时配置)。

对于Linux:

cat /proc/sys/fs/file-max

将显示当前允许同时打开的文件描述符总数的最大值。查看http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html


1
刚刚检查了我的ubuntu(13.04)笔记本电脑...386491。我怀疑这将是我遇到的第一个限制。
格里

在我的Debian不稳定计算机上(内核4.19.0-1-amd64):18444647007370955115 ;;)
Per Lundberg,

8

10,000?7万?这就是全部 :)

FreeBSD可能是您想要的服务器,这是一篇有关对其进行调整以处理100,000个连接的小博客文章,它具有一些有趣的功能,例如一段时间以来零复制套接字,以及用作完成端口机制的kqueue。

Solaris可以在上个世纪处理100,000个连接!他们说Linux会更好

我遇到的最好的描述是关于编写可伸缩Web服务器的演示文稿/论文。他不怕这样说:)

对于软件也是如此:应用程序层上的“ cretin”迫使OS层上进行了巨大的创新。由于Lotus Notes保持每个客户端打开一个TCP连接,因此IBM为Linux的“一个进程,100.000个打开的连接”案例做出了重大的优化。

最初创建O(1)调度程序是为了在一些不相关的Java基准测试中获得良好的评分。最重要的是,这种膨胀使我们所有人受益。


2
我止步于70,000,因为这超出了客户的要求。因此测试已通过。通过改变非页面缓冲池限制的计算方式,我可以想象Windows Server 2008计算机在100,000个连接上不会有问题。
Len Holgate

您可以共享您引用的演示文稿的链接吗?
布莱恩·克莱恩

1
@BrianCline您可能不再需要它了,但是我也想要它,我想我找到了它:slideshare.net/Arbow/scalable-networking(slide 33)
Piyin

6

在/ proc文件系统中可以配置打开套接字的数量限制

cat /proc/sys/fs/file-max

整数限制定义的操作系统中传入连接的最大值。

Linux本身允许数十亿个开放套接字。

要使用套接字,您需要侦听应用程序,例如Web服务器,并且每个套接字将使用一定数量的RAM。

RAM和CPU将引入实际限制。(现代,2017年,以百万计而不是数十亿美元)

一百万是可能的,并不容易。预计将使用X千兆字节的RAM管理100万个套接字。

每个IP的传出TCP连接受端口号〜65000限制。您可以有多个IP地址,但不能有无限个IP地址。这是TCP而非Linux的限制。


5

在Linux上,您应该考虑使用epoll进行异步I / O。微调套接字缓冲区,以免浪费每个连接太多的内核空间也是值得的。

我想您应该可以在合理的计算机上达到10万个连接。


3

取决于应用程序。如果每个客户端只有几个软件包,对于Linux来说100K非常容易。我的团队的工程师几年前进行了测试,结果表明:建立连接后,如果没有来自客户端的软件包,Linux epoll可以在40%以下的CPU使用率下监视400k fd的可用性。


1

哪个操作系统?

对于Windows计算机,如果要编写服务器以使其扩展良好,并因此使用I / O完成端口和异步I / O,则主要限制是用于每个活动连接的非页面缓冲池的数量。这将根据您的计算机已安装的内存量直接转换为限制(非页面缓冲池是基于已安装的总内存的有限的固定大小的内存)。

对于流量不多的连接,您可以通过发布“零字节读取”来减少连接的效率,这些读取不使用非页面缓冲的池且不影响锁定页面的限制(另一种可能受限制的资源可能会阻止您有大量的套接字连接打开)。

除此之外,您还需要进行概要分析,但是我设法在指定的(760MB内存)服务器上获得了超过70,000个并发连接。有关更多详细信息,请参见 http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html

显然,如果您使用的是效率较低的架构,例如“每个连接的线程”或“选择”,那么您应该期望获得的印象不那么令人印象深刻;但是,恕我直言,根本没有理由为Windows套接字服务器选择这种架构。

编辑:看这里http://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx ; Vista和Server 2008中非页面缓冲池数量的计算方式已发生变化,现在有更多可用的方法。


嗯 有趣。使用IOCP,在W2K上使用128mb的非页面缓冲池,我可以维持4,000个活动套接字(例如,同时进行流传输)。当这些套接字空闲时,我可以承受大约16,000。我猜您的套接字处于空闲状态和/或此零字节读取票证有所帮助。

定义有效。您正在另一台计算机上运行测试客户端吗?您正在使用某种形式的流控制来管理要发送的数据量吗?我的套接字正在回显消息,但是没有使用零字节读取。他们并没有全力以赴并尽可能快地传输数据。
Len Holgate

我以为您在Windows上只能获得65k的连接-您必须编辑tcpnumconnections注册表设置。(在XP上,它们在tcpip.sys中进一步限制了它,在bittorrent网站上对此进行了大量讨论)
gbjbaanb

2
我想你会感到困惑。tcpip.sys中的限制适用于半开连接,它可以限制您一次可以进行的并发连接数。MaxUserPort注册表项限制了客户端端口的数量,因此可以在其中设置的最大值将限制可以建立的OUTBOUND连接的数量。对可能的INBOUND连接数没有限制。
莱恩霍尔盖特

-12

实际上,对于一个应用程序来说,在一台机器上超过4000-5000个开放式插座变得不切实际。仅检查所有套接字上的活动并对其进行管理就开始成为性能问题,尤其是在实时环境中。


3
过于宽泛的陈述。实际上,这全都取决于您在应用程序层上的工作。在几乎所有情况下,这都是您的性能瓶颈。
2009年

实际上,有许多工作服务器远远超过了并发连接数。
罗恩侯爵
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.