文档章节

服务器高并发网络设计模型

满小茂
 满小茂
发布于 2016/08/28 16:25
字数 1223
阅读 445
收藏 3

Nginx网络模型

一、进程模型

        Nginx之所以为广大码农喜爱,除了其高性能外,还有其优雅的系统架构。与Memcached的经典多线程模型相比,Nginx是经典的多进程模型。Nginx启动后以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程,具体如下图:


图1 Nginx多进程模型

        master进程主要用来管理worker进程,具体包括如下4个主要功能:
        (1)接收来自外界的信号。
        (2)向各worker进程发送信号。
        (3)监控woker进程的运行状态。
        (4)当woker进程退出后(异常情况下),会自动重新启动新的woker进程。
        woker进程主要用来处理网络事件,各个woker进程之间是对等且相互独立的,它们同等竞争来自客户端的请求,一个请求只可能在一个woker进程中处理,woker进程个数一般设置为机器CPU核数。

二、进程控制

        对Nginx进程的控制主要是通过master进程来做到的,主要有两种方式:
        (1)手动发送信号
        从图1可以看出,master接收信号以管理众woker进程,那么,可以通过kill向master进程发送信号,比如kill -HUP pid用以通知Nginx从容重启。所谓从容重启就是不中断服务:master进程在接收到信号后,会先重新加载配置,然后再启动新进程开始接收新请求,并向所有老进程发送信号告知不再接收新请求并在处理完所有未处理完的请求后自动退出。
        (2)自动发送信号
        可以通过带命令行参数启动新进程来发送信号给master进程,比如./nginx -s reload用以启动一个新的Nginx进程,而新进程在解析到reload参数后会向master进程发送信号(新进程会帮我们把手动发送信号中的动作自动完成)。当然也可以这样./nginx -s stop来停止Nginx。

三、网络事件

         Nginx采用异步非阻塞的方式来处理网络事件,类似于Libevent,具体过程如下图:


                                图2 Nginx网络事件

        master进程先建好需要listen的socket后,然后再fork出多个woker进程,这样每个work进程都可以去accept这个socket。当一个client连接到来时,所有accept的work进程都会受到通知,但只有一个进程可以accept成功,其它的则会accept失败。Nginx提供了一把共享锁accept_mutex来保证同一时刻只有一个work进程在accept连接,从而解决惊群问题。当一个worker进程accept这个连接后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完成的请求就结束了。

 

Memcached

memcached是一款非常普及的服务器端缓存软件,memcached主要是基于Libevent库进行开发的。

网络模型流程分析

Memcached主要是基于Libevent的事件库来实现网络线程模型的。
Memcached的网络线程模型主要涉及两个主要文件:memcached.c 和thread.c文件。
我们这边主要分析tcp的模型。memcached也支持udp。

1. memcached首先在主线程中会创建main_base,memcached的主线程的主要工作就是监听和接收listen和accpet新进入的连接。

2. 当memcached启动的时候会初始化N个worker thread工作线程,每个工作线程都会有自己的LIBEVENT_THREAD数据结构来存储线程的信息(线程基本信息、线程队列、pipe信息)。worker thread工作线程和main thread主线程之间主要通过pipe来进行通信。

3. 当用户有连接进来的时候,main thread主线程会通过求余的方式选择一个worker thread工作线程。

4. main thread会将当前用户的连接信息放入一个CQ_ITEM,并且将CQ_ITEM放入这个线程的conn_queue处理队列,然后主线程会通过写入pipe的方式来通知worker thread工作线程。

5. 当工作线程得到主线程main thread的通知后,就会去自己的conn_queue队列中取得一条连接信息进行处理,创建libevent的socket读写事件。

6. 工作线程会监听用户的socket,如果用户有消息传递过来,则会进行消息解析和处理,返回相应的结果。

    流程图

详情见:http://www.lvtao.net/c/623.html

高并发服务器代码:https://github.com/manmao/Module/tree/master/mult_process_server

 

© 著作权归作者所有

满小茂
粉丝 79
博文 122
码字总数 138345
作品 0
成都
程序员
私信 提问
如何测试Nginx的高性能

简介 Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器; 作为一款轻量级的Web服务器,具有占有内存少,并发能力强等优势,是高连接并发场景下Apa...

xxrenzhe11
2014/05/01
0
0
Nginx基础

一、 Nginx 基础 1、简介 2、 功能 3、 优点 4、 LNMP 实现原理和架构(Linux Nginx MySQL PHP) 5、 Nginx 的应用场合 6、 主流 WEB 服务产品对比...

IT_外卖小哥
2018/01/05
0
0
一、NGINX简介

Nginx(“engine x”)是俄罗斯人Igor Sysoev(伊戈尔·赛所耶夫)编写一款高性能的HTTP和反代理服务器。Nginx能够选择高效的epoll(Linux 2.6内核)、kqueue(FreeBSD)、eventport(Solaris...

孟飞阳
2016/08/06
72
0
企业平台云化如何迁移?迁移的基本思路是什么?

传统建设模式已无法满足移动互联网模式下业务量弹性变化的需求,以及业务快速增长对处理能力增长的需要,造成资源浪费,维护成本高。 存在问题: 资源按峰值配置,独立不共享,服务器利用率低...

zlw东南风
2017/11/23
0
0
服务器的实现NIO与BIO

服务器的实现不止有这两种方式。 先谈谈题主说的这两种服务器模型: 1、收到一个请求就处理,这个时候就不能处理新的请求,这种为阻塞 这个是单线程模型,无法并发,一个请求没处理完服务器就...

久违了java
2017/09/05
48
2

没有更多内容

加载失败,请刷新页面

加载更多

谁说多功能和低价格不能兼得?Aspose系列产品1024购买指南请查收!

你还在为了Word、Excel、PDF、CAD等文档格式转换而发愁吗? 你是否在寻找一款能够在应用程序中文档管理的工具呢? Aspose——支持100多种文件格式创建、编辑、转换和打印! 往下看,找一找哪...

mnrssj
21分钟前
3
0
hbase客户端API

本章介绍用于对HBase表上执行CRUD操作的HBase Java客户端API。 HBase是用Java编写的,并具有Java原生API。因此,它提供了编程访问数据操纵语言(DML)。 HBaseConfiguration类 添加 HBase 的配...

水木星辰
21分钟前
3
0
[插件化开发] 1. 初识OSGI

初识 OSGI 背景 当前product是以solution的方式进行售卖,但是随着公司业务规模的快速夸张,随之而来的是新客户的产品开发,老客户的产品维护,升级以及修改bug,团队的效能明显下降,为了解...

IsaacZhang
22分钟前
4
0
Webstorm 环境使用 nuxt.js 做开发,@ 和 ~ 别名配置

好的IDE + 好的代码提示 = 高效率的开发 webstorm 设置@和~别名,有助于代码查看和跳转. step 0 在项目下创建一个webpack.config.js,内容如下: const path = require('path')module.exp...

皇虫
26分钟前
3
0
Knative 实战:基于 Knative Serverless 技术实现天气服务-下篇

上一期我们介绍了如何基于 Knative Serverless 技术实现天气服务-上篇,首先我们先来回顾一下上篇介绍的内容: 通过高德天气 API 接口,每隔 3 个小时定时发送定时事件,将国内城市未来 3 天...

Mr_zebra
43分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部