SO_REUSEPORT选项

SO_REUSEPORT选项[1]

概述

SO_REUSEPOR这个socket选项可以让你将多个socket绑定在同一个监听端口,然后让内核给你自动做负载均衡,将请求平均地让多个线程进行处理。

安全性考虑

  1. 第一个进程必须enable了这个选项之后,后续的进程才可以通过enable这个选项将socket绑定到同一个端口上。
  2. 绑定到同一个端口的进程的effective user id必须一致。

上述规定是为了避免hijacking:恶意用户通过监听相同的端口来获取用户信息。

在没有SO_REUSEPORT的年代

在SO_REUSEPORT没有出现之前,多线程编程一般有两种获取到来的请求。

  1. 指派一条线程专门进行accept,获取socket后分派给worker线程。这种方法使得进行accept的线程成为了单点,容易成为性能的瓶颈。
  2. 多个线程同时进行accept。这种方法的问题是每一个线程accept成功的概率不均匀,导致负载不均衡。

SO_REUSEPORT的负载均衡算法

使用(remote_ip, remote_port, local_ip, local_port)来进行哈希,因此可以保证同一个client的包可以路由到同一个进程。但是,当一个listen的进程加进来或者terminate的时候,由于没有实现一致性哈希,结果可能导致有些请求由于路由到另外一个进程上,client-server的三次握手过程可能会被重置。


  1. 本文内容主要来自https://lwn.net/Articles/542629/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,107评论 19 139
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,833评论 24 1,002
  • 什么是Nginx? Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器N...
    jiangmo阅读 2,596评论 1 9
  • 小时候,经常看一个动画片叫《快乐的阿凡提》,故事主要是讲机智勇敢善良的阿凡提跟财主巴依老爷斗智斗勇,帮助穷人兄...
    白喵呜阅读 357评论 0 0
  • 在小程序上线之前,互联网圈子对小程序的期望非常之高,仿佛错过这一波,就错过了一场饕餮大宴。 老话说得好:理想是丰满...
    宣炳刚阅读 339评论 0 1