可能有多少个插座连接?

时间:2009-03-16 18:44:52

标签: linux sockets tcp max server-hardware

有谁知道在现代标准根服务器上可以使用多少个tcp-socket连接? (每个连接的流量通常较少,但所有连接都必须一直在运行。)

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

9 个答案:

答案 0 :(得分:82)

我实现了1600k并发空闲套接字连接,同时在Linux桌面上实现了57k req / s(16G RAM,I7 2600 CPU)。它是用C语言编写的单线程http服务器。源代码位于githubblog here

编辑:

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

连接的费用(使用epoll):

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

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

答案 1 :(得分:22)

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

对于Linux:

cat /proc/sys/fs/file-max

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

答案 2 :(得分:8)

10,000? 70000?就是这一切:)

FreeBSD可能就是你想要的服务器,这里有little blog post关于调整处理100,000个连接的问题,它现在有一些有趣的功能,比如零拷贝套接字,还有kqueue作为完成港口机制。

Solaris can handle 100,000 connections早在上个世纪!他们说linux会更好

我遇到的最佳描述是关于编写可扩展的网络服务器的演示文稿/论文。他并不害怕这样说:)

  

软件相同:上面的cretins   应用层强行很大   OS层的创新。因为   Lotus Notes保持一个TCP连接   每个客户开放,IBM贡献主要   优化“一个过程,   100.000开放连接“案例到Linux

     

最初是O(1)调度程序   创造得好一些   不相关的Java基准测试。底部   这条线是这个膨胀的好处   我们。

答案 3 :(得分:5)

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

我猜你应该能够在合理的机器上达到100k连接。

答案 4 :(得分:5)

可以在/ proc文件系统

中配置打开套接字数量的限制
cat /proc/sys/fs/file-max

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

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

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

RAM和CPU将引入真正的限制。 (现代2017年,想想数百万而非数十亿)

100万是可能的,不容易。预计使用X千兆字节的RAM来管理100万个插槽。

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

答案 5 :(得分:3)

取决于应用程序。如果每个客户端只有几个软件包,那么100K很容易用于linux。我的团队的一名工程师在几年前做过测试,结果显示:当连接建立后没有来自客户端的软件包时,linux epoll可以在CPU使用率低于50%的情况下观看400k fd的可读性。

答案 6 :(得分: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中发生了变化,现在有更多可用。

答案 7 :(得分:-8)

谷歌周围的“C10K”问题。这基本上是围绕管理10,000个或更多同时连接的讨论和技术。

我怀疑这个数字被选中是因为它很难,但理论上可行。

答案 8 :(得分:-9)

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