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

server/2025/3/1 15:54:33/

详解(5)


初始化打开文件列表(open_files

    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. 检查旧周期文件列表是否非空
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 为旧周期文件数量

n = old_cycle->open_files.part.nelts;

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

ngx_list_t 是分片链表结构,每个分片(part)包含 nelts 个元素。
此处初始化 n 为第一个分片的元素数。

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


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

for (part = old_cycle->open_files.part.next; part; part = part->next) {n += part->nelts;
}

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

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

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


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

} else {n = 20;
}

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

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


5 初始化 open_files 列表

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 错误处理

{ngx_destroy_pool(pool);return NULL;
}

若初始化失败,销毁内存池并终止函数。
确保失败时释放所有已分配资源



http://www.ppmy.cn/server/171575.html

相关文章

BiliBili视频下载-原理与实现Python+FFmpeg

脚本地址: 项目地址: Gazer BiliGrab.py 提要 适用于: 登录状态下, 非大会员视频下载. 自动解析任意 B 站非大会员 / 付费视频的视频 & 音频请求链接并下载, 需要添加 Cookie 保证视频清晰度. 使用 FFmpeg 命令无损合并视频和音频. 使用方法 克隆或下载项目代码.安装…

Ubuntu+deepseek+Dify本地部署

1.deepseek本地部署 在Ollama官网下载 需要魔法下载 curl -fsSL https://ollama.com/install.sh | sh 在官网找到需要下载的deepseek模型版本 复制命令到终端 ollama run deepseek-r1:7b 停止ollama服务 sudo systemctl stop ollama # sudo systemctl stop ollama.servi…

论软件设计模式及其应用-软考

软件设计模式(Software Design Pattern)是一套被反复使用的、多数人知晓的代码设计经验的总结。使用设计模式是为了重用代码以提高编码效率、增加代代码可理解性、保证代码的可靠性。软件设计模式是软件开发中的最佳实践之一,它经常被开发人员在面向对象软件开发过程中所采用…

【大模型】大模型推理能力深度剖析:从通用模型到专业优化

大模型推理能力深度剖析:从通用模型到专业优化 大模型推理能力深度剖析:从通用模型到专业优化一、通用语言模型与推理模型的区别(一)通用语言模型:多任务的“万金油”(二)推理模型:复…

1.2.3 使用Spring Initializr方式构建Spring Boot项目

本实战概述介绍了如何使用Spring Initializr创建Spring Boot项目,并进行基本配置。首先,通过Spring Initializr生成项目骨架,然后创建控制器HelloController,定义处理GET请求的方法hello,返回HTML字符串。接着&#xf…

git 强推

1、查看git版本 git --version 如果你已经安装了 Git,可以检查是否安装成功: 打开命令提示符(CMD)或 PowerShell。输入 git --version,如果安装成功,应该会显示 Git 的版本信息。 2、强推 git push or…

算法-二叉树篇14-从中序与后序遍历序列构造二叉树

从中序与后序遍历序列构造二叉树 力扣题目链接 题目描述 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 解题思路 这道题很有难度&#xff0…

Day11 洛谷题第一阶段总结

给大家看一下上面的是我上一个阶段所写的,因为我要准备校赛,蓝桥杯,所以我写的这些题目,我打算在4.12号之前写完60道题,最近这几天其实我心情不是很美丽,因为我觉得真的好辛苦啊, 主要还得是因…