socket so_reuseport

简单说下SO_REUSEPORT的应用场景, 为什么会用他? 然而在讲解SO_REUSEPORT之前,需要先说下我们常用的网络模型。

在多核时代,一般主流的web服务器都使用 SO_REUSEADDR模式。 以下是比较典型的多进程/多线程服务器模型。


首先需要单线程/单进程listen一个端口上,然后由多个工作进程/线程去accept()在同一个服务器套接字上。

简单说就是,一个linten, 多个accept

性能瓶颈:

第一个性能瓶颈,单线程listener,在处理高速率海量连接时,一样会成为瓶颈

第二个性能瓶颈,多线程访问server socket锁竞争严重。

那么怎么解决? 这里先别扯什么分布式调度,集群xxx的 , 就拿单机来说问题。在Linux kernel 3.9带来了SO_REUSEPORT特性,她可以解决上面(单进程listen,多工作进程accept() )的问题.


多个listen.每个对应一个accept. 由内核去负载均衡将链接分不到具体的一个服务器socket上。

看图说话,对比SO_REUSADDR的模型,我想你应该看懂SO_REUSEPORT是个什么东西了。SO_REUSEPORT是支持多个进程或者线程绑定到同一端口,提高服务器程序的吞吐性能,具体来说解决了下面的几个问题:

          允许多个套接字 bind()/listen() 同一个TCP/UDP端口

          每一个线程/进程拥有自己的服务器套接字

          在服务器套接字上没有了锁的竞争,因为每个进程一个服务器套接字

          内核层面实现负载均衡

          安全层面,监听同一个端口的套接字只能位于同一个用户下


我这边用python做了一个关于pythonSO_REUSEPORT服务端测试.  测试之前,已经要确定你的linux内核版本是3.9, 在mac下进行so_reuseport测试,貌似不会提示端口被绑定,但是后启动的进程会阻塞.

file:pythonreuseport.py


nohup   pythonreuseport.py&

nohup   pythonreuseport.py&

nohup   pythonreuseport.py&

nohup   pythonreuseport.py&

nohup   pythonreuseport.py&


有些文章说,在python下多进程绑定同一个端口,也就是有人常说的prefork,他其实也是单个进程去listen监听端口,剩余的worker去accept获取用户请求而已.  如果想用python实现真正的多进程绑定在多一个端口,那只能是用so_reuseport模式 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《UNIX 网络编程卷一:套接字联网API》笔记 套接字 套接字编程接口,是在 TCP/IP 协议族中,应用层进入...
    超net阅读 11,127评论 2 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,797评论 19 139
  • 最近在看《UNIX网络编程 卷1》和《FREEBSD操作系统设计与实现》这两本书,我重点关注了TCP协议相关的内容...
    腩啵兔子阅读 4,955评论 0 7
  • 什么是Nginx? Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器N...
    jiangmo阅读 7,338评论 1 9
  • 家附近新开了一个小书屋,女儿有一天进去之后,非常喜欢。最初吸引她的是一些立体书的,其他的书屋和儿童图书馆里面不常见...
    青青草儿阅读 3,805评论 0 0