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

 更新时间:2016年07月13日 17:41:38   作者:zeyu203  
Nginx由其自己实现的内存池结构对内存进行管理,这里我们就来详解Nginx的基本内存池初始化配置,需要的朋友可以参考下

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;

// 创建内存池 1KB
init_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_cycle
if (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>
}

如下图所示:

2016713173754271.png (698×939)

相关文章

  • Nginx 代理解决跨域问题多种情况分析

    Nginx 代理解决跨域问题多种情况分析

    这篇文章主要介绍了Nginx 代理解决跨域问题分析,通过用网站8080访问Nginx代理后的接口地址,报错分为多种情况,每种情况给大家详细分析,感兴趣的朋友一起看看吧
    2022-01-01
  • Nginx gateway集群和动态网关的实现思路

    Nginx gateway集群和动态网关的实现思路

    这篇文章主要介绍了Nginx gateway集群和动态网关,动态网关即任何配置都实现不用重启网关服务器都可以及时刷新,对Nginx gateway集群相关知识感兴趣的朋友一起看看吧
    2022-10-10
  • 让Nginx支持shtml格式的配置方法

    让Nginx支持shtml格式的配置方法

    这篇文章主要介绍了让Nginx支持shtml格式的配置方法,shtml格式可以包含一些服务端指令,同PHP中的include功能类似,需要的朋友可以参考下
    2014-08-08
  • Nginx层面配置基础用户验证的完整步骤

    Nginx层面配置基础用户验证的完整步骤

    这篇文章主要给大家介绍了关于Nginx层面配置基础用户验证的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Nginx具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • 在Nginx用htpasswd对网站进行密码保护的设置方法

    在Nginx用htpasswd对网站进行密码保护的设置方法

    很多时候我们需要对一些网站进行密码保护,比如团队内部的站点、demo站点等等。这里所说的密码保护是服务器级的,并非网站应用层的注册登录那一套,而是利用服务器配置和htpasswd文件来实现访问的密码验证
    2013-06-06
  • 关于nginx负载均衡和反向代理的讲解

    关于nginx负载均衡和反向代理的讲解

    这篇文章主要介绍了nginx负载均衡和反向代理,具有很好的参考价值,希望对大家有所帮助,大家一起来看看吧
    2021-09-09
  • 基于域名、端口和IP搭建nginx虚拟主机

    基于域名、端口和IP搭建nginx虚拟主机

    本文给大家分享基于域名、端口和IP搭建nginx虚拟主机的内容,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-11-11
  • Nginx优化配置和内核优化 实现突破十万并发

    Nginx优化配置和内核优化 实现突破十万并发

    Nginx是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。本文介绍一些Nginx优化代码参数等
    2013-06-06
  • nginx部署后css、js、图片等样式不加载问题的两种解决方案

    nginx部署后css、js、图片等样式不加载问题的两种解决方案

    这篇文章主要介绍了nginx部署后css、js、图片等样式不加载问题的两种解决方案,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-12-12
  • nginx支持带下划线的header实现

    nginx支持带下划线的header实现

    如果header name中包含下划线,则忽略掉,本文主要介绍了nginx支持带下划线的header实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08

最新评论