Nginx事件模块学习之定时器

Nginx基础教程(82)Nginx事件机制之定时器:Nginx定时器机制:让服务器准时“上班”的幕后指挥官 你有没有想过,Nginx为什么能同时处理成千上万的连接请求而不乱套?答案就在其事件机制中的定时器功能。就像一座精密的时钟,Nginx的定时器默默协调着所有任务的节奏,确保请求不超时、资源不泄露、任务不冲突。本文将深入剖析Nginx的定时器机制,从底层原理到实际应用,带你了解这一高性能服务器的核心设计,并附上可直接使用的实战示例。 阅读详情

        Nginx中对事件处理的定时器是利用红黑树实现的,下来逐步分析一下nginx如何对定时器实现的。

        首先,Nginx的工作进程是一个无限for循环,主要代码如下:

static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{
	……

	// 工作进程初始化调用
    ngx_worker_process_init(cycle, worker);
	……
	// 无限循环
    for ( ;; ) {
		……
        ngx_process_events_and_timers(cycle);

        ……
    }
}

        无限循环中调用的 ngx_process_events_and_timers 就是处理事件的函数。再这之前我们需要了解 ngx_event_timer_init 函数,该函数在工作进程初始化 ngx_worker_process_init 在初始化事件模块时调用的,具体函数如下:

ngx_int_t ngx_event_timer_init(ngx_log_t *log)
{
    // 初始化定时器事件的红黑树
    ngx_rbtree_init(&ngx_event_timer_rbtree, &ngx_event_timer_sentinel,
                    ngx_rbtree_insert_timer_value);

    return NGX_OK;
}

        添加事件至事件树上其函数为: ngx_event_add_timer,主要代码如下:

static ngx_inline void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer)
{

	// 当前时间 + 定时时间,计算出将来的某一超时时刻
    key = ngx_current_msec + timer;

	……

    ev->timer.key = key;

    // 将事件添加至事件的红黑树上
    ngx_rbtree_insert(&ngx_event_timer_rbtree, &ev->timer);

    ……
}

        查询事件树上timer最小的函数为:ngx_event_find_timer,该函数主要查询是不是有事件已经到期或者过期,当过期或者到期都返回 0。具体代码如下:

ngx_msec_t ngx_event_find_timer(void)
{
    ngx_msec_int_t      timer;
    ngx_rbtree_node_t  *node, *root, *sentinel;

    if (ngx_event_timer_rbtree.root == &ngx_event_timer_sentinel) {
        return NGX_TIMER_INFINITE;
    }

    root = ngx_event_timer_rbtree.root;
    sentinel = ngx_event_timer_rbtree.sentinel;

    node = ngx_rbtree_min(root, sentinel);

    timer = (ngx_msec_int_t) (node->key - ngx_current_msec);

    return (ngx_msec_t) (timer > 0 ? timer : 0);
}

        了解了上述三个函数,下来分析一下工作进程循环里的ngx_process_events_and_timers函数,主要代码如下:

void ngx_process_events_and_timers(ngx_cycle_t *cycle)
{
	……
    // 为epoll的wait提供一个超时时间,以防止epoll的wait阻塞时间太长
	timer = ngx_event_find_timer();
    ……

	// 调用 epoll_wait 去监听并处理读写事件
    (void) ngx_process_events(cycle, timer, flags);

    ……
    if (delta) {
        ngx_event_expire_timers();
    }
	……
}

        上述代码中每次for循环开始都会查找事件树中最小超时事件的时间,将该时间作为epoll_wait函数的超时时间,以防止epoll_wait函数阻塞时间过长。后续的 delta 变量为执行ngx_event_expire_timers函数的时间,如果该时间超过1ms则事件树上有可能有事件到期,则遍历事件树执行到期时间的handler并移除该过期事件,函数为ngx_event_expire_timers,主要代码如下:

void ngx_event_expire_timers(void)
{
	……
    for ( ;; ) {
		……
		
		// 找出最小key值的
        node = ngx_rbtree_min(root, sentinel);

		// 如果最小的key对于的事件没过期则返回 
        if ((ngx_msec_int_t) (node->key - ngx_current_msec) > 0) {
            return;
        }

        ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, timer));
		
		……
		// 删除刚才找出的事件节点
        ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer);

		……
		// 执行事件的回调函数
        ev->handler(ev);
    }
}

        执行完ngx_event_expire_timers后一次for循环就算是执行完了,后续一直循环执行就可以。至此,nginx的工作进程定时器处理事件的也算是整个完了。

        结合上一章Nginx事件模块学习之连接_向往天空的鱼-优快云博客,简单梳理一下nginx处理事件的主要流程图如下:

 

【Nginx学习】深入 Nginx:4步揭秘定时器事件的实现,如何精准管理缓存时间? 🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀。 阅读详情

相关推荐

从0到1理解Nginx定时器:源码级超时管理完全指南

200多行代码,Nginx的定时器模块实现了一个工业级的高性能定时器管理系统。

weixin_45715405的博客 127

Nginx时间管理与定时器

GMT(Greenwich Mean Time,格林尼治标准时间)是指通过位于英国伦敦的皇家格林尼治天文台测定的时间。GMT 是全球统一的时间基准,用于定义世界各地的时间。它曾是国际标准时间,但现在更多使用的是 UTC(协调世界时),两者在日常使用中通常被认为是等价的。Nginx 定时器事件是 Nginx 服务器中用于管理和处理事件的一种机制,用于实现异步、非阻塞的事件驱动模型。定时器事件主要用于处理与时间相关的事件,如超时事件、定时任务等。超时处理。

H20555666的博客 734

【Nginx学习】深入 Nginx:4大步骤揭秘事件模块与事件处理框架

🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀。

java专栏 1237

nginx中的定时器源码分析与测试

nginx中的定时器源码分析与测试一、nignx中的定时器二、nignx中定时器测试三、附件 在nginx中,定时器是由红黑树来实现的。 有以下几个定时器的接口 init_timer 初始化定时器(初始化红黑树) add_timer 添加定时器(红黑树左侧时间小,右侧时间大。当时间出现重复的时候,插入右侧) del_timer 删除定时器 find_nearest_expire_timer 查找时间最近的定时器(红黑树中最左侧的节点) expire_timer 到期的定时器(执行定时事件,并删除红黑树中对

菊头蝙蝠的博客 2714

【Nginx学习】深入 Nginx:6大步骤揭秘 ngx_events_module 核心模块如何管理所有事件模块的配置项

🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀。

java专栏 2072

【Nginx学习】深入 Nginx:5步揭秘定时器事件,如何高效管理缓存时间?

🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀。

java专栏 1269

菜鸟学习Nginx之定时器

今天来分析一下Nginx定时器实现原理。 一、Nginx定时器 在网络通信中,客户端给服务端发送一个请求,如果服务端一直没有响应,那么客户端是不能一直傻傻的等待的,一般情况下,客户端需要设置一个超时定时器,当定时器超时后客户端需要进行后续处理。 Nginx定期器常用在upstream、子请求中,这些在分析http模块时已经介绍。 二、定时器实现 2.1 定时器 Nginx中定时器事件是...

程序员的世界 1154

【Nginx学习】深入 Nginx:3大步骤揭秘定时器事件,如何精准管理缓存时间?

🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀。

java专栏 772

Nginx学习(10)—— event模块、core模块、变量

Nginx的模块种类有很多,除了HTTP模块,还有一些核心模块和mail系列模块。核心模块主要是做一些基础功能,比如Nginx的启动初始化,event处理机制,错误日志的初始化,ssl的初始化,正则处理初始化。mail模块可以对imap,pop3,smtp等协议进行反向代理,这些模块本身不对邮件内容进行处理。启动模块从启动Nginx进程开始,做了一系列的初始化工作,源代码位于src/core/nginx.c,从main函数开始

Stars____的博客 946

【Nginx学习】深入 Nginx:5大步骤揭秘 ngx_events_module 核心模块如何管理事件模块

🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀。

java专栏 930

【Nginx学习】深入 Nginx:5步揭秘 ngx_process_events_and_timers 流程,如何高效处理事件和定时器?

Nginx 作为高性能的 HTTP 和反向代理服务器,其高效的并发处理能力离不开强大的事件驱动框架。在这个框架中, 函数起着至关重要的作用,负责处理各种 I/O 事件和定时器事件。本文将带你深入了解 Nginx 事件驱动框架的处理流程,特别是 函数的具体实现。通过代码和详细解析,让你在阅读后能够轻松掌握这一关键技术。准备好了吗?让我们开始吧! 是 Nginx 事件驱动框架的核心函数之一,负责处理所有 I/O 事件和定时器事件。它在每个事件循环中被调用,确保 Nginx 能够高效地处理各种事件,从而保持高性

java专栏 701

Nginx学习(18)—事件处理框架

事件处理框架 Nginx事件处理框架主要围绕两种事件进行,分别是是网络事件以及定时器事件。其中,网络事件主要就是以TCP事件为主了。Nginx的高可移植性决定了它能够在不同的操作系统内核中选择符合的事件驱动机制支持网络事件的处理。Nginx支持的事件驱动机制可以看《笔记十一》中的模块间关系图。 那Nginx的事件处理框架又是如何选择事件驱动机制的呢? Nginx定义了

Sunface撩技术 1926

【Nginx学习】深入 Nginx:7大步骤揭秘 ngx_event_core_module 事件模块管理

🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀。

java专栏 1069

Nginx源码分析 - Event事件篇 - Nginx的Event事件模块概览(17)

目录 一、event模块的概览 二、重要数据结构 1. ngx_listening_s 侦听结构 2. ngx_connection_s socket连接对象结构 3. ngx_event_s 事件数据结构 前一章,我们讲解了《Nginx源码分析 - 主流程篇 - 多进程的惊群和进程负载均衡处理 》中实际上已经涉及到了一部分事件模块的概念。细心的可以发现,Nginx的事件都是由nginx_event.c文件中的ngx_process_events_and_timers进程事件分发器这个函数开..

alpha_love的博客 864

【Nginx学习】深入 Nginx:3大步骤揭秘 Nginx 事件的定义与处理

Nginx 作为高性能的 HTTP 和反向代理服务器,其事件处理机制是实现高并发和低延迟的核心之一。本文将带你深入了解 Nginx 事件的定义与处理,通过代码和详细解析,让你在阅读后能够轻松掌握 Nginx 的事件处理机制。准备好了吗?让我们开始吧!在 Nginx 中,事件是用于处理 I/O 操作的基本单位,主要包括读事件(如接收客户端请求)和写事件(如发送响应)。Nginx 使用结构体来表示事件。// 事件结构体// 日志对象// 是否接受新连接// 是否是实例// 是否可用// 是否活跃。

java专栏 1093

【Nginx学习】深入 Nginx:5步揭秘事件驱动框架,如何巧妙解决“惊群”问题?

惊群”问题是指在一个多进程或多线程环境中,当一个事件发生时(如新连接到来),多个进程或线程同时被唤醒,但只有一个进程或线程真正处理了该事件,其他进程或线程则白白消耗了系统资源。这种情况会导致性能下降,尤其是在高并发场景下。

java专栏 1383

Nginx学习笔记(十八):事件处理框架

前言 如果接着上两篇笔记走的话,现在就应该说worker循环工作中的核心处理方法ngx_process_events_and_timers()。但是在看这个功能函数之前,需要先学习相关的 的事件模块内容。这一块也算是我学习Nginx的核心了,里面有许多比较有趣的内容,比如常见的负载均衡,“惊群”现象等等。当然,最重要的还是Nginx中的epoll 事件驱动机制。

时间文盲的记事板 2708

Wireshark抓包分析:如何从HTTP流量中快速定位黑客攻击痕迹(附pcap文件)

本文通过Wireshark实战,详细解析了如何从HTTP流量中快速定位黑客攻击痕迹。文章提供了核心过滤策略,并重点剖析了如何识别SQL注入攻击的流量特征、揭露WebShell的隐蔽通信以及追踪攻击者在横向移动中的行为,帮助安全人员系统性地从pcap文件中还原完整攻击链。

sprite的博客 1009

17.Nginx事件循环之定时器处理

Nginx支持不同平台下的高性能事件处理模型,例如Linux下的epoll、FreeBSD下的kqueue等,而我们的学习依旧针对Linux进行。接下来要说的是Nginx的事件循环,与很多网络库类似,在主事件循环中的第一步就是对定时器进行处理。 /* core/ngx_time.c */ ngx_epoch_msec_t ngx_elapsed_msec; // 用于记录N

疯哥哥带你飞 580

Allegro17.4原理图-PCB双向联动技巧:从网表生成到同步高亮

本文深入解析了Cadence Allegro 17.4中原理图与PCB的深度双向联动技巧。核心在于通过精准的网表生成与管理、实时的跨窗口交互高亮与信号追踪,以及元件与封装的智能匹配更新,构建高效协同设计工作流。掌握这些技巧能显著提升高速、高密度电路设计的效率与准确性,实现从逻辑设计到物理实现的无缝衔接。

weixin_29178069的博客 358

数字IC后端PPA优化实战:Timing一致性策略与Module Region布局技巧

本文深入探讨了数字IC后端设计中的PPA优化实战,重点解析了Timing一致性问题及其解决方案。通过调整Clock Uncertainty、Timing Derate和RC Scale Factor等关键参数,使Innovus等PR工具的分析结果更接近PrimeTime签核结果。同时,文章详细介绍了Module Region布局技巧,通过为关键模块划定物理区域,优化单元摆放,有效减少线延迟,从而协同提升时序收敛效率与设计可预测性。

weixin_29218963的博客 202
上一篇: Nginx数据结构学习
下一篇: Nginx学习之内存管理
码农诗人
博客等级 码龄11年 987粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值