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

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

详解(5)


初始化打开文件列表(open_files)

  1.     if (old_cycle->open_files.part.nelts) {
  2.         n = old_cycle->open_files.part.nelts;
  3.         for (part = old_cycle->open_files.part.next; part; part = part->next) {
  4.             n += part->nelts;
  5.         }
  6.     } else {
  7.         n = 20;
  8.     }
  9.     if (ngx_list_init(&cycle->open_files, pool, n, sizeof(ngx_open_file_t))
  10.         != NGX_OK)
  11.     {
  12.         ngx_destroy_pool(pool);
  13.         return NULL;
  14.     }
复制代码

1. 查抄旧周期文件列表是否非空

  1. if (old_cycle->open_files.part.nelts) {
复制代码
ngx_list_t
判断旧cycle(old_cycle)的open_files链表的第一个节点(part)是否有元素
open_files是ngx_list_t范例,内部由多个ngx_list_part_t节点组成,每个节点包罗多个元素。
open_files 存储 Nginx 运行时需持久打开的文件(如日志文件、共享内存文件)。在平滑重启或重新配置时,新周期需继承这些文件以避免频仍打开/关闭。
资源复用:继承旧文件描述符,减少系统调用开销,提升性能。
平滑过渡:确保新旧周期切换时文件操作不中断。
如果旧cycle的open_files存在元素,进入计算总元素数的逻辑。

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

  1. n = old_cycle->open_files.part.nelts;
复制代码
获取旧周期 open_files 列表第一个分片(part)的元素数量。
ngx_list_t 是分片链表结构,每个分片(part)包罗 nelts 个元素。
此处初始化 n 为第一个分片的元素数。
为新周期预分配足够容量,避免频仍扩容。

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

  1. for (part = old_cycle->open_files.part.next; part; part = part->next) {
  2.     n += part->nelts;
  3. }
复制代码
遍历旧周期 open_files 的所有分片,累加总元素数到 n。
ngx_list_t 大概包罗多个分片(如元素数量超过单个分片容量),需遍历所有分片统计总数。
精确预分配:确保新周期的 open_files 容量足够容纳所有旧文件,避免扩容开销。

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

  1. } else {
  2.     n = 20;
  3. }
复制代码
若旧周期无文件,设置初始容量 n = 20。
20 是履历值,平衡内存占用与性能(避免频仍扩容)。

5 初始化 open_files 列表

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

  1. {
  2.     ngx_destroy_pool(pool);
  3.     return NULL;
  4. }
复制代码
若初始化失败,烧毁内存池并终止函数。
确保失败时释放所有已分配资源


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表