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

Piy*_*sal 26 unix sockets erlang freebsd whatsapp

在Ubuntu上,可以打开的最大套接字数似乎受以下因素控制:

$ cat /proc/sys/net/ipv4/tcp_max_orphans
262144
Run Code Online (Sandbox Code Playgroud)

根据Rick Reed(来自WhatsApp)的一个演讲,这些人使用FreeBSD和ErLang在一台"单一服务器"上进行了200万次并发连接.我的理解是我们总是需要内核的一些支持.是的,看起来像FreeBSD调整了这个功能:

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

小智 26

如果你有足够的RAM,那么在linux上处理1M或更多连接并不困难.这些人使用常规的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
Run Code Online (Sandbox Code Playgroud)

他们还平衡了网络适配器的/ proc/irq /,并添加了一个调整,以便更好地使用大页面进行JVM工作:

sysctl -w vm.nr_hugepages=30720
Run Code Online (Sandbox Code Playgroud)

拥有两个57%的6核CPU,它们在2013年通过12M连接提供 1Gbps的服务.

但是你需要大量的RAM.上述测试是在具有96GB RAM的服务器上进行的,内核使用36GB的内存用于12M套接字的缓冲区.

要为具有类似设置的1M连接提供服务,您需要一台至少具有8GB RAM的服务器,其中3-4GB将仅用于套接字缓冲区.


I G*_*ERS 21

请注意,这里有三件事:

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

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

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

你好像只专注于1.