[ 典型场景 ]

典型的多进程服务器模型是这样的,主进程绑定ip,监听port,fork几个子进程,子进程安装信号处理器,随后轮询资源描述符检查是否可读可写;

子进程的轮询又涉及到 IO复用,accept连接,事件处理 系列操作。

以下用伪码表示这个过程:

Master: bind -> listen -> fork {
  // Child
  install signal
  select loop
  accept connection
  event callback
} -> monitor

[ 存在缺陷 ]

主进程监听port,存在惊群问题,客户端连接请求到来时,所有子进程被唤醒,尝试接受连接,但只有一个连接成功,其余产生EAGAIN错误,并继续进入轮询。

通过 strace -p pid 可以看到空闲进程的执行过程:

$ select(, [], [], [], {, }) =  (Timeout)
$ select(, [], [], [], {, }) = (in [], left {, })
$ poll([{fd=, events=POLLIN|POLLERR|POLLHUP}], , ) = ([{fd=, revents=POLLIN}])
$ accept(, 0x7ffe34ffe390, 0x7ffe34ffe380) = - EAGAIN (Resource temporarily unavailable)
$ poll([{fd=, events=POLLIN|POLLERR|POLLHUP}], , ) = (Timeout)
$ select(, [], [], [], {, }) = (Timeout)

可想而知,当子进程数量较多时,进程调度(上下文切换)需要耗费的资源非常多。

[ 解决方式 ]

在PHP7,启用 socket 的 so_reuseport 选项之后,子进程就可以在每个端口上监听了,有连接时才被唤醒。
以下用伪码表示这个过程:

Master: fork {
// Child
install signal
bind
listen
select loop
accept connection
event callback
} -> monitor

[ 框架应用 ]

phvia/firmanhttps://github.com/phvia/firman/commit/bace0b2ffda915cc8cf5c73dc009d78a215637d3

Link:http://www.cnblogs.com/farwish/p/8747314.html

[phvia/firman] PHP多进程服务器模型中的惊群的更多相关文章

  1. [phpvia/via] PHP多进程服务器模型中的惊群

    [ 概述 ] 典型的多进程服务器模型是这样的,主进程绑定ip,监听port,fork几个子进程,子进程安装信号处理器,随后轮询资源描述符检查是否可读可写: 子进程的轮询又涉及到 IO复用,accept ...

  2. Nginx中的惊群现象解决方法

    *什么是惊群现象?Nginx中用了什么方法来避免这种问题的发生?本篇就解决这两个问题...→_→* 惊群现象的定义与危害 在Nginx中,每一个worker进程都是由master进程fork出来的.m ...

  3. Linux惊群效应详解

    Linux惊群效应详解(最详细的了吧)   linux惊群效应 详细的介绍什么是惊群,惊群在线程和进程中的具体表现,惊群的系统消耗和惊群的处理方法. 1.惊群效应是什么?        惊群效应也有人 ...

  4. “惊群”,看看nginx是怎么解决它的

    在说nginx前,先来看看什么是“惊群”?简单说来,多线程/多进程(linux下线程进程也没多大区别)等待同一个socket事件,当这个事件发生时,这些线程/进程被同时唤醒,就是惊群.可以想见,效率很 ...

  5. Linux网络编程“惊群”问题总结

    1.前言 我从事Linux系统下网络开发将近4年了,经常还是遇到一些问题,只是知其然而不知其所以然,有时候和其他人交流,搞得非常尴尬.如今计算机都是多核了,网络编程框架也逐步丰富多了,我所知道的有多进 ...

  6. epoll 惊群处理

    #include <sys/types.h> #include <sys/socket.h> #include <sys/epoll.h> #include < ...

  7. accept与epoll惊群 转载

    今天打开 OneNote,发现里面躺着一篇很久以前写的笔记,现在将它贴出来. 1. 什么叫惊群现象 首先,我们看看维基百科对惊群的定义: The thundering herd problem occ ...

  8. Nginx惊群处理

    惊群:是指在多线程/多进程中,当有一个客户端发生链接请求时,多线程/多进程都被唤醒,然后只仅仅有一个进程/线程处理成功,其他进程/线程还是回到睡眠状态,这种现象就是惊群. 惊群是经常发生现在serve ...

  9. 【转载】“惊群”,看看nginx是怎么解决它的

    原文:http://blog.csdn.net/russell_tao/article/details/7204260 在说nginx前,先来看看什么是“惊群”?简单说来,多线程/多进程(linux下 ...

随机推荐

  1. Spark访问Hive表

    知识点1:Spark访问HIVE上面的数据 配置注意点:. 1.拷贝mysql-connector-java-5.1.38-bin.jar等相关的jar包到你${spark_home}/lib中(sp ...

  2. Codeforces1076E. Vasya and a Tree(dfs+离线+动态维护前缀和)

    题目链接:传送门 题目: E. Vasya and a Tree time limit per test seconds memory limit per test megabytes input s ...

  3. list基本代码

    #include<iostream> #include<list> //STL之list的基本用法 using namespace std; void outputList(l ...

  4. 基于Spring-Cloud的微服务框架设计

    基于Spring-Cloud的微服务框架设计 先进行大的整体的框架整理,然后在针对每一项进行具体的详细介绍

  5. 【java编程】java中的移位运算符

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  6. 概念:dependency injection, IOC, vs callback

    callback function as a dependency of the object that it is being passed into. DI is the process of p ...

  7. Day 07 字符编码,文件操作

    今日内容 1.字符编码:人识别的语言与机器识别的语言转换的媒介 2.字符与字节:字符占多少字节,字符串转换 3.文件操作:操作硬盘的一块区域 字符编码 重点:什么是字符编码 人类能识别的字符等高级标识 ...

  8. Eclipse Java EE IDE for Web Developers集成的Maven 3 指向自己安装的 Maven

    一.配置Maven环境 1.下载apache-maven文件,选择自己需要的版本,地址:Apache 官方下载地址是http://maven.apache.org/download.cgi 2.下载并 ...

  9. C# 流总结

    前言 本篇文章简单总结了在C#编程中经常会用到的一些流.比如说FileStream.MemoryStream. BufferedStream. NetWorkStream. StreamReader/ ...

  10. freemarker语法介绍及其入门教程实例

    # freemarker语法介绍及其入门教程实例 # ## FreeMarker标签使用 #####一.FreeMarker模板文件主要有4个部分组成</br>####  1.文本,直接输 ...