erlang WhatsApp是如何实现每台服务器200万个连接的?

cmssoen2  于 2022-12-16  发布在  Erlang
关注(0)|答案(2)|浏览(178)

在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

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

2skhul33

2skhul331#

如果您有足够的RAM,在Linux上处理1 M或更多的连接并不太难。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/'s,并添加了一个调整,以便更好地处理JVM的大型页面:

sysctl -w vm.nr_hugepages=30720

2013年,由于两个6核CPU的负载达到57%,他们在1200万个连接上实现了1 e1f1x 1Gbps。
但是你需要大量的RAM来做这件事。上面的测试是在一个96 GB RAM的服务器上进行的,其中36 GB被内核用于12 M套接字的缓冲区。
要使用类似的设置服务1 M连接,您需要一个至少8 GB RAM的服务器,其中3-4GB将仅用于套接字缓冲区。

kcrjzv8t

kcrjzv8t2#

注意这里有三件事:
1.让服务器支持200万个连接。这通常只是调整内核,使其允许同时连接的数量,并使与每个连接相关的上下文适合(有线)主内存。后者意味着你不能为每个连接分配兆字节的缓冲空间。
1.对每个连接做一些事情。你在一个进程中把它们Map到用户空间(在这个例子中是Erlang)。现在,如果每个连接在用户空间级别分配了太多的数据,我们又回到了原点。我们做不到。
1.让多个核心处理连接。这是必要的,因为要完成的工作量很大。这也是你想要避免锁定太多等等的地方。
你好像只专注于1.

相关问题