Nginx源码阅读(五):启动前的准备

我请问一下,Nginx源码阅读(五):启动前的准备
最新回答
珍藏版╮宝贝

2024-11-25 07:15:49

在 Nginx 启动前,一系列初始化流程和变量设定至关重要。这些准备工作确保 Nginx 正常运行,高效管理资源并优化性能。接下来,我们将分步骤详细介绍 Nginx 启动前的准备过程。


1. ngx_os_init 获取系统级资源

ngx_os_init 负责初始化操作系统级资源,将关键参数赋值给全局变量。这些参数包括页面大小、缓存行大小、最大套接字数等。


系统级参数获取依赖于 sysconf 函数,它用于查询系统特定参数,如 CPU 核心数量、内存大小、进程打开的最大文件数等。



  • _SC_NPROCESSORS_CONF


    返回 CPU 核心数量,包括不可用核心。

  • _SC_NPROCESSORS_ONLN


    返回系统中可用的 CPU 核心数量。

  • _SC_PAGESIZE


    表示系统页面大小(字节单位)。

  • _SC_PHYS_PAGES


    表示系统物理内存页数。

  • _SC_OPEN_MAX


    表示进程可以打开的最大文件数。

  • _SC_GETPW_R_SIZE_MAX


    表示 getpwuid_r 函数使用的缓冲区大小限制。


另一个关键函数 ngx_cpuinfo 用于获取 CPU 的 L2 缓存行大小。理解 CPU 缓存级别有助于优化 Nginx 性能。



  • L1 缓存位于 CPU 核心内,是最快的缓存层。

  • L2 缓存在 CPU 芯片上,但比 L1 缓存距离核心更远。

  • L3 缓存位于 CPU 外部,速度仅次于内存,但大小较大。


不同 CPU 的缓存大小差异显著,如图所示。L1 和 L2 缓存通常在 CPU 核之间不共享,而 L3 缓存为所有核心共享。


此外,getrlimit 和 setrlimit 函数用于查询和更改进程资源限制。rlimit 结构体参数用于指定资源限制,如最大句柄数,即最大可创建的套接字数量。


2. ngx_crc32_table_init 初始化 CRC 表

此函数初始化循环冗余校验(CRC)表,确保计算效率。通过将指向校验表格的指针ngx_crc32_table_short 对齐至缓存行大小,提高性能。


CRC 是一种用于检测数据传输或保存错误的校验方法。生成的数字附加至数据后,接收端进行验证以确保数据未变。具体原理可参考网络资料。


3. ngx_add_inherited_sockets 继承套接字

在平滑升级场景下,ngx_add_inherited_sockets 用于继承原有监听套接字。通过环境变量 NGINX 获取套接字信息,将其加入 init_cycle 的 listening 数组。完成继承后,设置全局变量 ngx_inherited 为 1。


此函数仅在平滑升级过程中使用,通常情况下无需执行。因此,我们不对该函数进行过多讨论。