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

在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.mzph.cn/news/823057.shtml

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

相关文章

觉飞、希亦、Daily neaty内衣洗衣机好用吗?爆款产品性能全面测评!

近几年来小家电产品中,内衣洗衣机的讨论热度无疑是最大的,功能多、操作方便,用内衣洗衣机来清洗内衣裤会更加卫生和安全,能满足了消费者的多种需求。不过尽管市面上的内衣洗衣机品牌很多、挑选空间大,也不是所有产品都…

RT-thread-线程间通讯3-事件集

事件集 事件集也是线程间同步的机制之一,一个事件集可以包含多个事件,利用事件集可以完成一对多,多对多的线程间同步。 一个线程和多个事件的关系可设置为: 其中任意一个事件唤醒 线程,或几个事件都到达后唤醒线程,多个事件集合可以用一个32bit无符号整型变量来表示,…

4.8-4.12算法刷题笔记

刷题 堆1. 堆排序2. 模拟堆 哈希表3. 模拟散列表4. 字符串哈希 DFS5. 排列数字6. n-皇后问题 2. BFS(队列)7. 字母迷宫8. 滑动谜题 3. 树与图的dfs9. 树的重心 4. 树与图的bfs(最短路)10. 图中点的层次( 无权最短路 ) 5. 拓扑排序11. 课程表 6. 朴素dijk…

docker (CentOS,ubuntu)安装及常用命令

Docker和虚拟机一样,都拥有环境隔离的能力,但它比虚拟机更加轻量级,可以使资源更大化地得到应用 Client(Docker客户端):是Docker的用户界面,可以接受用户命令(docker build&#xff…

记录Python的pandas库详解

如何生成一个pd import pandas as pd df pd.DataFrame([[1,2,3],[4,5,6]],index[A,B],columns[C1,C2,C3])df ---------------------------------------------------------------------------C1 C2 C3 A 1 2 3 B 4 5 6df.T -------------------------------------------------…

爬虫 新闻网站 以湖南法治报为例(含详细注释) V4.0 升级 自定义可任意个关键词查询、时间段、粗略判断新闻是否和优化营商环境相关,避免自己再一个个判断

目标网站:湖南法治报 爬取目的:为了获取某一地区更全面的在湖南法治报的已发布的和优化营商环境相关的宣传新闻稿,同时也让自己的工作更便捷 环境:Pycharm2021,Python3.10, 安装的包:requests&a…

element-ui container 组件源码分享

今日简单分享 container 组件的源码实现,从以下两个方面来讲解: 1、container 组件的页面结构 2、container 组件的属性 一、container 组件的页面结构 二、container 组件的属性 1、container 部分的 direction 属性,子元素的排列方向&am…

Nacos2.3.0安装部署

一,准备安装包 github下载点 二,在/usr/local/目录下创建一个文件夹用于上传和解压Nacos cd /usr/local/ #上传Nacos文件 #解压之前cd进安装包根目录 cd /usr/local/ #这边选择的Nacos版本为2.3.0 tar -zxxvf nacos-server-2.3.0.tar.gz #把该文件移动…

基于SpringBoot的“商务安全邮箱”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“商务安全邮箱”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构 收件箱效果图 草稿箱效果图 已发送…

【数据结构】习题之消失的数字和轮转数组

👑个人主页:啊Q闻 🎇收录专栏:《数据结构》 🎉前路漫漫亦灿灿 前言 消失的数字这道题目我会和大家分享三种思路。 还有一道题目是轮转数组,,也会分享三种思路,大…

常见的垃圾回收器(下)

文章目录 G1ShenandoahZGC 常见垃圾回收期(上) G1 参数1: -XX:UseG1GC 打开G1的开关,JDK9之后默认不需要打开 参数2:-XX:MaxGCPauseMillis毫秒值 最大暂停的时间 回收年代和算法 ● 年轻代老年代 ● 复制算法 优点…

Methoxy PEG Propionic acid具有良好的亲水性和分子量可控性

【试剂详情】 英文名称 mPEG-PA,mPEG-Propionic acid, Methoxy PEG PA, Methoxy PEG Propionic acid 中文名称 聚乙二醇单甲醚丙酸, 甲氧基-聚乙二醇-丙酸 外观性状 由分子量决定,固体或者液体 分子量 400&…

如何提高直线模组的技术水平?

在工业制造业中,不管我们使用任何机械产品,都有一个共同的出发点,就是能用先进的技术突破其产品的性能及使用性。那么直线模组究竟是用什么技术突破其产品的使用性的呢? 1、优化机械设计:设计过程中应充分考虑模组的结…

JetBrains2024来袭

JetBrains2024来袭,激活包含在内的编程IDE,其中AppCode已下架,Aqua,RustRover不支持本地激活需要关联帐号。 Tap:激活稳定可靠,支持Windows,macOS,Linux客户端。

C语言【指针】

1. 基本语法 1.1 指针变量的定义和使用(重点) 指针是一种数据类型,指针变量指向谁 就把谁的地址赋值给指针变量 1.2 通过指针间接修改变量的值 指针变量指向谁 就把谁的地址赋值给指针变量 可以通过 *指针变量 间接修改变量的值 1.3 const修饰的指针变量 语法…

全视通院内导航助力“医”路畅通,让您就医不迷路

“这个科室怎么走?”“CT检查在哪里做?”“请问抽血在哪里?”…… 这是患者在赴院就诊时常会发出的疑问,医院导诊台及其他区域的工作人员对此应接不暇,繁忙时段更容易顾此失彼,不仅自身工作负担大&#xf…

stable diffusion基本原理

diffusion model latent diffusion :先对图片降维,然后在降维空间做diffusion;stable diffusion即基于此方法实现的,因此计算量很小; 共用降噪网络U-Net:输入noisy imagestep,告诉网络当前的噪声…

scipy.signal.cwt, pywt.cwt, ssq_cwt 使用记录

scipy.signal.cwt 该代码中widths以及freq计算公式来源于scipy.signal.morlet2函数官方案例 from scipy.signal import morlet, morlet2 from scipy import signal import matplotlib.pyplot as pltsignal_length 2000 fs 1000# 生成信号数据 time np.arange(0, signal_leng…

全新付费进群系统源码 带定位完整版 附教程

搭建教程 Nginx1.2 PHP5.6-7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库(dkewl.sql) 第三步修改/config/database.php里面的数据库地址 第四步修改/config/extra/ip.php里面的域名 第四步设置伪静态thinkphp 总后台账…

MySQL死锁与死锁检测

一、什么是MySQL死锁 MySQL中死锁是指两个或多个事务在互相等待对方释放资源,导致无法继续执行的情况。 MySQL系统中当两个或多个事务在并发执行时,就可能会遇到每项事务都持有某些资源同时又请求其他事务持有的资源,从而形成事务之间循环等…