Nginx内存池相关源码剖析(三)小块内存分配逻辑

news2024/12/23 1:28:42

在Nginx中,小块内存通常指的是那些大小相对较小、分配和释放频率较高的内存块。这些内存块由于数量众多、管理复杂,因此需要使用一种高效的内存管理机制来减少内存管理的开销和内存碎片的产生。

Nginx内存池通过一种预分配和复用的方式来管理小块内存。当需要分配小块内存时,内存池会首先检查是否已经有可用的内存块。如果有,则直接从中分配一个;如果没有,则根据预设的规则进行内存块的预分配。这种预分配的策略可以确保在需要时能够快速获取到内存块,避免了频繁的malloc和free操作带来的开销。 

ngx_palloc_small函数

分配小块内存空间

static ngx_inline void *
ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align) // align表示是否考虑内存对齐
{
    u_char      *m;
    ngx_pool_t  *p;

    p = pool->current; // 每次都从内存池中current块进行分配内存

    do {
        m = p->d.last; // 可分配内存的起始地址

        if (align) {
            m = ngx_align_ptr(m, NGX_ALIGNMENT); // 将m调整到 平台相关的ulong 的整数倍
        }

        if ((size_t) (p->d.end - m) >= size) { // 内存池空闲内存空间 >= 申请的内存空间
            p->d.last = m + size; // 向下偏移到新的可分配起始地址

            return m;
        }

        p = p->d.next; // 本块剩余空闲内存不够,则向后(小块内存池链上的下一块)寻找

    } while (p);

    // 找到末尾发现当前内存块链表的空闲内存不够用,则调用函数新分配一个内存块
    return ngx_palloc_block(pool, size); 
}

当前剩余空间够用的情况下,直接分配空闲内存的示意图:

ngx_palloc_block函数

当前剩余空间不够用的时候,开辟已一个新的内存块添加到(链接)内存池中,供小内存分配使用。

static void *
ngx_palloc_block(ngx_pool_t *pool, size_t size)
{
    u_char      *m;
    size_t       psize;
    ngx_pool_t  *p, *new;

    // 计算pool的带头信息的已使用内存的大小
    psize = (size_t) (pool->d.end - (u_char *) pool); 

    // 开辟内存对齐psize大小的内存块
    m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log); 
    if (m == NULL) {
        return NULL;
    }

    new = (ngx_pool_t *) m; // new指向新开辟块的起始地址

    new->d.end = m + psize; // 指向新块的末尾地址
    new->d.next = NULL;
    new->d.failed = 0;

    // m指向每块头信息ngx_pool_data_t之后的可用起始地址
    m += sizeof(ngx_pool_data_t); 

    // 调整对齐倍数,准备将m分配出去
    m = ngx_align_ptr(m, NGX_ALIGNMENT); 
    new->d.last = m + size; // 分配出size,指向新空闲地址

	// 对已有的成链的各块,若从current块开始分配内存失败多于4次
	// 说明current块的剩余可用内存很小了,认为很难再分配出去
	// 就将下一个块作为current块
    for (p = pool->current; p->d.next; p = p->d.next) {
        if (p->d.failed++ > 4) {
            pool->current = p->d.next;
        }
    }

    p->d.next = new; // 将内存块成链(尾插法)

    return m; // 返回新分配的给用户的地址
}

调用ngx_palloc_block函数分配新的内存块示意图:

总结——没有释放和回收逻辑

 值得注意的是,Nginx内存池没有提供小块内存的释放和回收的任何逻辑。这是由Nginx的工作环境所决定的。

nginx本质是http服务器,是一个短链接的服务器,客户端(浏览器)发起一个request请求,到达nginx服务器以后,处理完成,nginx给客户端返回一个response响应,http服务器就主动断开tcp连接。即使http 1.1 keep-avlie可以保持60s,但也只是60s。http服务器(nginx)返回响应以后,需要等待60s,60s之内客户端又发来请求,重置这个时间,否则60s之内没有客户端发来的响应,nginx就主动断开连接,此时nginx可以调用ngx_reset_pool重置内存池了,等待下一次该客户端的请求。

所以没有小内存的释放逻辑也是合乎其工作方式,因为每个内存池在一段时间内一定会被reset成空内存池,加上小内存释放逻辑反而可能会降低服务器性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1688店铺商品接口全攻略:一键获取商品信息,轻松玩转电商数据!

1688店铺所有商品接口技术详解 一、引言 随着电子商务的快速发展,越来越多的商家选择通过1688平台开展业务。为了方便商家获取店铺内所有商品的信息,1688平台提供了相应的API接口。本文将详细介绍如何使用这些接口获取店铺所有商品的信息,以…

Learn something about front end——颜色

​ 好装的标题啊哈哈哈哈哈哈 最近get了一个学习前端的网站叫FreeCodeCamp 原色:rgb三个值的其中一个值拉满,比如说rgb(255,0,0)是红色这样,三个主色: 红色 rgb(255, 0, 0) #FF0000绿色 rgb(0, 255, 0) #00FF00蓝色 rgb(0, 0, …

记录-海思开发板的 嵌入式nginx和 php的移植(交叉编译环境配置)

嵌入式 lnmp搭建的记录 N:NginxP:php编译PHP可能遇到的问题configure阶段:Makefile-make阶段:Makefile-make install阶段: 文章比较水,并没有没解决什么实际问题,有点不好意思发布。但好像又记录…

网工交换技术基础——VLAN原理

1、VLAN的概念: VLAN(Virtual LAN),翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域。 2、VLAN的主要作用&#xf…

【网站项目】学生选课系统小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Pandas数据分析学习笔记

前言 开刷Pandas数据分析,看起来很好理解,不过没做笔记没敲代码心里总是不安稳,所以复现下课程代码并演示其中遇到的问题,顺便水一水笔记好了 参考资料: 课程视频链接:Pandas数据分析从入门到实战 数据…

福州复式装修,115平四室三厅现代简约风。福州中宅装饰,福州装修

设计亮点 设计理念: 静享时光谧境 克制的优雅,简约的沉淀 以光为引,以意为境 案例简介: 该方案现代风格为整个设计带来现代的舒适感,各种材质相互碰撞的设计,即保持着整齐的视感,又将高级气质凸…

分布式锁设计

一 分布式环境互斥实现 1 数据库锁 1.1 悲观锁 innodb行锁 共享锁(S Lock):允许事务读一行数据,具有锁兼容性质,允许多个事务同时获得该锁。排它锁(X Lock):允许事务删除或更新一行数据,具有…

ATA-300系列功率放大器全新升级

一、公司介绍 Aigtek是国产专业从事测量仪器研发、生产和销售的高科技企业。公司主要研发和生产功率放大器、功率放大器模块、功率信号源、计量校准源等产品。核心团队主要是来自西安交通大学及西北工业大学的专家教授等联合组成研发团队,目前拥有数量众多的专利和…

Java | Leetcode Java题解之第32题最长的有效括号

题目&#xff1a; 题解&#xff1a; class Solution {public int longestValidParentheses(String s) {int left 0, right 0, maxlength 0;for (int i 0; i < s.length(); i) {if (s.charAt(i) () {left;} else {right;}if (left right) {maxlength Math.max(maxlen…

YOLOv9最新改进系列:融合混合注意力机制CBAM,关注通道和空间特征,助力YOLOv9新模型快速涨点!

YOLOv9最新改进系列&#xff1a;融合混合注意力机制CBAM&#xff0c;关注通道和空间特征&#xff0c;助力YOLOv9新模型快速涨点&#xff01; YOLOv9原文链接戳这里&#xff0c;原文全文翻译请关注B站Ai学术叫叫首er B站全文戳这里&#xff01; 详细的改进教程以及源码&#…

各大厂都推出鸿蒙APP了,你就一定要学习一下鸿蒙APP测试了!

2023年8月&#xff0c;华为推出鸿蒙4.0&#xff0c;由于其广泛的用户基础和品牌传播力&#xff0c;在短短几个月的时间&#xff0c;使用鸿蒙4.0系统的设备就达到千万级别&#xff0c;并且在9月份发售Mate 6之后&#xff0c;还在装机量的增长更加迅猛。 基于此&#xff0c;11月…

【Harmony3.1/4.0】学习笔记一

Harmong3.1/4.0是基于ArkTS编程语言的操作系统&#xff0c;本文开始将逐渐讲解和学习鸿蒙操作系统的知识。 1.线性布局(Row/Column)综合使用 线性布局结合文本控件&#xff0c;图片控件和按钮控件完成简单的鸿蒙移动应用开发界面 其ArkTS代码如下&#xff1a; Entry Compone…

Compose 简单组件

文章目录 Compose 简单组件TextText属性使用AnnotatedStringSpanStyleParagraphStyle SelectionContainer 和 DisableSelectionClickableText TextFieldTextField属性使用OutlinedTextFieldBasicTextFieldKeyboardOptions 键盘属性KeyboardActions IME动作 ButtonButton属性使用…

【超级简单】vscode进入服务器的docker容器

前提 1、已经运行docker容器 2、已经用vscode链接服务器 在vscode中安装的插件 Dev Containers docker 在容器中安装的依赖 yum install openssh-server yum install openssh-clientsvscode进入服务器的docker容器 找到自己的容器&#xff0c;右键点击&#xff0c;找到…

网络安全可以免费学习吗?

当然可以&#xff01;&#xff01;&#xff01; 这边每周都有免费的网络安全公开课&#xff01;&#xff01; 感兴趣的可以直接留言&#xff01; 会有专门的人联系的 或者关注公众号&#xff1a;IT运维大本营&#xff0c;私信即可参加

研究表明,全球互联网流量竟有一半来自机器人

据Cyber News消息&#xff0c;Thales Imperva Bad Bot近期做了一份报告&#xff0c;显示在2023年有49.6%的互联网流量竟来自机器人&#xff0c;比上一年增长 2%&#xff0c;达到自2013年以来观察到的最高水平。 报告称&#xff0c;这一趋势正对企业组织产生负面影响&#xff0c…

鸿蒙原生应用元服务-访问控制(权限)开发等级和类型

一、权限等级说明 根据接口所涉数据的敏感程度或所涉能力的安全威胁影响&#xff0c;ATM模块定义了不同开放范围的权限等级来保护用户隐私。 应用APL等级说明 元能力权限等级APL&#xff08;Ability Privilege Level&#xff09;指的是应用的权限申请优先级的定义&#xff0c;…

MySQL Workbench下载安装、 MySQL Workbench使用

官方下载链接;MySQL :: Download MySQL Workbench 下载好懒人安装&#xff0c;也可自己选择目录 下面是使用&#xff1a; 连接数据库&#xff1a; 填写数据库连接信息&#xff1a; 基本操作部分&#xff1a; 数据导入导出&#xff1a; 导出/备份 导入&#xff1a; 生产er图…

基于springboot实现图书进销存管理系统项目【项目源码+论文说明】

基于springboot实现图书进销存管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了图书进销存管理系统的开发全过程。通过分析图书进销存管理系统管理的不足&#xff0c;创建了一个计算机管理图书进销…