[ 典型场景 ]

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

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

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

  1. Master: bind -> listen -> fork {
  2.   // Child
  3.   install signal
  4.   select loop
  5.   accept connection
  6.   event callback
  7. } -> monitor

[ 存在缺陷 ]

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

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

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

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

[ 解决方式 ]

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

  1. Master: fork {
  2. // Child
  3. install signal
  4. bind
  5. listen
  6. select loop
  7. accept connection
  8. event callback
  9. } -> monitor

[ 框架应用 ]

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

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

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

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

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

  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. Tencent研发工程师笔试知识点

      一: 32位编译器:32位系统下指针占用4字节       char :1个字节       char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节.同 ...

  2. Lintcode245 Subtree solution 题解

    [题目描述] You have two every large binary trees:T1, with millions of nodes, and T2, with hundreds of no ...

  3. Log4Net五部曲

    本文主要讲述如何构建封装一个日志工具类,以及在该过程中遇到的问题, 关于Log4Net的介绍,就不详细赘述了,更多详细的技术可参考http://www.cnblogs.com/kissazi2/p/3 ...

  4. Unity中List的随机排序(乱序)

    为什么要给List排序做一个Unity限定条件呢 首先,是C#中的List泛型,若是Java,直接调用Collection.shuffle()就OK了 而Unity的C#版本较低,不能使用Random ...

  5. python 全栈开发,Day5

    python之函数初识 一.什么是函数? 现在有这么个情况:python中的len方法不让用了,你怎么办? 来测试一下'hello word' 的长度: 用for循环实现 s1 = "hel ...

  6. NGUI_Depth

    四.深度(Depth)概念; 1. (1).每一个UIPanel和每一个UI控件都一定会有一个Depth,深度值大代表显示的优先级高(会趋向于在界面更上层显示) (2).Depth决定的是UI的显示层 ...

  7. Python的几个小程序,其实我觉得可以称作初学时的基础算法

    昨天学习的,今天做一下整理,以前学过几天c,感觉什么都没有搞出来,有点泄气,看到Python后试试,从最基本的东西学起,希望不要辜负我的这一点热情. if语句的应用 n=1 while n<5: ...

  8. oracle 常用sql字符函数介绍

    常用字符函数介绍 1.ascii 返回与指定的字符对应的十进制数: SQL>select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') ...

  9. node 基础精简

    Node 创建node应用 引入require模块   var http = require("http"); 创建服务器   http.createServer() 绑定端口: ...

  10. 发布利用 Qt Assistant来做帮助系统的程序遇到的问题

    最近,一直在做反演初始模型可视化建模的软件 model Constraint,最后的步骤就是利用 Qt Assistant为自己的程序制作帮助系统. 1.<Qt Creator快速入门>和 ...