首页 > 系统相关 >Linux网络编程中的惊群问题

Linux网络编程中的惊群问题

时间:2023-05-24 20:23:35浏览次数:60  
标签:fork epoll 创建 编程 进程 事件 Linux 惊群

1.什么是惊群问题

​  如今网络编程中经常用到多进程或多线程模型,大概的思路是父进程创建socket,bind、listen后,通过fork创建多个子进程,每个子进程继承了父进程的socket,调用accpet开始监听等待网络连接。这个时候有多个进程同时等待网络的连接事件,当这个事件发生时,这些进程被同时唤醒,就是“惊群”。这样会导致什么问题呢?我们知道进程被唤醒,需要进行内核重新调度,这样每个进程同时去响应这一个事件,而最终只有一个进程能处理事件成功,其他的进程在处理该事件失败后重新休眠或其他。网络模型如下图所示:

img

简而言之,惊群现象(thundering herd)就是当多个进程和线程在同时阻塞等待同一个事件时,如果这个事件发生,会唤醒所有的进程,但最终只可能有一个进程/线程对该事件进行处理,其他进程/线程会在失败后重新休眠,这种性能浪费就是惊群。

2.epoll中的惊群问题

​ 在I/O多路复用中,我会使用select/poll/epoll来使内核代替我们来监听文件描述符,那这样会导致惊群问题吗?答案是肯定的。

​ 一般只有两种情况,要么先fork() 之后创建epoll实例,要么先先创建epoll实例,之后再fork()。

​ 第一种情况:先fork再创建epoll实例,这样每一个进程都有一个epollfd,而且所有的epollfd共享监听的文件描述符,这个时候如果出现listen socket,就必定会唤醒所有的进程,造成惊群现象。

​ 第二种情况:先创建epoll实例再fork,所有的进程会对一个epollfd进行操作,容易造成错误,此外还会有负载不均衡的问题

3.解决惊群问题

​ Nginx中使用mutex互斥锁解决这个问题,具体措施有使用全局互斥锁,每个子进程在epoll_wait()之前先去申请锁,申请到则继续处理,获取不到则等待,并设置了一个负载均衡的算法(当某一个子进程的任务量达到总设置量的7/8时,则不会再尝试去申请锁)来均衡各个进程的任务量。后面深入学习一下Nginx的惊群处理过程。

标签:fork,epoll,创建,编程,进程,事件,Linux,惊群
From: https://www.cnblogs.com/lihaoxiang/p/17429396.html

相关文章

  • Linux学习笔记
    Linux目录结构bin->usr/bin用于存放二进制命令boot内核及引导系统程序所在的目录  dev所有设备文件的目录(如磁盘、光驱等)etc配置文件默认路径、服务启动命令存放目录home用户家目录,root用户为/rootlib->usr/lib32位库文件存放目录lib64->usr/lib6464位库文......
  • 记录一下SOCKET编程
    记录一下基本的socket编程首先贴几段代码centos下的server代码#include<bits/stdc++.h>#include<unistd.h>#include<arpa/inet.h>#include<sys/socket.h>usingnamespacestd;intmain(){intserver,client;structsockaddr_inserverAddr,clientAddr......
  • 编程打卡:面向对象程序设计
    importjava.util.*;publicclassStaffManagementSystem{privatestaticList<Staff>staffList=newArrayList<>();publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);while(true){......
  • linux的程序打包deb
    deb安装包deb是Unix系统(其实主要是Linux)下的安装包,基于tar包,因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组。由于Unix类系统对权限、所有者、组的严格要求,而deb格式安装包又经常会涉及到系统比较底层的操作,所以权限等的设置尤其重要。deb组成查看deb包含哪些......
  • Rocky Linux 9.2修改网卡名为eth0且配置静态ip
    修改网卡ens18为eth0mv/etc/NetworkManager/system-connections/ens18.nmconnection/etc/NetworkManager/system-connections/eth0.nmconnectioncat/etc/default/grub在这一行GRUB_CMDLINE_LINUX结尾添加net.ifnames=0biosdevname=0grub2-mkconfig-o/boot/grub2/grub.cfg......
  • Linux下SSH远程连接断开后让程序继续运行解决办法
    简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。1.创建screenscreen执行指令后出现如下界面按Enter键即可退......
  • linux常用命令
    1.常见命令1.1alias命令别名对于较长的命令,可以将其定义成较短的别名aliasNAME='VALUE'unalias#删除别名-a#取消所有别名\alias#斜杠加别名可以还原同名命令如果想永久有效,要定义在配置文件中仅对当前用户:~/.bashrc对所有用户有效:/etc/bashrc注......
  • 【编程日记】搭建python开发环境
    0.相关确定0.1确定操作系统Python是一种跨平台的编程语言,这意味着它能够运行在所有主要的操作系统中。然而,在不同的操作系统(Windows/Mac/Linux)中,安装Python的方法存在细微的差别。本教程我们使用的是Windows系统,对于Mac和Linux暂时不做介绍0.2确定Python版本当前有两个不同的......
  • linux安装并启动nacos
    前提准备下载最新稳定版本,此处以nacos-server-2.1.0.tar.gz版本为例安装下载地址:https://github.com/alibaba/nacos/releases 二、具体步骤2.1下载完成后解压:tar-zxvfnacos-server-2.1.0.tar.gz2.2将解压文件移动到/usr/local目录下mvnacosnacos-2.1.0cd/usr/local/......
  • Linux-ln创建链接
    1.ln命令介绍ln命令可以看作是link的缩写,其功能是创建文件间的链接,链接类型包括硬链接(hardlink)和软链接(符号链接,symboliclink) 2.ln命令格式ln命令的基本格式如下:ln[选项]源文件目标文件选项:-s:建立软链接文件。如果不加"-s"选项,则建立硬链接文件;-f:强制。如果目......