Nginx事件管理机制-epoll
epoll的最大好处在于他不会随着被监控描述符的数目的增长而导致效率极致下降。
select是遍历扫描来判断每个描述符是否有事件发生,当监控的描述付越多时,时间消耗就越多,并且由于系统的限制select最多可以监控1024个描述符。
epoll监控的描述符的数目很大,并且epoll对描述符的响应是触发的,即当有描述符有时间发生会有触发。
epoll模型有三个函数
epoll_create(int size);
epoll_wait(int epollfd,struct epoll_event *events,int maxevent,int timeout);
epoll_ctl(int epollfd,int op,struct epoll_event *events);
epoll_create(int size) 是创建size大小的文件描述符
epoll_wait()是用来等待事件的发生
epoll_ctl()是用来向内核注册,删除,修改一个文件描述符的
epoll模型有两种触发方式:一种是边缘触发,一种是水平触发。
eg:
1.进程A将通过pipe P的读端向描述符为fd以边缘触发加到自己的epoll监控里面,并用epoll_wait()等待事件发生
2.进程B往P中写2KB的数据;
3.进程A的描述符fd触发可读事件,因此epoll_wait()函数调用返回。
4.进程A从描述符fd上读取1KB的数据。
5.进程A调用epoll_wait()数据
根据边缘触发的特点:即使pipe P中还有1KB的数据可读,但是并不会触发可读事件,
6.进程B往P中写了2KB的数据
因为此时又有客户端发出请求,即监听套接口上又有新的数据到达,epoll_wait()函数会捕获fd上的可读事件。
解决方法是在ngx_http_read_request_header()函数,在开头加入return NGX_AGAIN 这样让Nginx不读走数据,在写数据的时候,或触发Nginx再次捕获可读信号。
测试代码:
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> int main(int srgc,char *const *argv)
{
int sockfd;
if((sockfd = socket(AF_INET,SOCK_STREAM,)) == -)
{
fprintf(stderr,"socket fail:%s\n",strerror(errno));
return -;
}
struct sockaddr_in server;
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons();
if(!inet_aton("192.168.1.1",&server.sin_addr))
{
fprintf(stderr,"Bad address %s\n",strerror(errno));
close(sockfd);
return -;
}
if(connect(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr)) == -)
{
printf(stderr,"connect fail,%s\n",strerror(errno));
close(sockfd);
return -;
}
write(sockfd,"test1",sizeof("test1"));
write(sockfd,"test2",sizeof("test2"));
close(sockfd);
return ;
}
使用边缘触发方式的epoll模型:
1.用于非阻塞文件描述符:即把待加入到epoll模型里的描述符都设置为no-block
2.只有当read()或write()返回EAGAIN,或者read()/write()读到/写到的数据长度小于请求的数据长度时,才需要挂起等待下一个时间的到来,否则会出现错误
Nginx事件管理机制-epoll的更多相关文章
- Nginx事件管理之epoll模块
1. epoll 原理 假设有 100 万用户同时与一个进程保持着 TCP 连接,而每一时刻只有几十个或几百个 TCP 连接时活跃的(接收到 TCP 包),也就是说,在每一时刻,进程只需要处理这 10 ...
- Nginx事件管理之概念描述
1. Nginx事件管理概述 首先,Nginx定义了一个核心模块ngx_events_module,这样在Nginx启动时会调用ngx_init_cycle方法解析配置项,一旦在 nginx.conf ...
- Nginx事件管理之事件处理流程
1. 概述 事件处理要解决的两个问题: "惊群" 问题,即多个 worker 子进程监听相同端口时,在 accept 建立新连接时会有争抢,引发不必要的上下文切换, 增加系统开销. ...
- Nginx事件管理之ngx_event_core_module模块
1. 概述 ngx_event_core_module 模块是一个事件类型的模块,它在所有事件模块中的顺序是第一位.它主要完成以下两点任务: 创建连接池(包括读/写事件): 决定究竟使用哪些事件驱动机 ...
- Nginx事件管理之定时器事件
1. 缓存时间 1.1 管理 Nginx 中的每个进程都会单独地管理当前时间.ngx_time_t 结构体是缓存时间变量的类型: typedef struct { /* 格林威治时间1970年1月1日 ...
- Nginx事件管理之核心模块ngx_events_module
1. ngx_events_module核心模块的功能介绍 ngx_events_module 模式是一个核心模块,它的功能如下: 定义新的事件类型 定义每个事件模块都需要实现的ngx_event_m ...
- jquery技巧之让任何组件都支持类似DOM的事件管理
本文介绍一个jquery的小技巧,能让任意组件对象都能支持类似DOM的事件管理,也就是说除了派发事件,添加或删除事件监听器,还能支持事件冒泡,阻止事件默认行为等等.在jquery的帮助下,使用这个方法 ...
- nginx 事件机制原理
事件驱动模型是Nginx服务器保障完整功能和具有良好性能的重要机制之一. 事件驱动模型概述 实际上,事件驱动并不是计算机编程领域的专业词汇,它是一种比较古老的响应事件的模型,在计算机编程.公共关系.经 ...
- nginx&http 第三章 ngx 事件event accept epoll /init
tcp 三次握手成功后,listen fd 可读,在process_event_timer 中调用rev->handler(rev)处理: 其回调函数为: ngx_event_accept / ...
随机推荐
- ZOJ3496:Assignment——题解
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3496 题目大意:A公司从S到T运货,每条路都有一个运货上限,而B公司则有p ...
- LOJ6346:线段树:关于时间 ——题解
https://loj.ac/problem/6346 题目还是没法粘贴…… 一道蛮不错的题. 老年选手困了30min后才想要推式子实在是太懒了…… 我们可以对每次更新列表看成系数*x即可. 举例:第 ...
- git安装和使用 linux系统和window系统
一.git简介 git是一款免费.开放源代码的分布式版本控制系统特点: git是一个开源的分布式版本控制系统,可以有效, 高速的处理从很小到非常大的项目版本管理 二.git安装 Linux:下载.安装 ...
- atom的快捷键,你hold住吗?
命令面板:Ctrl+Shift+P设置窗口:Ctrl+,另存为: Ctrl+Shift+S添加文件:Ctrl+O添加文件夹:Ctrl+Alt+O工程内查找 :Cmd+Shift+F a,m,delet ...
- bzoj1045: [HAOI2008] 糖果传递(思维题)
首先每个人一定分到的糖果都是所有糖果的平均数ave. 设第i个人给i-1个人Xi个糖果,则有Ai-Xi+X(i+1)=ave. 则A1-X1+X2=ave,A2-X2+X3=ave,A3-X3+X4= ...
- 什么是static?什么是final?
由static修饰的变量.常量.和方法被称为是静态变量.常量和 方法. 静态数据和静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等,以static声明并且实现,这样当需要使用时,直接使用类 ...
- HDU4685:Prince and Princess(二分图匹配+tarjan)
Prince and Princess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- kali wireless driver install
acer-gateway nv47h94c 1.lspci -nn |grep 0280 get pci-id root@silee:/# lspci -nn |grep 028003:00.0 Ne ...
- JAVA 枚举单例模式
1.枚举单例模式的实现 public enum Singleton { INSTANCE { @Override protected void read() { System.out.println ...
- springboot-为内置tomcat设置虚拟目录
需求 项目使用springboot开发,以jar包方式部署.项目中文件上传均保存到D判断下的upload目录下. 在浏览器中输入http://localhost:8080/upload/logo_1. ...