Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(1)

详解(1)


1. 更新时间

c 复制代码
   ngx_timezone_update();

    /* force localtime update with a new timezone */

    tp = ngx_timeofday();
    tp->sec = 0;

    ngx_time_update();

ngx_timezone_update()更新进程的时区缓存
ngx_timeofday() 获取当前时间缓存对象 tp。
tp->sec = 0 强制标记时间缓存为"已失效"。
ngx_time_update() 重新计算当前时间并更新缓存。

tp->sec = 0; 的作用是强制标记当前时间缓存为无效,从而确保在调用 ngx_time_update() 时会重新调用系统函数来获取最新的时间戳。

如果没有强制刷新时间缓存(即 tp->sec != 0),ngx_time_update() 可能不会真正调用系统函数,而是直接使用缓存值


2. 创建内存池与周期结构

c 复制代码
	log = old_cycle->log;

    pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);
    if (pool == NULL) {
        return NULL;
    }
    pool->log = log;

    cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t));
    if (cycle == NULL) {
        ngx_destroy_pool(pool);
        return NULL;
    }

    cycle->pool = pool;
    cycle->log = log;
    cycle->old_cycle = old_cycle;

2.1 log = old_cycle->log;

从旧的 Nginx 运行周期(old_cycle)中继承日志对象(log),并将其赋值给当前的局部变量 log

新周期初始化时,尚未解析新的配置文件,无法确定新的日志路径或级别。

若直接使用新配置的日志可能失败(如路径无效),导致错误信息无法记录。

复用旧日志配置,新周期完全初始化前,确保初始化阶段的日志记录可靠。


2.2 pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);

创建一个内存池(memory pool),用于管理 Nginx 运行周期(cycle)中的内存分配

ngx_create_pool 是 Nginx 中用于创建内存池的核心函数。

它的主要功能是预分配一块连续的内存区域,并初始化相关的数据结构,以便后续高效地分配和管理内存。

NGX_CYCLE_POOL_SIZE

这是一个宏定义,表示内存池的初始大小。

log 是一个指向日志对象的指针,用于记录内存池操作中的错误或调试信息。


2.3 if (pool == NULL) { return NULL; }

检查内存池是否创建成功,失败则直接返回。


2.4 pool->log = log;

将内存池的日志对象设置为当前日志。

内存池可能在分配或销毁时记录日志(如调试信息),需确保使用正确的日志配置。

内存操作的日志与当前周期的日志配置保持同步


2.5 cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t));

从内存池分配并初始化 ngx_cycle_t 结构(核心运行时上下文)。
ngx_cycle_t 是 Nginx 运行时的核心结构,保存所有配置和运行时状态。


2.6 if (cycle == NULL) { ngx_destroy_pool(pool); return NULL; }

检查 cycle 分配是否成功,

分配失败时释放已创建的内存池,避免内存泄漏。

通过返回 NULL 通知上层初始化失败。
ngx_destroy_pool


2.7 cycle->pool = pool;

关联内存池到新周期。

所有后续内存分配均通过此池进行,确保统一管理。


2.8 cycle->log = log;

设置新周期的日志对象。

确保新周期的所有操作使用继承的日志配置,直到新配置生效。


2.9 cycle->old_cycle = old_cycle;

保存旧周期指针到新周期。

在平滑重启或重新配置时,新周期需要访问旧周期的资源(如监听套接字、共享内存)。
资源复用 :通过 old_cycle 复用旧资源(如 SO_REUSEPORT 套接字),实现零停机更新。
渐进式释放:旧周期资源在新周期稳定后逐步清理,避免服务中断。

相关推荐
IvorySQL36 分钟前
IvorySQL Agent 探索与实践
数据库·人工智能·postgresql·oracle·ivorysql
SelectDB2 小时前
美团数十 PB 规模 Apache Doris 实践:从统一 OLAP 到 AI-Native 数据基座
大数据·数据库·性能优化
Database_Cool_2 小时前
阿里云RDS主从延迟解决方案_只读实例半同步复制最佳实践
数据库·人工智能
KaMeidebaby2 小时前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
卓怡学长3 小时前
w269基于spring boot + vue 候鸟监测数据管理系统
java·数据库·spring boot·spring·intellij-idea
ClouGence3 小时前
MySQL 到 StarRocks 数据迁移同步:同步方案与实践指南
数据库·mysql
行业研究员3 小时前
当数据生产者变成 Agent,数据库底座如何重构?
大数据·数据库·重构
人工智能培训3 小时前
破解数据发展瓶颈 激活数字经济新动能
大数据·数据库·人工智能·深度学习·神经网络·机器学习·生成对抗网络
1234567890@world4 小时前
知识管理 | 数字化 | APQC
大数据·数据库·人工智能
倒流时光三十年4 小时前
PostgreSQL JSONB 操作符详解
大数据·数据库·postgresql