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…

人工智能时代的图像识别:机遇与挑战并存

人工智能(AI)时代为图像识别领域带来了前所未有的机遇,同时也伴随着一系列挑战。这一领域的发展不仅深刻影响了科技、医疗、教育、娱乐等多个行业,还在一定程度上改变了人们的生活方式。 机遇: 技术突破与创新&#…

prometheus.yaml

目录 一、说明1、全局配置 global:2、告警配置 alerting:3、规则文件配置 rule_files:4、拉取配置 scrape_configs:5、远程读写配置 remote_read/remote_write: 二、简单配置示例: 一、说明 prometheus的配…

GoLang核心知识点

目录 1. 系统中断信号注册 2. 通道接收多个返回值 3. go context 4. reflect 5. json字符串对象转换 1. 系统中断信号注册 interrupt : make(chan os.Signal) // 可以控制强制终止的信号 // 如果系统有中断信号,发送给r.interrupt signal.Notify(interrupt, os…

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

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

纯前端umi项目部署页面自动刷新

背景 在用户正在访问单页面网站的情况下,突然发布了新的版本。而由于单页面中路由特性,或浏览器缓存的原因,并不会随着路由变化而重新加载前端资源,此时用户浏览器所运行的脚本,并非是最新的代码,从而可能…

img标签图片未加载完成占位图

通过Css控制,实现加载接口下发或者网络图片时,未加载完成前,先加载本地一张占位图,记载完成显示接口下发的图或者网络图。 实现方式:通过在img标签的after伪元素上添加一张占位图,并且img标签都设置为posi…

记录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 #把该文件移动…

Spring Boot安装与配置

一、引言 Spring Boot是一个开源的Java框架,用于简化Spring应用的创建、运行和部署过程。它遵循“约定优于配置”的原则,使得开发者能够更专注于业务逻辑的实现,而非繁琐的配置。本教程将指导您完成Spring Boot的安装和配置过程,…

基于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客户端。