Nginx基础. eventfd, 异步IO 与epoll的相互协作

2024-06-22 19:48

本文主要是介绍Nginx基础. eventfd, 异步IO 与epoll的相互协作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于eventfd.
对于eventfd, 这里只是简单的讲它的功能. 看manpage就足够了, 其中的例子也很容易看懂
eventfd函数可以创建一个efd描述符, 该描述符在内核中维护着一个计数器counter.
在调用eventfd时, 可以传入参数指定内核中维护着的计数器的值.
如果这样调用:
      int efd = eventfd(0, 0);
那么计数器值为0.
如果此时调用:
      read(efd, &ret, sizeof(ret)); 
那么会休眠. 直到有人调用:
      int add = 1;write(efd, &add, sizeof(add))
这时候上面的read才会停止休眠, 得到的ret值为1. 如果write写入的add值不是1, 而是5
那么read函数得到的ret值也会是5. read之后, efd对应的内核中的计数器值就回到了0, 此时再次调用:
      read(efd, &ret, sizeof(ret)); 
那么进程又会阻塞. 除非, efd被你设置成了非阻塞... 会返回EAGAIN错误.



关于异步IO
这里将认识异步IO, 以及epoll是如何与异步IO相互协作的.
在linux下, 有两种异步IO. 一种是由glibc实现的aio, 它是直接在用户空间用pthread进行模拟的伪异步IO; 还有一种是内核实现的aio. 相关的系统调用是以 io_xxx 形式出现的.
在nginx中, 采用的是内核实现的aio, 只有在内核中成功完成了磁盘操作, 内核才会通知进程, 进而使磁盘文件的处理与网络事件的处理同样高效.
内核提供的aio的优点是, 能够同时提交多个io请求给内核, 当大量事件堆积到IO设备的队列中时, 内核将发挥出io调度算法的优势, 对到来的事件处理进行优化, 合并等.
这种内核级别的aio缺点也是很明显的, 它是不支持缓存操作的, 即使需要操作的文件块在linux文件缓存中已经存在, 也不会通过读取缓存来代替实际对磁盘的操作, 所以尽管相对于阻塞进程来说有了很大的好转, 但对于单个请求来说, 还是有可能降低实际的处理效率. 因为本可以从缓存中读的数据在使用异步IO后一定会从磁盘读取.
所以异步IO并不是完美的. 如果大部分用户请求对文件的操作都会落到文件缓存中, 那么放弃异步IO可能是更好的选择.
目前, Nginx仅支持读文件的异步IO, 因为正常写入文件往往是写入内存就返回, 相比于异步IO效率明显提高了.


异步IO方法
在理解异步IO方法时, 为了更好的理解这些方法, 与epoll相关方法做比较则更容易理解.
int io_setup(unsigned nr_events, aio_context_t *ctxp);初始化异步IO上下文. 与epoll相比, 类似epoll_create. nr_events表示异步IO上下文可以处理事件的最小个数通过ctxp获得的上下文描述符与epoll_create返回的描述符类似, 贯穿始终.
int io_submit(aio_context_t ctx_id, long nr, struct iocb **iocbpp);提交文件异步IO操作. iocbpp是提交的事件数组的首个元素地址, nr是提交的事件个数返回值表示成功提交的事件个数. 类似epoll中的 epoll_ctl + EPOLL_CTL_ADD
int io_cancel(aio_context_t ctx_id, struct iocb *iocb, struct io_event *result);取消某个IO操作类似epoll中的epoll_ctl + EPOLL_CTL_DEL
int io_getevents(aio_context_t ctx_id, long min_nr, long nr, struct io_event *events, struct timespec *timeout);从已完成的文件异步IO操作队列中读取操作其中, min_nr表示至少获取min_nr个事件; nr表示至多获取nr个事件; events是IO操作完成的事件数组类似epoll中的epoll_wait
int io_destroy(aio_context_t ctx);销毁异步IO上下文.

对于一个进程来说, 通常一个异步IO就可以了, 因为一个异步IO可以同时包含很多异步IO操作.
在调用io_setup初始化完成异步IO上下文后, 将会使用io_submit提交异步IO操作.
其中的struct iocb结构体如下:
struct iocb {//存储业务需要的指针. 在Nginx中, 这个字段通常存储对应ngx_event_t对象的指针.//它实际上与io_getevents中返回的io_event结构体的data成员是完全一致的.uint64_t aio_data;//操作码.  比如IO_CMD_PREAD指定异步读操作;  IO_CMD_PWRITE异步写操作;  IO_CMD_FSYNC强制同步等...uint16_t aio_lio_opcode;//请求的优先级int16_t aio_reqprio; //文件描述符uint32_t aio_fields;//读写操作对应的用户态缓冲区.uint64_t aio_buf;//读写操作的字节长度uint64_t aio_nbytes;uint64_t aio_offset;//表示可以设置为IOCB_FLAG_RESFD, 它会告诉内核当有异步IO请求处理完成时使用eventfd进行通知//可与epoll配合使用. 下面会涉及到uint32_t aio_flags;//表示当使用IOCB_FLAG_RESFD标志时, 用于进行事件通知的句柄uint64_t aio_resfd;...
};
在设置好iocb结构体后, 就可以向异步IO提交事件了. 也可以使用io_cancel将已经提交的事件取消.
那么在异步IO操作完成后, 如何使用i

这篇关于Nginx基础. eventfd, 异步IO 与epoll的相互协作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085250

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

ps基础入门

1.基础      1.1新建文件      1.2创建指定形状      1.4移动工具          1.41移动画布中的任意元素          1.42移动画布          1.43修改画布大小          1.44修改图像大小      1.5框选工具      1.6矩形工具      1.7图层          1.71图层颜色修改          1

[FPGA][基础模块]跨时钟域传播脉冲信号

clk_a 周期为10ns clk_b 周期为34ns 代码: module pulse(input clk_a,input clk_b,input signal_a,output reg signal_b);reg [4:0] signal_a_widen_maker = 0;reg signal_a_widen;always @(posedge clk_a)if(signal_a)

00 - React 基础

1. React 基础 安装react指令 可参考: 官网官网使用教程 如: npx create-react-app 项目名如:npx create-react-app react-redux-pro JSX JSX 是一种 JavaScript 的语法扩展,类似于 XML 或 HTML,允许我们在 JavaScript 代码中编写 HTML。 const element =

AI赋能天气:微软研究院发布首个大规模大气基础模型Aurora

编者按:气候变化日益加剧,高温、洪水、干旱,频率和强度不断增加的全球极端天气给整个人类社会都带来了难以估计的影响。这给现有的天气预测模型提出了更高的要求——这些模型要更准确地预测极端天气变化,为政府、企业和公众提供更可靠的信息,以便做出及时的准备和响应。为了应对这一挑战,微软研究院开发了首个大规模大气基础模型 Aurora,其超高的预测准确率、效率及计算速度,实现了目前最先进天气预测系统性能的显著

【软考】信息系统项目管理师(高项)备考笔记——信息系统项目管理基础

信息系统项目管理基础 日常笔记 项目的特点:临时性(一次性)、独特的产品、服务或成果、逐步完善、资源约束、目的性。 临时性是指每一个项目都有确定的开始和结束日期独特性,创造独特的可交付成果,如产品、服务或成果逐步完善意味着分步、连续的积累。例如,在项目早期,项目范围的说明是粗略的,随着项目团队对目标和可交付成果的理解更完整和深入时,项目的范围也就更具体和详细。 战略管理包括以下三个过程

众所周知,配置即代码≠基础设置即代码

​前段时间翻到几条留言,问: “配置即代码和基础设施即代码一样吗?” “配置即代码是什么?怎么都是基础设施即代码?” 我们都是知道,DevOp的快速发展,让服务器管理与配置的时间大大减少,配置即代码和基础设施即代码作为DevOps的重要实践,在其中起到了关键性作用。 不少人将二者看作是一件事,配置即大代码是关于管理特定的应用程序配置设置本身,而基础设施即代码更关注的是部署支持应用程序环境所需的

设置Nginx缓存策略

详细信息 Nginx服务器的缓存策略设置方法有两种:add_header或者expires。 1. add_header 1)语法:add_header name value。 2)默认值:none。 3)使用范围:http、server、location。 配置示例如下: add_header cache-control "max-age=86400";#设置缓存时间为1天。add