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 / ...
随机推荐
- SPOJ3267/DQUERY:D-query——题解
https://vjudge.net/problem/SPOJ-DQUERY http://www.spoj.com/problems/DQUERY/en/ 给定一列数,查询给定区间内数的种类数. 这 ...
- BZOJ3675 [Apio2014]序列分割 【斜率优化dp】
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 3366 Solved: 1355 [Submit][St ...
- YBT 5.2 树形动态规划
题解在代码中 二叉苹果树[loj 10153] /* 若要留q条边便是要留q+1个点 所以记忆化搜索 dp[pos][ans]=max(dp[pos][ans],dp[l[pos]][k]+dp[r[ ...
- [转]Android 如何根据网络地址获取网络图片方法
http://blog.csdn.net/xiazdong/article/details/7724103 目录(?)[-] h2pre namecode classhtml stylefont-we ...
- POJ3690:Constellations(二维哈希)
Constellations Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6822 Accepted: 1382 题目 ...
- HDU2896:病毒侵袭(AC自动机)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- POJ3974:Palindrome(Manacher模板)
Palindrome Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 14021 Accepted: 5374 题目链接 ...
- Stars POJ - 2352
Astronomers often examine star maps where stars are represented by points on a plane and each star h ...
- tomcat log4j配置
tomcat默认的log使用的是java.util.logging,配置文件在${catalina_base}/conf/logging.properties tomcat日志分类, 1.access ...
- java 面向对象编程(OOP)
java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改: 代码复用: 增加代码的可靠性和灵活性: 增加代码的可理解性. 封装 封装 ...