文档章节

nginx源码分析-多进程socket的处理

t
 tickbh
发布于 04/16 16:39
字数 1048
阅读 514
收藏 5
点赞 1
评论 0
这篇文章主要分析的是linux及windows的socket处理,如何避免惊群及进程间负载均衡的探讨,
这里的惊群主要是指多进程对于新建的连接如何避免同时争用accept现象的处理。

进程的创建

  • linux

    进程创建的方式主要通过fork来创建出子进程

    // src/os/unix/ngx_process.c
    ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,
    char *name, ngx_int_t respawn) {
        ...
        pid = fork();
        ...
    }
    
  • windows

    进程创建的方式主要通过CreateProcess来创建出子进程,并且通过非继承的方式创建子进程(即子进程不共享父进程的文件句柄)。

    // src/os/win32/ngx_process.c
    ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx) {
        ...
        if (CreateProcess(ctx->path, ctx->args,
                      NULL, NULL, 0, //此变量为0表示句柄不继承
                      CREATE_NO_WINDOW, NULL, NULL, &si, &pi)
            == 0)
        {
            ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno,
                        "CreateProcess(\"%s\") failed", ngx_argv[0]);
            return 0;
        }
        ...
    }
    

ListenSocket的建立

  • linux

    由主进程先监听端口, 监听完后fork新的子进程共享父进程的socket句柄,所以在linux中,同个地址只会监听一次。在执行reload的时候会检查新的监听,或者挪除旧的监听(但如果是同一个端口的,假设127.0.0.1:80,改成0.0.0.0:80则无法生效),然后启动新的进程,同时向旧的进程发送退出状态,此时旧的进程不再接受新的连接。 启动三个linux进程, 但其中只有一个监听 (启动三个linux进程, 但其中只有一个监听)

  • windows

    由于不共享父进程的句柄,每个子进程都是相对独立的各体,每个进程都独立进行监听(采用的设置SO_REUSEADDR从而实现对同一个地址多次绑定的效果)。但在windows上实测,采用SO_REUSEADDR实现的监听同一个地址,只会在第一个进程能成功调用Accept函数,只有第一个进程被关闭后,第二个监听到才能成功Accept。 启动8个进程, 每个程序都重复监听了该端口 (启动8个进程, 每个程序都重复监听了该端口) 这是显示刚初始运行的情况 (这是显示刚初始运行的情况) 用ab测试进行的压力测试 (用ab测试进行的压力测试, 显示只有一个进程正在对外服务, 其实的都是空闲状态)

如何控制accept

  • linux

    主要通过共享锁,只有得到锁的进程才会进行尝试调用accept事件

    // src/event/ngx_event.c
    void
    ngx_process_events_and_timers(ngx_cycle_t *cycle)
    {
        //是否启用共享锁控制,linux默认启动
        if (ngx_use_accept_mutex) {
            //每次accept成功后都会重新赋该值,如果负载高,这值为正
            //从而减少负载高的进程得到锁的概率
            if (ngx_accept_disabled > 0) {
                ngx_accept_disabled--;
            } else {
                //尝试获取共享锁,该函数立即返回不等待
                //如果成功获取该锁,则进行accept事件的投递
                if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
                    return;
                }
            }
        }
    }
    

    当某进程连接数超过总worker_connections的7/8的时候,开始进行压力控制

    // src/event/ngx_event_accept.c
    void ngx_event_accept(ngx_event_t *ev)
    {
        ...
        //ngx_cycle->connection_n表示当前配置总的work_connections
        //ngx_cycle->free_connection_n表示剩余可接受的连接数
        //当可用连接数越少时,ngx_accept_disabled值越大,也就是获取锁的难度越高
        ngx_accept_disabled = ngx_cycle->connection_n / 8
                            - ngx_cycle->free_connection_n;
        ...
    }
    
  • windows

    windows每个进程都是独立控制accept接收,没有锁控制,由于实测没有进程的压力都在单一的进程上(windows10测试)。

其它可行性方案探讨

  • linux

    linux通过启用SO_REUSEADDR及SO_REUSEPORT,达到可同一个地址在多个进程监听多次,统一由系统来分配socket给谁accept。 优点:避免使用锁,统一系统分配 缺点:进程负载分配不像手动控制那么精准,如果系统上有其它程序,可以通过监听同个端口达到偷取数据的目的,低版本的linux不支持此选项 示例参考:Linux ReusePort, ReuseAddr

  • windows

    windows通过CreateProcess并且设置其中的子进程继承,通过命令行的方式把句柄值传递给子进程,启动进程后关闭主进程的句柄,从而使子进程拥有各自独立的accept权限。通过锁或者时序来控制谁来accept。 示例参与:Rust版的windows CreateProcess控制 用ab测试进行的压力测试 (运行截图, 其中584进程每接受一个新的socket时sleep 10秒时间)

© 著作权归作者所有

共有 人打赏支持
t
粉丝 12
博文 11
码字总数 9269
作品 3
厦门
服务器高并发网络设计模型

Nginx网络模型 一、进程模型 Nginx之所以为广大码农喜爱,除了其高性能外,还有其优雅的系统架构。与Memcached的经典多线程模型相比,Nginx是经典的多进程模型。Nginx启动后以daemon的方式在...

满小茂
2016/08/28
155
0
nginx源码分析—启动流程

作者:阿波 本文链接:http://blog.csdn.net/livelylittlefish/article/details/7243718 Content 0. 序 1. main()分析 2. 注意问题 2.1 几个初值 2.2 nginx工作模式 2.3 一些配置 2.4 其他开...

晨曦之光
2012/03/09
1K
0
workerman运行分析--主进程流程

基本上,workerman使用多进程的方式、使用libevent事件监听网络连接,达到高并发。它与nginx的进程模型相似,连接的处理,是由子进程完成的,主进程主要的工作是: 监听端口,生成子进程要共...

月影又无痕
2016/01/13
739
2
Nginx 的工作原理 和优化

1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配...

lining_at_HERE
2013/10/23
0
0
node 多线程 cluster

上篇 Node.js 诞生之初就遭到不少这样的吐槽,当然这些都早已不是问题了。 1、可靠性低。 2、单进程,单线程,只支持单核 CPU,不能充分的利用多核 CPU 服务器。一旦这个进程崩掉,那么整个 ...

fymoon
2016/10/30
27
0
nginx源码分析——事件模块

事件模块概述 事件处理框架所要解决的问题是如何收集,管理,分发事件。这里所说的事件,主要以网络事件和定时器事件为主,而网络事件中又以TCP网络事件为主。由于网络事件与网卡中断处理程序...

hncscwc
2016/06/23
186
0
openstack-webservice之eventlet

tornado是一个完整的轻量级web框架,利用tornado即可完成一个网站的搭建,而openstack的web架构却采用另一种思路来设计。这个设计思路我之前提到过,也就是openstack的所有设计,都是插件式,...

Jun_Wong
2017/11/20
0
0
Web服务器- apache与nginx分析

Web服务器 Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 1、应用层使用HTTP协议。 2、HTML文档格式。 3、浏览器统一资源定位器(URL)。 Web服务器常常以B/S...

磨砂轮
2016/02/21
122
0
nginx+php-fpm实现原理及问题记录

FastCGI原理 FastCGI是一个运用于Http Server和动态脚本语言间通信的接口,多数流行的Http Server都支持FastCGI,包括Apache、Nginx和lighttpd等。同时,FastCGI也被许多脚本语言支持,其中就...

Beivis
2014/04/04
0
0
Nginx 进程模型及事件处理机制

1)如果采用阻塞调用的方式,当读写事件没有准备好时,必然不能够进行读写事件,那么久只好等待,等事件准备好了,才能进行读写事件。那么请求就会被耽搁。阻塞调用会进入内核等待,cpu就会让...

旋转木马-千里马
2016/01/08
150
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
16分钟前
0
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
23分钟前
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
28分钟前
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
30分钟前
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
0
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
1
0
iptables规则备份和恢复、firewalld的9个zone以及操作和service的操作

保存以及备份iptalbes规则 设定了的防火墙规则要进行保存,否则系统重启后这些规则就没有了,使用命令 ”service iptables save ” 会把设定好的防火墙规则保存到文件/etc/sysconfig/iptabl...

黄昏残影
昨天
0
0
k8s image

k8s.gcr.io/kube-apiserver-amd64:v1.11.0k8s.gcr.io/kube-controller-manager-amd64:v1.11.0k8s.gcr.io/kube-scheduler-amd64:v1.11.0k8s.gcr.io/kube-proxy-amd64:v1.11.0k8s.gcr.......

分秒
昨天
0
0
数据结构--排序

这篇博客包含了数据结构中多种的排序算法: (1)简单选择:第一趟在A[0]~A[n-1]之间找到最小的,与A[0]进行交换,之后在A[1]~A[n-1]之间进行。。。第i趟在A[i-1]~A[n-1]之间找到最小的,最后...

wangxuwei
昨天
1
0
一名3年工作经验的java程序员应该具备的职业技能

一名3年工作经验的Java程序员应该具备的技能,这可能是Java程序员们比较关心的内容。我这里要说明一下,以下列举的内容不是都要会的东西—-但是如果你掌握得越多,最终能得到的评价、拿到的薪...

老道士
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部