SO_REUSEPORT正解

最关键的就是多线程负载均衡,多个套接字可以在同一端口上,多个线程可以在各自的套接字上接受自己的数据。

Linux 3.9 加入了 SO_REUSEPORT 选项,可以提高 UDP 和 TCP server 的伸缩性,Linux 4.5/4.6 分别进一步改进了 UDP 和 TCP 的 SO_REUSEPORT 实现。本文以 UDP 的实现为例来讲解,TCP 与之类似。

UDP 协议的主要数据结构是两张 hash 表,指向 UDP 协议控制块 struct sock。其中 hash 以 port 为 key,hash2 以 IP+port 为 key。

link 查看udp_table数据结构

/*** struct udp_table - UDP table**  @hash: hash table, sockets are hashed on (local port)* @hash2:    hash table, sockets are hashed on (local port, local address)*  @mask: number of slots in hash tables, minus 1*    @log:  log2(number of slots in hash table)*/
struct udp_table {struct udp_hslot  *hash;struct udp_hslot  *hash2;unsigned int     mask;unsigned int       log;
};

link 查看udp_hslot数据结构

struct udp_hslot {struct hlist_head  head;int            count;spinlock_t        lock;
} __attribute__((aligned(2 * sizeof(long)));

link 查看sock_common,包括用于hash的skc_portaddr_node和skc_node。以及用于reuseport管理的sk_reuseport_cb。

在收到 UDP datagram 之后,从 hash 表中找到对应的 sock,代码位于 net/ipv4/udp.c : __udp4_lib_lookup,再把 datagram 放到 sock 的接收队列中。

link 查看__udp4_lib_lookup代码,发现调用了udp4_lib_lookup2,而udp4_lib_lookup2又调用了lookup_reuseport,后者调用了reuseport_select_sock。可看代码link

link 查看sock_reuseport数据结构,这里看到最后有个柔性数组,就很自然是管理一堆在reuseport上的sock

在启用 SO_REUSEPORT 之后,相同 port 的 sock 会加入同一个 struct sock_reuseport 对象,由它的socks管理。在收到 UDP datagram 之后,先找到任何一个 udp_sock,再找到对应的 sock_reuseport(也就是以在这个为准),然后根据地址四元组的哈希值来选择由哪个 sock 处理。

代码见reuseport_select_sock

以及reuseport_select_sock_by_hash

如果有 N 个 udp_sock,来自于多个客户端的 UDP datagram 会被均匀地分配给这些 sock 处理,同一个客户端的数据总是分配给同一个 sock。我们在写 UDP server 的时候,为了提高处理能力,可以起多个线程,每个线程读写自己的 UDP socket,这样比多个线程读写同一个 UDP socket 要少很多 contention。(值得一提的是,通过 dup(2) 复制 UDP socket 达不到 SO_REUSEPORT 的效果,因为这些 fd 会指向同一个 udp_sock,不会减少 contention。)

下面是一个邮件

commit e32ea7e747271a0abcd37e265005e97cc81d9df5
Author: Craig Gallek <kraig@google.com>
Date:   Mon Jan 4 17:41:46 2016 -0500soreuseport: fast reuseport UDP socket selectionInclude a struct sock_reuseport instance when a UDP socket binds toa specific address for the first time with the reuseport flag set.When selecting a socket for an incoming UDP packet, use the informationavailable in sock_reuseport if present.This required adding an additional field to the UDP source addressequality function to differentiate between exact and wildcard matches.The d matches when checking forexisting port uses during bind.  The new use case of adding a socketto a reuseport group requires exact address matching.Performance test (using a machine with 2 CPU sockets and a total of48 cores):  Create reuseport groups of varying size.  Use one socketfrom this group per user thread (pinning each thread to a differentcore) calling recvmmsg in a tight loop.  Record number of messagesreceived per second while saturating a 10G link.10 sockets: 18% increase (~2.8M -> 3.3M pkts/s)20 sockets: 14% increase (~2.9M -> 3.3M pkts/s)40 sockets: 13% increase (~3.0M -> 3.4M pkts/s)This work is based off a similar implementation written byYing Cai <ycai@google.com> for implementing policy-based reuseportselection.Signed-off-by: Craig Gallek <kraig@google.com>Signed-off-by: David S. Miller <davem@davemloft.net>

SO_REUSEPORT正解相关推荐

  1. P1401 城市(30分,正解网络流)

    题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...

  2. pythonsocket中tcp通信接收不到数据_TCP 为什么三次握手而不是两次握手(正解版)...

    先说结论 为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的. 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已 ...

  3. 射灯安装方法图解_家居射灯怎么选?第三代宜美SMD射灯给你正解

    前段时间,刚把自己的房子完成硬装,在灯具选择的过程中,家人的意见就不太统一.其父母觉得选灯只要够亮就行,而媳妇觉得选灯选贵的才行.到底谁的选灯方法好呢?其实家人们的建议并不是完全不对,灯够亮只是其中一 ...

  4. HDU 6625 three arrays 求两个序列异或最小值的排列(一个可以推广的正解

    目录 题意: 解析 原题描述 @(hdu 6625求两个序列异或最小值的排列) 题意: \(T(100)\)组,每组两个长度为\(n(100000)\)的排列,你可以将\(a[]\)和\(b[]\)随 ...

  5. 从《我要投资》,看藏在“对立面”里的创业正解

    文|智能相对论 作者|青月 六位07届的快乐男声选手在象山体验养鹅,意外出圈:随后播出的09届超女的怀旧综艺却热度一般,可见只有单纯的情怀消费并不能保证节目的口碑,只有建立在准确的节目定位与恰当的价值 ...

  6. 六轴机器人运动学正解

    关于机器人运动学正解网上和机器人相关书籍上都是通过建立连杆坐标系和DH参数推导出来的,推导过程比较繁琐,本人不是从事机器人专业,我在推导机器人运动学正解的时候还不知道有DH参数一说,我的算法原理是运用 ...

  7. 6轴机器人运动学(正解)

    理论部分 概念 运动学正解,简而言之,就是给出6个关节变量,求得机械臂末端的位置和姿态 即给出j1−j6j_1 - j_6j1​−j6​,求x,y,z,rx,ry,rzx,y,z,rx,ry,rzx, ...

  8. 后台启动elastisearch-head,避免后台启动es head在关闭shell后es head自动关闭,网上一大堆错误的,这个是正解,来自互联网

    后台启动elastisearch-head命令:grunt server & ps:正解,不是grunt server &exit,而是先执行grunt server &,然后 ...

  9. 【错解】【附正解】“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛 - E 赛马

    错解: for _ in range(int(input())):n = int(input())Ming = list(map(int, input().split()))oppo = list(m ...

最新文章

  1. C语言位操作--判断整数是否为2的幂
  2. python入门基础语发_Python基础入门-基础语法
  3. Oracle优化07-分析及动态采样-直方图
  4. 关于nsurlsession
  5. 局域网服务器没显示,无法登录服务器 局域网也不显示连接
  6. mongodb java 多条件查询_MongoDB_Java连接mongo 使用Java多条件查询mongo数据
  7. 第二届世界智能大会,看大咖眼中的智能时代
  8. 《Android游戏开发详解》一3.5 继承
  9. 本地Markdown编辑器推荐
  10. 关于transmission下载速度提升的小建议
  11. 数据库.数据库管理系统.数据库系统三者之间的关系
  12. [Google标准文档]如何做好代码评审
  13. xp系统禁用wmi服务器,windows xp系统启用WMI服务的方法
  14. Asis CTF 2016 b00ks
  15. 基于Html的个性化新闻资讯网页设计
  16. C++ 使用Poco库实现XML的读取和写入
  17. 检查xml写的格式是否正确的方法
  18. GSM Arena 魅族mx四核评测-个人翻译
  19. Office 2016 定制安装工具 v1.0 | Office 2016 自定义安装组件
  20. UVA 12576 Simply Loopy

热门文章

  1. Noxim仿真器介绍文档
  2. 对话刘鑫:建筑可视化“奥斯卡”学生组冠军如何玩转视觉艺术,探寻虚实边界
  3. 小度智能音响拆解 芯片_拆解报告:DOSS小度版智能音箱
  4. 正版推荐 - Fences 4 – 让你的桌面更加整洁与高效的桌面图标文件整理工具软件!
  5. ubuntu无法远程root远程登录(远程调试)root直接登录(root用户登录)(创建root用户,新建root用户)PermitRootLogin yes(prohibit-password)
  6. 【产品升级】Android手机微信删除数据深度恢复看这里
  7. 【基础】小 X 玩游戏(game)
  8. 《全球商业》杂志联合十大券商票选 蓝筹股领航银行保险占11席
  9. R语言Apriori算法实现例子
  10. 苹果发布iPhone 5c及iPhone 5s 廉价版5c不便宜