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