有谁知道一个现代标准根服务器上可以有多少个tcp-socket连接?(通常,每个连接上的流量都较少,但是所有连接都必须一直处于打开状态。)
编辑:我们将使用Linux服务器。
Answers:
我实现了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):
每个注册文件描述符在32位内核上大约花费90个字节,在64位内核上大约花费160个字节。
这不仅取决于所讨论的操作系统,还取决于配置(可能是实时配置)。
对于Linux:
cat /proc/sys/fs/file-max
将显示当前允许同时打开的文件描述符总数的最大值。查看http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html
10,000?7万?这就是全部 :)
FreeBSD可能是您想要的服务器,这是一篇有关对其进行调整以处理100,000个连接的小博客文章,它具有一些有趣的功能,例如一段时间以来零复制套接字,以及用作完成端口机制的kqueue。
Solaris可以在上个世纪处理100,000个连接!他们说Linux会更好
我遇到的最好的描述是关于编写可伸缩Web服务器的演示文稿/论文。他不怕这样说:)
对于软件也是如此:应用程序层上的“ cretin”迫使OS层上进行了巨大的创新。由于Lotus Notes保持每个客户端打开一个TCP连接,因此IBM为Linux的“一个进程,100.000个打开的连接”案例做出了重大的优化。
最初创建O(1)调度程序是为了在一些不相关的Java基准测试中获得良好的评分。最重要的是,这种膨胀使我们所有人受益。
哪个操作系统?
对于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中非页面缓冲池数量的计算方式已发生变化,现在有更多可用的方法。