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

2024-06-21

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

$ cat /proc/sys/net/ipv4/tcp_max_orphans
262144

根据 Rick Reed(来自 WhatsApp)的一次演示,这些人使用 FreeBSD 和 ErLang 在“单个服务器”上实现了高达 200 万个并发连接。我的理解是我们总是需要内核的一些支持。是的,看起来像是对 FreeBSD 进行了调整以实现此功能能力 http://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/:

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

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

Thanks.


如果你有足够的 RAM,在 Linux 上处理 1M 或更多的连接并不是太难。这些家伙 http://web.archive.org/web/20150905220053/https://mrotaru.wordpress.com/2015/05/20/how-migratorydata-solved-the-c10m-problem-10-million-concurrent-connections-on-a-single-commodity-server/使用常规 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

有两个 6 核 CPU,负载率为 57%served http://web.archive.org/web/20130701232157/https://mrotaru.wordpress.com/2013/06/20/12-million-concurrent-connections-with-migratorydata-websocket-server/2013 年超过 12M 连接达到 1Gbps。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WhatsApp 如何实现每台服务器 200 万个连接? 的相关文章

  • 最好的 Flash 音频/视频 + 交互服务器?

    我正在寻找有关 Flash 实时服务器的建议 目前 我们使用 Moock 的组合Unity http www moock org unity and Red5 http osflash org red5 但有几个问题 首先 我们正在转向 A
  • [A-Z] 表示 [A-Za-z] 是怎么回事?

    我已经注意到 至少在我使用的一些基于 Unix 的系统上 ls A Z 已经给了我预期的结果ls A Za z 让我无法轻松获得以大写字母开头的该死的文件列表 我刚刚遇到了同样的事情grep 我无法让它停止与小写字母匹配 A Z 直到我最终
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 来源和出口有什么区别?

    我正在编写一个 shell 脚本 以读取具有 key value 对的文件并将这些变量设置为环境变量 但我有疑问 如果我这样做source file txt是否会将该文件中定义的变量设置为环境变量 或者我应该逐行读取文件并使用导出命令设置它
  • 在Android中如何停止正在等待新套接字的线程

    我正在开发一个使用 Socket 连接到服务器的软件 connectionThread new Thread new Runnable public void run InetAddress serverAddress InetAddres
  • 如何检查特定目录的权限?

    我知道使用ls l directory directory filename 告诉我文件的权限 如何对目录执行相同的操作 我显然可以使用ls l在层次结构中较高的目录上 然后滚动直到找到它 但这太痛苦了 如果我使用ls l在实际目录中 它给
  • UNIX/Linux IPC:从管道读取。运行时如何知道数据长度?

    我有一个子进程 它生成一些可变长度的输出 然后使用半双工管道将其发送到父进程 在父级中 如何使用 read 函数 由于每次数据的长度可能不同 我如何在运行时知道数据的大小以对缓冲区执行任何 malloc 操作 fstat 函数可以用于管道文
  • 如何使用 HP-UX shell 脚本将简单的文本文件作为附件发送?

    我需要在 HP UX 中使用 shell 脚本发送一封带有文本文件作为附件的电子邮件 我没有安装mutt 我正在使用以下命令 但它在电子邮件正文中发送文件内容 我希望将其作为附件 mailx s Report email protected
  • C 中的字节顺序和套接字编程

    我正在制作一个使用 C 套接字与某些患者监视器进行通信的程序 我使用无连接套接字 UDP 与设备进行通信 但我的计算机和设备之间存在字节顺序不匹配 到目前为止 我这样做是为了从患者监视器获取解析响应 recvfrom int socket
  • Erlang:远程调用与发送消息

    我想在远程节点上执行一些过程 我不确定哪种方法是最好的方法 我可以写一个rpc call去做这个 或通过以下方式发送消息Remote call some procedure 到节点来启动程序并使用receive等待回复 那么erlang中哪
  • 如何在unix中对ls输出进行编号?

    我正在尝试编写一个格式为 id file absolute path 的文件 该文件基本上递归地列出文件夹中的所有文件 并为每个文件提供一个标识符 如 1 2 3 4 我可以使用以下命令递归地获取文件的绝对路径 ls d 1 PWD 但是
  • 如何使用应用程序跟踪 SMB 中的文件?

    我用 PHP 构建了一个应用程序 它显示用户主目录中的所有文件 该目录也可以通过 samba 访问 因此您可以从 Windows Mac 和 Linux 中的本机资源管理器访问它 我想给每个文件一个 ID 以便我可以为每个文件分配标签 你会
  • 如何在C中模拟套接字

    我有一个使用套接字的函数 我会模拟它 但我找不到如何做到这一点 有没有办法在 C 中模拟套接字 Thanks 大多数系统 库函数是弱符号 https en wikipedia org wiki Weak symbol 这意味着您可以创建自己
  • 在 Common Test 测试运行期间,Lager 调用失败

    我决定在我的 Erlang 项目中设置 lager 我正在使用 erlang mk 所以我添加了 ERLC OPTS parse transform lager transform 到我的 Makefile 我可以跑make all并编译模
  • 处理异步时 TcpClient 与 Socket

    这不是另一个 TcpClient 与 Socket 的较量 TcpClient 是 Socket 类的包装器 以简化开发 同时还公开了底层 Socket 仍然 在 TcpClient 类的 MSDN 库页面上 可以读到以下注释 TcpCli
  • 接受多个后续连接到套接字

    我有一个监听器 它将任意数据 HTTP 请求传递到网络套接字 然后通过 TCP 传递 这对于第一个请求工作正常 但侦听器不接受后续的新请求 我的问题是 如果我有sock accept listener struct addr sin sin
  • 如何在多行而不是单行输出上打印 Linux 组名称

    我尝试过 getent group 命令 id Gn user 和一些 sed 组合 但我认为我无法实现 因此向其他程序员伸出援手 我希望能够打印此 groups abc123输出 abc123 devops 构建测试设计 预期输出 gro
  • Bash:将输出传输到后台进程?

    我想将一个进程放入后台 然后多次将数据传递给它 例如 cat The command I want to write into cat pid Getting the process id of the cat process echo h
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • Microsoft SQL 数据库的 WebSocket 侦听器

    我目前正在开发一个项目 该项目必须使用 WebSockets 作为将数据传输到客户端的方式 基础设施看起来像这样 客户端 gt Web 服务器 gt Microsoft SQL 数据库 我想最理想的情况应该是这样的 客户端打开一个到服务器的

随机推荐

  • 编辑 scikit-learn 决策树

    我想编辑 sklearn DecisionTree 例如改变条件或切割节点 叶子等 但似乎没有功能可以做到这一点 如果我可以导出到文件 编辑它以导入 如何编辑决策树 环境 Windows 10 python3 3 sklearn 0 17
  • 如何知道点击的widget id?

    我已经实施了一个widget与ImageButton and a TextView That ImageButton启动一个activity当它被点击时 这activity使用用户在活动上写入的内容更新小部件文本EditText 现在的问题
  • 合并两个非常大的文件,忽略第一句

    我想将两个巨大的文件 每个几百兆字节 合并成一个文件 同时忽略第一行 我想使用 awk 因为我认为它应该是最优化的方式 我这样做的方式只忽略第二个文件的第一行 知道如何做工作或者是否有更快的方法 awk FNR NR FNR 1 next
  • 调用服务时Request.InputStream为空

    我正在开发 ASP NET 4 5 应用程序 并且遇到了一个非常烦人的问题 迁移到 VS2012 后我们遇到了同样的问题here https stackoverflow com questions 12391586 visual studi
  • KFold 和 ShuffleSplit CV 有什么区别?

    看起来 KFold 每次迭代对象时都会生成相同的值 而 Shuffle Split 每次都会生成不同的索引 它是否正确 如果是这样 其中一个相对于另一个有什么用处 cv cross validation KFold 10 n folds 2
  • Pthread 创建为分离的

    我在创建分离线程时遇到问题 这是我写的代码 void testFunction pthread attr t attr int chk rc pthread attr init attr printf thread attr init d
  • 如何在nodejs中模拟请求和响应来测试中间件/控制器?

    我的应用程序有几个层 中间件 控制器 管理器 控制器接口与中间件一相同 req res next 所以我的问题是 如何在不启动服务器并向本地主机发送 真实 请求的情况下测试我的控制器 我想要做的是像nodejs那样创建请求 响应实例 然后调
  • 如何根据按钮单击折叠和展开 Kendo UI 树视图中的所有树节点?

    这是行不通的 您可以使用此代码 1 崩溃 折叠kendoTree查看文档 http docs kendoui com api web treeview methods collapse treeview kendoTreeView var
  • 链接到 C++ 库时在 C 中使用 setjmp 和 longjmp

    我想在链接到用 C 实现的库 但具有 C API 的 C 程序中使用 setjmp 和 longjmp C 代码确实进行动态内存分配 并且指针通过 API 传递 但只要代码的 C 端正确管理这些 不透明 对象 使用 longjmp 时就不应
  • R - Quantstart:多种股票的测试策略

    我正在使用一些指标构建基本交易策略 我的问题是我希望它在多个股票上运行 而不必指定我想要测试的每个单独的股票 目前我可以使用向量一次获取多个符号 如下所示 Get Shares from Yahoo Finance Stocks lt AS
  • 使用DataContractSerializer进行序列化,但无法反序列化回来

    我有以下两个功能 public static string Serialize object obj DataContractSerializer serializer new DataContractSerializer obj GetT
  • 在 Android 10 中 getDeviceID 值为 null

    在 android 10 中 无法使用权 限 READ PHONE STATE 获取设备 ID 我在尝试获取 deviceID 时遇到错误 用户10296不符合访问设备标识符的要求 我参考了开发者网站 但无法得到正确的解决方案 另外 REA
  • Outlook VSTO 添加上下文菜单项

    我正在尝试将菜单项添加到附件上下文菜单 问题是该项目没有显示 我看过一些例子 他们说这段代码应该可以工作 this Application AttachmentContextMenuDisplay new ApplicationEvents
  • 如何使用 axios / jest 测试失败的请求

    我创建了一个非常小的应用程序 如果您传递硬币和数量 它可以计算为某些加密货币支付的总价格 我想测试错误 但我总是收到 收到的承诺已解决而不是被拒绝 我相信这是因为如果 url 错误 axios 仍然会解决承诺 我遇到的第二个问题是 我尝试测
  • 抽象类、构造函数和 Co

    嗯 我正在尝试重用 C 代码的一部分 它是一个带有UDP服务器的抽象类 可以在这里看到 http clutch inc com blog p 4 http clutch inc com blog p 4 我创建了一个像这样的派生类 publ
  • Java 的 System.arraycopy() 对于小数组有效吗?

    是Java的System arraycopy 对于小数组来说是高效的 或者它是本机方法这一事实是否使其可能比简单的循环和函数调用效率低得多 本机方法是否会因跨越某种 Java 系统桥梁而产生额外的性能开销 稍微扩展一下 Sid 所写的内容
  • 使用闭包和自调用函数制作计数器

    我想知道为什么这段代码不起作用 var uniqueInteger function var counter 0 return function return counter console log uniqueInteger 0 cons
  • 使用awk将列中的值替换为txt文件中的另一个值

    我是 Linux 和 awk 脚本编写的新手 我有 tab delim txt 文件 如下所示 AAA 134 145 Sat 150 167 AAA 156 167 Sat 150 167 AAA 175 187 Sat 150 167
  • 如何在 Common Lisp 中进行模式匹配

    我不知道 Common Lisp 是否存在模式匹配函数 但我必须制作自己的函数 我对Lisp一无所知 有人可以对学习 Lisp 以及最重要的是如何在 Lisp 中进行模式匹配进行提示吗 我必须传递一个模式和一个事实 并判断它们是否匹配 一个
  • WhatsApp 如何实现每台服务器 200 万个连接?

    在 Ubuntu 上 可以打开的最大套接字数似乎受以下控制 cat proc sys net ipv4 tcp max orphans 262144 根据 Rick Reed 来自 WhatsApp 的一次演示 这些人使用 FreeBSD