当前位置: 首页 > news >正文

Ubuntu 下 nginx-1.24.0 源码分析 - NGX_MAX_ALLOC_FROM_POOL

NGX_MAX_ALLOC_FROM_POOL

定义在 src\core\ngx_palloc.h

#define NGX_MAX_ALLOC_FROM_POOL  (ngx_pagesize - 1)

在 src/os/unix/ngx_alloc.h

extern ngx_uint_t  ngx_pagesize;

这个全局变量定义在

src\os\unix\ngx_alloc.c 中

ngx_uint_t  ngx_pagesize;

在 src/os/unix/ngx_posix_init.c

ngx_int_t
ngx_os_init(ngx_log_t *log)
{ngx_time_t  *tp;ngx_uint_t   n;
#if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)long         size;
#endif#if (NGX_HAVE_OS_SPECIFIC_INIT)if (ngx_os_specific_init(log) != NGX_OK) {return NGX_ERROR;}
#endifif (ngx_init_setproctitle(log) != NGX_OK) {return NGX_ERROR;}ngx_pagesize = getpagesize();

这里被赋值


getpagesize 函数用于获取系统的内存页大小(page size)。

内存页是操作系统管理内存的基本单位,通常以字节为单位。

不同的操作系统和硬件架构可能会有不同的页大小,常见的页大小有 4KB、8KB、16KB 等。


getpagesize 函数返回系统的页大小,单位为字节(bytes)

为了使用 getpagesize 函数,你需要包含以下头文件:

#include <unistd.h>

在第一次使用时(main 函数中首次使用 ngx_create_pool)

 p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;

这里 还未执行 ngx_os_init 函数,ngx_pagesize 还未被赋值(初始值为0,64 位无符号整数 - 1 = 18446744073709551615)

所以这里 p->max 的值是 size 的值


NGX_MAX_ALLOC_FROM_POOL 为什么要设置为 ngx_pagesize - 1?

避免跨页分配

a. 内存页的概念
  • 操作系统以页(page)为单位管理内存,常见的页大小为 4KB(4096 字节)或 8KB(8192 字节)。
  • 分配内存时,操作系统通常会按页分配,即使只需要少量内存,也会分配整个页。
b. 跨页分配的问题
  • 如果从内存池中分配的内存块大小接近或等于一页(如 4096 字节),可能会导致跨页分配。
  • 跨页分配会增加内存管理的复杂性,并可能导致性能下降。例如:
    • 缓存未命中率增加:数据分布在多个缓存行中,访问效率降低。
    • 内存对齐问题:跨页分配可能导致未对齐访问,影响性能。

  • 将最大分配大小限制为 ngx_pagesize - 1,可以确保分配的内存块始终位于单个页内,避免跨页问题。
  • 例如,如果页大小为 4096 字节,则 NGX_MAX_ALLOC_FROM_POOL 的值为 4095 字节,确保分配的内存不会跨越页边界。

提高内存利用率

a. 小块内存分配
  • Nginx 的内存池主要用于分配小块内存(如 HTTP 请求头、连接上下文等)。
  • 这些小块内存的大小通常远小于 ngx_pagesize,因此将最大分配大小限制为 ngx_pagesize - 1 可以充分利用内存池的空间。
b. 大块内存分配
  • 如果需要分配的内存大小超过 ngx_pagesize - 1,Nginx 会使用单独的大块内存分配机制(通过 large 链表管理)。
  • 这种设计可以避免大块内存占用内存池空间,从而提高内存池的利用率。

简化内存管理

a. 内存池的设计目标
  • 内存池的设计目标是高效地管理小块内存分配。
  • 如果允许从内存池中分配过大的内存块,可能会增加内存池的复杂性。例如:
    • 需要额外的链表或数据结构来跟踪大块内存的使用情况。
    • 剩余的内存空间可能不足以满足其他分配请求,导致内存浪费。
b. 分离小块和大块内存
  • 通过将最大分配大小限制为 ngx_pagesize - 1,可以将小块内存和大块内存的管理逻辑分离:
    • 小块内存直接从内存池中分配,管理简单高效。
    • 大块内存通过单独的分配机制(如 mallocngx_alloc)进行管理,避免干扰内存池。

相关文章:

Ubuntu 下 nginx-1.24.0 源码分析 - NGX_MAX_ALLOC_FROM_POOL

NGX_MAX_ALLOC_FROM_POOL 定义在 src\core\ngx_palloc.h #define NGX_MAX_ALLOC_FROM_POOL (ngx_pagesize - 1) 在 src/os/unix/ngx_alloc.h extern ngx_uint_t ngx_pagesize; 这个全局变量定义在 src\os\unix\ngx_alloc.c 中 ngx_uint_t ngx_pagesize; 在 src/os/unix/ngx_…...

PyQt6/PySide6 的 SQL 数据库操作(QtSql)

一、核心组件架构 1.1 QtSql模块构成 QSqlDatabase&#xff1a;数据库连接管理&#xff08;支持连接池&#xff09;QSqlQuery&#xff1a;SQL语句执行与结果遍历QSqlTableModel&#xff1a;可编辑的表格数据模型QSqlQueryModel&#xff1a;只读查询结果模型QSqlRelationalTab…...

利用IDEA将Java.class文件反编译为Java文件:原理、实践与深度解析

文章目录 引言&#xff1a;当.class文件遇到源代码缺失第一章&#xff1a;反编译技术基础认知1.1 Java编译执行原理1.2 反编译的本质1.3 法律与道德边界 第二章&#xff1a;IDEA内置反编译工具详解2.1 环境准备2.2 三步完成基础反编译2.3 高级反编译技巧2.3.1 调试模式反编译2.…...

Kafka偏移量管理全攻略:从基础概念到高级操作实战

#作者&#xff1a;猎人 文章目录 前言&#xff1a;概念剖析kafka的两种位移消费位移消息的位移位移的提交自动提交手动提交 1、使用--to-earliest重置消费组消费指定topic进度2、使用--to-offset重置消费offset3、使用--to-datetime策略指定时间重置offset4、使用--to-current…...

【R语言】GitHub Copilot安装-待解决

参考&#xff1a; 文章目录...

软件定义汽车时代的功能安全和信息安全

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…...

qt的QSizePolicy的使用

使用 QSizePolicy 设置控件的伸缩因子 在 Qt 中&#xff0c;QSizePolicy 控制 控件如何在布局中伸缩。如果想要影响控件的大小调整行为&#xff0c;可以通过 QSizePolicy::setHorizontalStretch() 和 QSizePolicy::setVerticalStretch() 设置伸缩因子。 基本用法 假设我们有一个…...

简单几个步骤完成 Oracle 到金仓数据库(KingbaseES)的迁移目标

作为国产数据库的领军选手&#xff0c;金仓数据库&#xff08;KingbaseES&#xff09;凭借其成熟的技术架构和广泛的市场覆盖&#xff0c;在国内众多领域中扮演着至关重要的角色。无论是国家电网、金融行业&#xff0c;还是铁路、医疗等关键领域&#xff0c;金仓数据库都以其卓…...

DeepSeek自动化写作软件

DeepSeek写作软件的三大核心功能 对于内容创作者来说&#xff0c;写作不仅是表达思想的过程&#xff0c;更是一项需要投入大量时间和精力的任务。面对日益增长的内容需求&#xff0c;写作效率低下、内容质量不高等问题&#xff0c;常常让创作者感到焦虑。而 DeepSeek 写作软件…...

【kafka系列】Kafka如何实现高吞吐量?

目录 1. 生产者端优化 核心机制&#xff1a; 关键参数&#xff1a; 2. Broker端优化 核心机制&#xff1a; 关键源码逻辑&#xff1a; 3. 消费者端优化 核心机制&#xff1a; 关键参数&#xff1a; 全链路优化流程 吞吐量瓶颈与调优 总结 Kafka的高吞吐能力源于其生…...

learn_pytorch03

第三章 深度学习分为如下几个步骤 1&#xff1a;数据预处理&#xff0c;划分训练集和测试集 2&#xff1a;选择模型&#xff0c;设定损失函数和优化函数 3&#xff1a;用模型取拟合训练数据&#xff0c;并在验证计算模型上表现。 接着学习了一些数据读入 模型构建 损失函数的构…...

机器学习:k近邻

所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com)&#xff0c;欢迎查看。 K 邻近算法&#xff08;K-Nearest Neighbors&#xff0c;简称 KNN&#xff09;是一种经典的机器学习算法&#xff0c;主要用于分类和回归任务…...

redis之lua实现原理

文章目录 创建并修改Lua环境Lua环境协作组件伪客户端lua scripts字典 EVAL命令的实现定义脚本函数执行脚本函数 EVALSHA命令的实现脚本管理命令的实现SCRIPT FLUSHSCRIPTEXISTSSCRIPT LOADSCRIPT KILL 脚本复制复制 EVAL命令、SCRIPT FLUSH命令和SCRIPT LOAD命令* 复制EVALSHA命…...

[Android] 【汽车OBD软件】Torque Pro (OBD 2 Car)

[Android] 【汽车OBD软件】Torque Pro &#xff08;OBD 2 & Car&#xff09; 链接&#xff1a;https://pan.xunlei.com/s/VOIyKOKHBR-2XTUy6oy9A91yA1?pwdm5jm# 获取 OBD 故障代码、汽车性能数据等等。Torque 使用连接到您的 OBD2 发动机管理/ECU 的 OBD II 蓝牙适配器。…...

安全问答—安全的基本架构

前言 将一些安全相关的问答进行整理汇总和陈述&#xff0c;形成一些以问答呈现的东西&#xff0c;加入一些自己的理解&#xff0c;欢迎路过的各位大佬进行讨论和论述。很多内容都会从甲方的安全认知去进行阐述。 1.安全存在的目的&#xff1f; 为了支持组织的目标、使命和宗…...

Java 运行时常量池笔记(详细版

&#x1f4da; Java 运行时常量池笔记&#xff08;详细版&#xff09; Java 的运行时常量池&#xff08;Runtime Constant Pool&#xff09;是 JVM 方法区的一部分&#xff0c;用于存储编译期生成的字面量和符号引用。它是 Java 类文件常量池的运行时表示&#xff0c;具有动态…...

mysql增加字段操作以及关键字报错

修改mysql DDL语言 修改代码中domain 修改mapper中信息 java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near index, date, scroll_id, shard_ser…...

Wireshark 输出 数据包列表本身的值

在 Wireshark 中&#xff0c;如果你想输出数据包列表本身的值&#xff08;例如&#xff0c;将数据包的摘要信息、时间戳、源地址、目的地址等导出为文本格式&#xff09;&#xff0c;可以使用 导出为纯文本文件 的功能。以下是详细步骤&#xff1a; 步骤 1&#xff1a;打开 Wir…...

日常开发中,使用JSON.stringify来实现深拷贝的坑

使用JSON.stringify的方式来实现深拷贝的弊端 弊端一&#xff1a;无法拷贝NaN、Infinity、undefined这类值 无法拷贝成功的原因&#xff1a; 对于JSON来说&#xff0c;它支持的数据类型只有null、string、number、boolean、Object、Array&#xff0c;所以对于它不支持的数据类…...

【探商宝】:大数据与AI赋能,助力中小企业精准拓客引

引言&#xff1a;在数据洪流中&#xff0c;如何精准锁定商机&#xff1f; 在竞争激烈的商业环境中&#xff0c;中小企业如何从海量信息中快速筛选出高价值客户&#xff1f;如何避免无效沟通&#xff0c;精准触达目标企业&#xff1f; 探商宝——一款基于大数据与AI技术的企业信…...

火旺电报|微软OpenAI关系调整 Meta并购受阻 懂游宝并购 阿里医疗AI落地 iphone折叠屏动向

2026年4月29日 火旺电报科技快讯速递全球科创动态 关注产业变化节奏4月27日微软与OpenAI对合作结构作出调整释放多云信号&#xff0c;同日Meta约20亿美元并购在监管层面被否决&#xff0c;游戏平台并购继续推动行业集中&#xff0c;阿里4月28日推进肠癌AI筛查应用&#xff0c;而…...

手把手教你配置TMS320F28335的SCI串口(从寄存器到代码实战)

深入解析TMS320F28335的SCI串口开发&#xff1a;从寄存器配置到代码实战 在嵌入式系统开发中&#xff0c;串口通信是最基础也最关键的通信方式之一。对于使用德州仪器(TI)TMS320F28335数字信号处理器的开发者来说&#xff0c;掌握其串行通信接口(SCI)的底层配置是必备技能。本文…...

避开这3个坑,你的SAM模型训练效果才能翻倍

避开这3个坑&#xff0c;你的SAM模型训练效果才能翻倍 训练一个高性能的Segment Anything Model&#xff08;SAM&#xff09;就像在迷宫中寻找出口——即使你掌握了基本路线&#xff0c;也难免会踩中几个隐藏的陷阱。作为计算机视觉领域最令人兴奋的突破之一&#xff0c;SAM以其…...

Wireshark ExpertInfo是什么?一文讲透异常分级、适用场景、和传统抓包阅读的区别与排查标准

Wireshark Expert Info 是什么&#xff1f;一文讲透异常分级、适用场景、和传统抓包阅读的区别与排查标准 很多人第一次打开 Wireshark&#xff0c;都先盯着红色报文、黑色高亮&#xff0c;越看越慌&#xff1b;结果抓了半天包&#xff0c;最后定位结论还是一句“网络好像有问题…...

构建多模型备选策略以应对单一 API 服务不稳定的工程实践

构建多模型备选策略以应对单一 API 服务不稳定的工程实践 1. 多模型接入的价值与挑战 在生产环境中依赖单一模型供应商的API服务存在潜在风险。当服务出现高延迟、配额耗尽或临时故障时&#xff0c;缺乏备选方案可能导致业务中断。Taotoken提供的多模型聚合能力允许开发者通过…...

3步掌握RyzenAdj:从性能焦虑到精准控制的锐龙处理器调校指南

3步掌握RyzenAdj&#xff1a;从性能焦虑到精准控制的锐龙处理器调校指南 【免费下载链接】RyzenAdj Adjust power management settings for Ryzen APUs 项目地址: https://gitcode.com/gh_mirrors/ry/RyzenAdj 你是否曾为笔记本电脑续航不足而焦虑&#xff0c;或为游戏卡…...

如何永久保存微信聊天记录:WeChatMsg完整备份与导出终极指南

如何永久保存微信聊天记录&#xff1a;WeChatMsg完整备份与导出终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...

怎么查快递最快?2026年高效率查件工具五强出炉

说句实在话&#xff0c;2026年了&#xff0c;下单买东西确实爽&#xff0c;但等快递的过程依然像是一场“漫长”的修行。最烦人的莫过于在几十条取件短信和通知里翻找单号&#xff0c;那种焦虑感&#xff0c;想必大家深有体会。 如果你还在纠结怎么查快递最快&#xff0c;或者到…...

Unlock Music:浏览器内一键解锁加密音乐文件的终极指南 [特殊字符]

Unlock Music&#xff1a;浏览器内一键解锁加密音乐文件的终极指南 &#x1f3b5; 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web …...

吊顶式空调机组怎么选?

一、吊顶式空调机组&#xff1a;节省空间的高效制冷制热设备吊顶式空调机组凭借节省空间、运行高效、适配性强的优势&#xff0c;广泛应用于办公室、商场、医院等各类场所。其采用吊顶安装设计&#xff0c;不占用地面空间&#xff0c;可灵活融入各类建筑布局&#xff0c;同时具…...