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

详解(5)


初始化打开文件列表(open_files

c 复制代码
    if (old_cycle->open_files.part.nelts) {
        n = old_cycle->open_files.part.nelts;
        for (part = old_cycle->open_files.part.next; part; part = part->next) {
            n += part->nelts;
        }

    } else {
        n = 20;
    }

    if (ngx_list_init(&cycle->open_files, pool, n, sizeof(ngx_open_file_t))
        != NGX_OK)
    {
        ngx_destroy_pool(pool);
        return NULL;
    }

1. 检查旧周期文件列表是否非空
c 复制代码
if (old_cycle->open_files.part.nelts) {

ngx_list_t

判断旧cycle(old_cycle)的open_files链表的第一个节点(part)是否有元素

open_filesngx_list_t类型,内部由多个ngx_list_part_t节点组成,每个节点包含多个元素。

open_files 存储 Nginx 运行时需持久打开的文件(如日志文件、共享内存文件)。在平滑重启或重新配置时,新周期需继承这些文件以避免频繁打开/关闭。

资源复用 :继承旧文件描述符,减少系统调用开销,提升性能。
平滑过渡:确保新旧周期切换时文件操作不中断。

如果旧cycle的open_files存在元素,进入计算总元素数的逻辑。


2 初始化容量 n 为旧周期文件数量

c 复制代码
n = old_cycle->open_files.part.nelts;

获取旧周期 open_files 列表第一个分片(part)的元素数量。

ngx_list_t 是分片链表结构,每个分片(part)包含 nelts 个元素。

此处初始化 n 为第一个分片的元素数。

为新周期预分配足够容量,避免频繁扩容。


3 遍历所有分片累加元素数量

c 复制代码
for (part = old_cycle->open_files.part.next; part; part = part->next) {
    n += part->nelts;
}

遍历旧周期 open_files 的所有分片,累加总元素数到 n

ngx_list_t 可能包含多个分片(如元素数量超过单个分片容量),需遍历所有分片统计总数。

精确预分配 :确保新周期的 open_files 容量足够容纳所有旧文件,避免扩容开销。


4 若无旧文件,设置默认容量

c 复制代码
} else {
    n = 20;
}

若旧周期无文件,设置初始容量 n = 20

20 是经验值,平衡内存占用与性能(避免频繁扩容)。


5 初始化 open_files 列表

c 复制代码
if (ngx_list_init(&cycle->open_files, pool, n, sizeof(ngx_open_file_t)) != NGX_OK)

ngx_list_init

初始化新周期的 open_files 列表。

  • pool:内存池,用于管理列表内存。
  • n:初始容量(继承旧文件数或默认 20)。
  • sizeof(ngx_open_file_t):每个元素的大小(文件描述符结构)。

6 错误处理

c 复制代码
{
    ngx_destroy_pool(pool);
    return NULL;
}

若初始化失败,销毁内存池并终止函数。

确保失败时释放所有已分配资源


相关推荐
andxe8 小时前
安科士 AndXe 技术博客:400G QSFP112 SR4 光模块|AI 算力与超算短距互联最优方案
网络·人工智能·光模块·光通信
shiyi.十一9 小时前
第2章:应用层 — 知识要点与架构
网络·计算机网络·架构
DFT计算杂谈9 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
水境传感 李兆栋9 小时前
GNSS 位移监测站 :毫米级感知,筑牢安全监测防线
网络
中微极客11 小时前
2026主流AI Agent框架技术选型与性能对比
运维·网络·人工智能
郝亚军12 小时前
使用Vue 3和Nginx打包和部署Vue.js项目的一般步骤
前端·vue.js·nginx
猿的天空15 小时前
机器人双手迎来全栈训练系统:灵初智能EgoSteer让灵巧手无所不能
网络·人工智能·计算机·ai·程序员·机器人·编程
Xzaveir_77715 小时前
OPPO、vivo、荣耀号码认证:多终端拨测矩阵与异常复现
大数据·网络·科技·矩阵·产品经理·ai-native
wuqingshun31415915 小时前
从网络角度来看,用户从输入网址到网页显示,期间发生了什么?
网络