专栏名称: 奥斯特洛司机
朝闻道,夕死矣。为中产而奋斗的小编
相关文章推荐
Python爱好者社区  ·  11w*14薪,进DeepSeek了! ·  昨天  
Python爱好者社区  ·  蔚来汽车裁员约10%,20分钟完成裁员。。。 ·  2 天前  
Python爱好者社区  ·  154W,我入局了! ·  2 天前  
Python爱好者社区  ·  无人报考!顶尖大学,校区关停 ·  4 天前  
Python爱好者社区  ·  多模态,杀疯了! ·  4 天前  
51好读  ›  专栏  ›  奥斯特洛司机

惊群的解决办法

奥斯特洛司机  · 简书  ·  · 2019-04-18 15:22

正文

(1)、加锁
(2)、SO_REUSEPORT

Linux内核的3.9版本带来了SO_REUSEPORT特性,该特性支持多个进程或者线程绑定到同一端口,提高服务器程序的性能,允许多个套接字bind()以及listen()同一个TCP或UDP端口,并且在内核层面实现负载均衡。

在未开启SO_REUSEPORT的时候,由一个监听socket将新接收的连接请求交给各个工作者处理,看图示:


image.png

在使用SO_REUSEPORT后,多个进程可以同时监听同一个IP:端口,然后由内核决定将新链接发送给哪个进程,显然会降低每个工人接收新链接时锁竞争


image.png

下面让我们好好比较一下多进程(线程)服务器编程传统方法和使用SO_REUSEPORT的区别
运行在Linux系统上的网络应用程序,为了利用多核的优势,一般使用以下典型的多进程(多线程)服务器模型:

1.单线程listener/accept,多个工作线程接受任务分发,虽然CPU工作负载不再成为问题,但是仍然存在问题:

   (1)、单线程listener(图一),在处理高速率海量连接的时候,一样会成为瓶颈

    (2)、cpu缓存行丢失套接字结构现象严重。

2.所有工作线程都accept()在同一个服务器套接字上呢?一样存在问题:







请到「今天看啥」查看全文


推荐文章
Python爱好者社区  ·  11w*14薪,进DeepSeek了!
昨天
Python爱好者社区  ·  蔚来汽车裁员约10%,20分钟完成裁员。。。
2 天前
Python爱好者社区  ·  154W,我入局了!
2 天前
Python爱好者社区  ·  无人报考!顶尖大学,校区关停
4 天前
Python爱好者社区  ·  多模态,杀疯了!
4 天前
摄影笔记  ·  人像拍摄必须知道的7个基本点
8 年前
健康时尚百科  ·  和小女友同居后,治好了我多年的病
8 年前
中国美术学院  ·  预告|来中国美术学院图书馆看敦煌
7 年前