侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

详解Nginx中基本的内存池初始化配置

linux  /  管理员 发布于 7年前   159

ngx_cycle 的初始化
整个初始化过程中,最重要的就是全局变量 nginx_cycle 的初始化,很多变量都是在这个过程中初始化的

nginx_cycle 又是通过两个局部变量 init_cycle 和 cycle 实现初始化的

事实上,日志初始化也可以算是对 nginx_cyle 的初始化,因为在代码中接下来马上要发生的就是一个赋值

ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));init_cycle.log = log;ngx_cycle = &init_cycle;// 创建内存池 1KBinit_cycle.pool = ngx_create_pool(1024, log);if (init_cycle.pool == NULL) { return 1;}// 保存调用参数到全局变量,init_cycle 只用于提供 log 参数if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) { return 1;}// 保存配置文件路径、程序运行路径、调用参数到 init_cycleif (ngx_process_options(&init_cycle) != NGX_OK) { return 1;}// 获取操作系统信息、CPU信息、最大连接数、是否支持非阻塞连接等if (ngx_os_init(log) != NGX_OK) { return 1;}/* * ngx_crc32_table_init() requires ngx_cacheline_size set in ngx_os_init() */// 对齐校验表if (ngx_crc32_table_init() != NGX_OK) { return 1;}// 获取所有继承连接fd的相关信息if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) { return 1;}

 

内存池
nginx 是通过资源集中管理的方式管理资源的,即打开所有即将要用的资源,以备随时取用,无论是文件还是内存

这样做的好处是避免了每次创建、打开资源造成的性能消耗

因此,便有了内存池模块,用来集中申请内存资源并进行内存资源的管理和分配

内存池结构:

// struct ngx_pool_data_t// 内存池数据块结构 {{{typedef struct { u_char    *last;  // 当前内存分配的结束位置 u_char    *end;  // 内存池的结束位置 ngx_pool_t   *next;  // 下一内存池 ngx_uint_t   failed; // 内存分配失败计数} ngx_pool_data_t; // }}}// struct ngx_pool_s// 内存池结构 {{{struct ngx_pool_s { ngx_pool_data_t  d;  // 内存池数据块 size_t    max;  // 待分配内存大小 ngx_pool_t   *current; // 指向当前内存池起始位置 ngx_chain_t   *chain; ngx_pool_large_t  *large; // 指向大块内存分配 ngx_pool_cleanup_t *cleanup; // 析构函数 ngx_log_t   *log;  // 内存分配相关的log}; // }}}

在这个函数中,使用了一个封装好的函数 ngx_memalign,这个函数是对系统中按照数据对齐方式分配内存的函数的封装,在不同的系统中实现方式不同,通过宏定义,实现了操作系统的适配,这是一个很漂亮的技巧

#if (NGX_HAVE_POSIX_MEMALIGN)// void * ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)// 用数据对齐的方式进行内存分配 {{{void *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log){ void *p; int err; // size 单位是 byte 而不是 bit err = posix_memalign(&p, alignment, size); if (err) {  ngx_log_error(NGX_LOG_EMERG, log, err,      "posix_memalign(%uz, %uz) failed", alignment, size);  p = NULL; } ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0,     "posix_memalign: %p:%uz @%uz", p, size, alignment); return p;} // }}}#elif (NGX_HAVE_MEMALIGN)// void * ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)// 用数据对齐的方式进行内存分配 {{{void *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)

所有有关内存分配的系统调用函数的封装都定义在 ngx_alloc.c 文件中

这里用到了 posix_memalign 系统调用,使用这个系统调用分配出来的内存是默认按照第二个参数的大小对齐的,这样在进行数据读写的时候,CPU可以周期地对整块数据进行读写,很大程度的节省了CPU时间

这个系统调用所分配的内存也是存在于堆内存中的,可以使用 free 函数进行释放,不过 malloc 分配的内存默认也是对齐的,它相对于 malloc 的优势仅仅在于可以指定默认对齐大小。
函数完成了内存池的初步分配,执行后 pool 取值:

$23 = (ngx_pool_t *) 0x80fe9f0(gdb) p *init_cycle.pool$24 = { d = { last = 0x80fea18,  end = 0x80fedf0,  next = 0x0,  failed = 0 },  max = 984,  current = 0x80fe9f0,  chain = 0x0,  large = 0x0,  cleanup = 0x0,  log = 0x80e3020 <ngx_log>}

如下图所示:


  • 上一条:
    全面了解Nginx中的HTTP协议相关模块配置
    下一条:
    解析Nginx中的日志模块及日志基本的初始化和过滤配置
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在Linux系统中使用Iptables实现流量转发功能流程步骤(0个评论)
    • vim学习笔记-入门级需要了解的一些快捷键(0个评论)
    • 在centos7系统中实现分区并格式化挂载一块硬盘到/data目录流程步骤(0个评论)
    • 在Linux系统种查看某一个进程所占用的内存命令(0个评论)
    • Linux中grep命令中的10种高级用法浅析(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-11
    • 2017-07
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-03
    • 2022-04
    • 2022-08
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-06
    • 2023-07
    • 2023-10
    • 2023-12
    • 2024-01
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客