WhatsApp如何在每台服务器上实现200万个连接?

时间:2014-02-28 08:47:07

标签: sockets unix erlang freebsd whatsapp

在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

所以,看起来像内核可以调整以支持这么多物理连接,假设我们有足够的内存,对吗?如果是,那么它看起来很简单,那么它的炒作是什么?或者我错过了什么?

感谢。

2 个答案:

答案 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)

请注意,这里有三件事:

  1. 让服务器支持200万个连接。这通常只是调整内核,以便允许同时连接的数量,并且使得与每个连接相关联的上下文适合(有线)主存储器。后者意味着您不能为每个连接分配一个兆字节缓冲区空间。

  2. 对每个连接执行某些操作。您将它们映射到进程中的用户空间(在本例中为Erlang)。现在,如果每个连接在用户空间级别分配太多数据,我们将回到原点。我们不能这样做。

  3. 让多个核心对连接做一些事情。由于需要完成大量工作,这是必要的。这也是你想要避免过多锁定的点等等。

  4. 你似乎只专注于1.