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

Posted

技术标签:

【中文标题】WhatsApp 是如何实现每台服务器 200 万个连接的?【英文标题】:How did WhatsApp achieve 2 million connections per server? 【发布时间】:2014-04-01 03:56:16 【问题描述】:

在 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

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

谢谢。

【问题讨论】:

区别在于 FreeBSD 与 Linux。 ErLang 没有重写内核中的 TCP 堆栈。 @KenCheung:那么 FreeBSD 比 Linux 更强大?为什么我们不能在 Linux 中做同样的事情? 见highscalability.com/blog/2014/2/26/… @PiyushKansal 关于 BSD 与 Linux 有一句老话:“当一群 UNIX 黑客坐下来尝试将 UNIX 系统移植到 PC 上时,你会得到 BSD。Linux 就是你当一群 PC 黑客坐下来尝试为 PC 编写 UNIX 系统时,你就会明白。” @Agis 它仍然没有完全回答我的问题。 【参考方案1】:

如果你有足够的内存,在 linux 上处理 1M 或更多的连接并不难。 These guys 使用常规 CentOS 内核和一些 sysctl 调整在单个机器上处理了与 Java 应用程序的 1000 万个连接:

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

两个 6 核 CPU 负载 57%,它们在 2013 年 served 1Gbps 超过 12M 连接。

但是您需要大量的 RAM。上面的测试是在一个有 96GB RAM 的服务器上进行的,其中 36GB 被内核用于 12M 套接字的缓冲区。

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

【讨论】:

【参考方案2】:

注意这里有三件事:

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

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

    让多个内核对连接进行处理。这是必要的,因为要完成大量的工作。这也是您要避免锁定过多等等的点。

你似乎只专注于 1. 一个人。

【讨论】:

很想知道这是否可以实现(即每台服务器 200 万个连接)以及如何在 Windows 服务器上实现?

以上是关于WhatsApp 是如何实现每台服务器 200 万个连接的?的主要内容,如果未能解决你的问题,请参考以下文章

实现 ios 聊天(如whatsapp):websocket?

一家年入不过 200 万美元的公司,成功向苹果索赔 5.028 亿美元

如何使用 Swift 从 iOS 应用程序共享音频/图像到 whatsapp

如何实现SHELL:用SSH批量登陆到其他服务器,每台服务器登陆密码不同

如何在网站中实现whatsapp分享按钮[重复]

阿里云服务器是如何实现每台服务器都是公网IP的呢?