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)进行管理,避免干扰内存池。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20029.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5分钟了解! 探索 AnythingLLM,借助开源 AI 打造私有化智能知识库,熟悉向量数据库

本文是系列文章&#xff0c;在前面提到安装Ollama和AnythingLLM的教程&#xff0c;本文会着重解决本地文档向量化的过程&#xff0c;同时本地应用的管理。 图1. 上传本地文档进行向量化处理 • 构建向量数据库特别慢&#xff1a;支持的文档格式很多&#xff0c;但在我的电脑32…

电商小程序(源码+文档+部署+讲解)

引言 随着移动互联网的快速发展&#xff0c;电商小程序成为连接消费者与商家的重要桥梁。电商小程序通过数字化手段&#xff0c;为消费者提供了一个便捷、高效的购物平台&#xff0c;从而提升购物体验和满意度。 系统概述 电商小程序采用前后端分离的架构设计&#xff0c;服…

基于SpringBoot的“高考志愿智能推荐系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“高考志愿智能推荐系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统首页界面 系统注册页…

合并多次commit记录

合并多次commit记录 1. 首先先提交多次记录2. 某个版本之前的commit记录合并 1. 首先先提交多次记录 在log中可以看到有多次commit 记录 然后拉取最新代码 (base) ➜ gaolijie git:(master) git pull --rebase origin masterFrom https://gitee.com/Blue_Pepsi_Cola/gaoliji…

哈希表(C语言版)

文章目录 哈希表原理实现(无自动扩容功能)代码运行结果 分析应用 哈希表 如何统计一段文本中&#xff0c;小写字母出现的次数? 显然&#xff0c;我们可以用数组 int table[26] 来存储每个小写字母出现的次数&#xff0c;而且这样处理&#xff0c;效率奇高。假如我们想知道字…

uniapp商城之首页模块

文章目录 前言一、自定义导航栏1.静态结构2.修改页面配置3.组件安全区适配二、通用轮播组件1. 静态结构组件2.自动导入全局组件3.首页轮播图数据获取三、首页分类1.静态结构2.首页获取分类数据并渲染四、热门推荐1.静态结构2.首页获取推荐数据并渲染3.首页跳转详细推荐页五、猜…

CNAPPgoat:一款针对云环境的安全实践靶场

关于CNAPPgoat CNAPPgoat是一款针对云环境的安全实践靶场&#xff0c;该工具旨在帮助广大研究人员在云环境中模块化地提供故意留下安全缺陷的设计组件&#xff0c;专为防御者和渗透测试人员提供练习场地而设计。 CNAPPgoat的主要功能是跨多个云服务提供商部署故意留下安全缺陷…

【学习资源】时间序列数据分析方法(2)-mWDN和AutoEncoder

接着上次的【学习资源】时间序列数据分析方法&#xff08;1&#xff09;-CSDN博客&#xff0c;本次介绍mWDN和AutoEncoder 解决时序数据分类的方法。介绍模型原理、应用场景和参考代码。也从模型性能、训练效率、模型复杂度、计算复杂度、可解释性、适应性和泛化能力、健壮性、…

【C++】stack 和 queue 的适配器模式与实现

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…

Chrome多开终极形态解锁!「窗口管理工具+IP隔离插件

Web3项目多开&#xff0c;继ads指纹浏览器钱包被盗后&#xff0c;更多人采用原生chrome浏览器&#xff0c;当然对于新手&#xff0c;指纹浏览器每月成本也是一笔不小开支&#xff0c;今天逛Github发现了这样一个解决方案&#xff0c;作者开发了窗口管理工具IP隔离插件&#xff…

从零开始部署DeepSeek:基于Ollama+Flask的本地化AI对话系统

从零开始部署DeepSeek&#xff1a;基于OllamaFlask的本地化AI对话系统 一、部署背景与工具选型 在AI大模型遍地开花的2025年&#xff0c;DeepSeek R1凭借其出色的推理能力和开源特性成为开发者首选。本文将以零基础视角&#xff0c;通过以下工具链实现本地化部署&#xff1a; …

python旅游推荐系统+爬虫+可视化(协同过滤算法)

✅️基于用户的协同过滤算法 ✅️有后台管理 ✅️2w多数据集 这个旅游数据分析推荐系统采用了Python语言、Django框架、MySQL数据库、requests库进行网络爬虫开发、机器学习中的协同过滤算法、ECharts数据可视化技术&#xff0c;以实现从网站抓取旅游数据、个性化推荐和直观展…

以 Serverless 低成本的⽅式 快速在亚马逊云科技上部署 DeepSeek

2025年春节&#xff0c;最令人瞩目的无疑是DeepSeek的惊艳亮相&#xff0c;它以颠覆性的创新迅速席卷全球&#xff0c;成为街谈巷议的热点。无论是在地铁车厢里&#xff0c;还是公司茶水间&#xff0c;DeepSeek都成了人们津津乐道的话题。社交平台上&#xff0c;网友们争相分享…

win10 系统 自定义Ollama安装路径 及模型下载位置

win10 系统 自定义Ollama安装路径 及模型下载位置 由于Ollama的exe安装软件双击安装的时候默认是在C盘&#xff0c;以及后续的模型数据下载也在C盘&#xff0c;导致会占用C盘空间&#xff0c;所以这里单独写了一个自定义安装Ollama安装目录的教程。 Ollama官网地址&#xff1…

CAP与BASE:分布式系统设计的灵魂与妥协

CAP 理论 CAP理论起源于 2000 年&#xff0c;由加州大学伯克利分校的 Eric Brewer 教授在分布式计算原理研讨会&#xff08;PODC&#xff09;上提出&#xff0c;因此 CAP 定理又被称作 布鲁尔定理&#xff08;Brewer’s theorem&#xff09; 2 年后&#xff0c;麻省理工学院的 …

电动汽车电池监测平台系统设计(论文+源码+图纸)

1总体设计 本次基于单片机的电池监测平台系统设计&#xff0c;其整个系统架构如图2.1所示&#xff0c;其采用STC89C52单片机作为控制器&#xff0c;结合ACS712电流传感器、TLC1543模数转换器、LCD液晶、DS18B20温度传感器构成整个系统&#xff0c;在功能上可以实现电压、电流、…

docker下部署kong+consul+konga 报错问题处理

前言&#xff1a; 由于在docker下部署一些项目比较特殊&#xff0c;特别是网络这一块&#xff0c;如果没有搞清楚&#xff0c;是很容易出问题的。 先上docker-compose 编排 这里的docker-compose for kong可以在 kong-compose 获取代码 version: 3.9x-kong-config:&kong…

装饰器模式

参考 装饰者模式 【设计模式实战】装饰器模式 1. HistorySet的例子 HistorySet 可以在实现的Set的基础上&#xff0c;在remove时保留删除的元素。通过将方法委托给现有的Set&#xff0c;在remove时先保留被删除元素后委托给注入的set进行remove public class HistorySet<…

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

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

【Golang】GC探秘/写屏障是什么?

之前写了 一篇【Golang】内存管理 &#xff0c;有了很多的阅读量&#xff0c;那么我就接着分享一下Golang的GC相关的学习。 由于Golang的GC机制一直在持续迭代&#xff0c;本文叙述的主要是Go1.9版本及以后的GC机制&#xff0c;该版本中Golang引入了 混合写屏障大幅度地优化了S…