多less个套接字可能?
有没有人知道现代标准根服务器上有多less个tcp-socket连接是可能的? (每个连接通常都有较less的stream量,但是所有连接必须始终保持运行状态。)
编辑:我们将使用Linux服务器。
谷歌周围的“C10K”问题。 这基本上是围绕pipe理10,000个或更多同时连接的讨论和技术。
我怀疑这个数字是被选中的,因为这很难,但理论上是可能的。
我在一个Linux桌面(16G RAM,I7 2600 CPU)上实现了1600k并发空闲套接字连接,同时达到了57k req / s。 这是一个单线程http服务器用C编写的epoll。 源代码在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个字节。
这不仅取决于所讨论的操作系统,还取决于configuration,可能的实时configuration。
对于Linux:
cat /proc/sys/fs/file-max
将显示允许同时打开的文件描述符总数的当前最大数量。 看看http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html
万? 70000? 这就是全部 :)
FreeBSD可能是你想要的服务器,下面是一个关于调整它来处理100,000个连接的小博客文章 ,它已经有了一些有趣的function,比如零拷贝套接字,以及kqueue作为完成端口机制。
Solaris可以在上个世纪处理10万个连接 ! 他们说linux会更好
我遇到的最好的描述是关于编写一个可扩展的networking服务器的演示文稿/文件。 他不害怕这样说:)
软件也一样:应用程序层上的cretins迫使OS层有很大的创新。 由于Lotus Notes每个客户端都保持一个TCP连接,所以IBM为Linux的“一个进程,100.000开放连接”案例做出了重大的优化
O(1)调度程序最初创build的是在一些不相关的Java基准上得分较高。 底线是这个膨胀对我们所有人都有好处。
在Linux上,您应该使用epoll作为asynchronousI / O。 可能还需要微调套接字缓冲区,以避免每个连接浪费太多的内核空间。
我想你应该能够在合理的机器上达到10万个连接。
取决于应用程序。 如果每个客户端只有几个软件包,那么对于Linux来说,100K非常容易。 我的团队的一名工程师几年前就做了一个testing,结果表明:当连接build立后没有客户端软件包的时候,linux epoll在cpu使用率下可以看到400k fd,不到50%。
哪个操作系统?
对于windows计算机,如果要编写一个服务器来进行扩展,因此使用I / O完成端口和asynchronousI / O,则主要的限制是您为每个活动连接使用的非分页池的数量。 这可以直接根据您计算机安装的内存量(非分页池是基于安装的内存总量的固定大小的有限数量)进行限制。
对于没有看到太多stream量的连接,您可以通过发布不使用非分页池的“零字节读取”来降低它们的效率,也不会影响locking的页面限制(另一个可能会阻止您的潜在有限资源有大量的套接字连接打开)。
除此之外,你需要进行configuration文件,但是我已经设法在适度指定的(760MB内存)服务器上获得了超过70,000个并发连接。 有关更多详细信息,请参阅http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html 。
很明显,如果你使用的是一个效率较低的架构,比如“每个连接线程”或者“select”,那么你应该期望得到不太令人印象深刻的数字。 但是,恕我直言,没有理由select这种架构的Windows套接字服务器。
编辑:看到这里http://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx ; 在Vista和Server 2008中计算非页面缓冲池数量的方式已经改变,现在有更多可用的。
在/ proc文件系统中可以configuration对打开的套接字数量的限制
cat /proc/sys/fs/file-max
操作系统中的传入连接的最大值由整数限制定义。
Linux本身允许数十亿的开放式套接字。
要使用套接字,您需要侦听应用程序,例如Web服务器,并且每个套接字使用一定数量的RAM。
RAM和CPU将引入真正的限制。 (现代2017年,千万不要数十亿)
1百万是可能的,不容易。 预计使用X千兆字节的RAM来pipe理100万套接字。
传出的 TCP连接受限于每个IP约65000个端口号。 您可以有多个IP地址,但不能有无限的IP地址。 这是TCP而不是Linux的限制。
实际上,对于一个应用程序来说,单台机器上超过4000-5000个开放式套接字变得不切实际。 只要检查所有套接字上的活动并对其进行pipe理,就会成为性能问题,特别是在实时环境中。