在Ubuntu上,可以打开的最大套接字数似乎取决于以下内容:
$ cat /proc/sys/net/ipv4/tcp_max_orphans
262144
根据Rick Reed(来自WhatsApp)的一个演讲,这些人使用FreeBSD和ErLang在“单一服务器”上获得了200万个并发连接。我的理解是我们总是需要内核的一些支持。是的,看起来像FreeBSD调整了这个capability:
hw.machine: amd64
hw.model: Intel(R) Xeon(R) CPU X5675 @ 3.07GHz
hw.ncpu: 24
hw.physmem: 103062118400
hw.usermem: 100556451840
kb@c123$ uname -rps
FreeBSD 8.2-STABLE amd64
jkb@c123$ cat /boot/loader.conf.local
kern.ipc.maxsockets=2400000
kern.maxfiles=3000000
kern.maxfilesperproc=2700000
所以,看起来像内核可以调整以支持这么多物理连接,假设我们有足够的内存,对吗?如果是,那么它看起来很简单,那么它的炒作是什么?或者我错过了什么?
感谢。
答案 0 :(得分:24)
如果你有足够的内存,那么在Linux上处理1M或更多连接并不困难。 These guys使用常规CentOS内核和一些sysctl调整在一个盒子上处理了1000个与java应用程序的连接:
sysctl -w fs.file-max=12000500
sysctl -w fs.nr_open=20000500
ulimit -n 20000000
sysctl -w net.ipv4.tcp_mem='10000000 10000000 10000000'
sysctl -w net.ipv4.tcp_rmem='1024 4096 16384'
sysctl -w net.ipv4.tcp_wmem='1024 4096 16384'
sysctl -w net.core.rmem_max=16384
sysctl -w net.core.wmem_max=16384
他们还对网络适配器的/ proc / irq /&进行了平衡,并添加了一个调整,以便更好地使用大页面进行JVM工作:
sysctl -w vm.nr_hugepages=30720
2013年有两个6核CPU加载了57%,在12M连接上加载了served 1Gbps。
但是你需要大量的RAM。上面的测试是在一台内存为96GB的服务器上,内核使用了36GB内存用于12M插槽的缓冲区。
要为具有类似设置的1M连接提供服务,您需要一台至少具有8GB RAM的服务器,其中3-4GB将仅用于套接字缓冲区。
答案 1 :(得分:19)
请注意,这里有三件事:
让服务器支持200万个连接。这通常只是调整内核,以便允许同时连接的数量,并且使得与每个连接相关联的上下文适合(有线)主存储器。后者意味着您不能为每个连接分配一个兆字节缓冲区空间。
对每个连接执行某些操作。您将它们映射到进程中的用户空间(在本例中为Erlang)。现在,如果每个连接在用户空间级别分配太多数据,我们将回到原点。我们不能这样做。
让多个核心对连接做一些事情。由于需要完成大量工作,这是必要的。这也是你想要避免过多锁定的点等等。
你似乎只专注于1.