Ngnix内存池——高并发实现高效内存管理

目录

一、高并发下传统方式的弊端

1、常用的内存操作函数

2、弊端一

3、弊端二

4、弊端三

5、弊端四

二、弊端解决之道

1、内存管理维度分析

2、内存管理组件选型

三、高并发内存管理最佳实践

1、内存池技术

2、内存池如何解决弊端

3、高并发内存池如何实现

四、高效内存池设计与实现

1、内存池的实现思路

2、Nginx内存池结构图

3、关键数据结构

4、ngx_pool_t结构示意图(大希奥未1024的池)

​5、Nginx内存池基本操作


一、高并发下传统方式的弊端

1、常用的内存操作函数

void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
void free(void *ptr);

malloc  在内存的动态存储区中分配一块长度为size字节的连续区域返回该区域的首地址.

calloc  与malloc相似,参数size为申请地址的单位元素长度,nmemb为元素个数,即在内存中申请nmemb*size字节大小的连续地址空间.内存会初始化0

realloc  给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度.ptr 若为NULL,它就等同于 malloc.

2、弊端一

高并发时较小内存块使用导致系统调用频繁,降低了系统的执行效率。(系统调用不了解的,观看我博客里系统调用的一文)。

3、弊端二

频繁使用时增加了系统内存的碎片,降低内存使用效率

内部碎片 已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;

产生根源1.内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址

                  2.MMU的分页机制的限制

处理器

页大小

分页的级别

虚拟地址分级

x86

4KB

2

10+10+12

x86(extended)

4KB

1

10+22

x86(PAE)

4KB

3

2+9+9+12

x86-64

4KB

4

9+9+9+9+12

4、弊端三

没有垃圾回收机制,容易造成内存泄漏,导致内存枯竭

情形一:
void log_error(char *reason) 
{ char *p1; p1 = malloc(100); sprintf(p1,"The f1 error occurred because of '%s'.", reason); log(p1); 
}情形二:  
int getkey(char *filename) 
{ FILE *fp; int key; fp = fopen(filename, "r");fscanf(fp, "%d", &key); //fclose(fp);return key; 
}

5、弊端四

内存分配与释放的逻辑在程序中相隔较远时,降低程序的稳定性

例如:程序1调用程序2,误认为传参过来的是指针,用完后,进行了释放

//程序1
ret get_stu_info(Student  * _stu) 
{ char  * name= NULL; name = getName(_stu->no);//处理逻辑if(name) {free(name);name = NULL;}
}
//程序2
char stu_name[MAX];char * getName(int stu_no)
{//查找相应的学号并赋值给 stu_namesnprintf(stu_name,MAX,“%s”,name);return stu_name;
}

二、弊端解决之道

1、内存管理维度分析

2、内存管理组件选型

PtMalloc

(glibc 自带)

TcMalloc

JeMalloc

概念

Glibc 自带

Google 开源

Jason Evans

(FreeBSD著名开发人员)

性能

(一次malloc/free 操作)

300ns

50ns

<=50ns

弊端

锁机制降低性能,容易导致内存碎片

1%左右的额外内存开销

2%左右的额外内存开销

优点

传统,稳定

线程本地缓存,多线程分配效率高

线程本地缓存,多核多线程分配效率相当高

使用方式

Glibc 编译

动态链接库

动态链接库

谁在用

较普遍

safari、chrome等

facebook、firefox

适用场景

除特别追求高效内存分配以外的

多线程下高效内存分配

多线程下高效内存分配

三、高并发内存管理最佳实践

1、内存池技术

什么是内存池技术?

在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存,统一对程序所使用的内存进行统一的分配和回收。这样做的一个显著优点是,使得内存分配效率得到很大的提升。

2、内存池如何解决弊端

(1)、高并发时系统调用频繁,降低了系统的执行效率

        内存池提前预先分配大块内存,统一释放,极大的减少了malloc 和 free 等函数的调用。

(2)、频繁使用时增加了系统内存的碎片,降低内存使用效率

        内存池每次请求分配大小适度的内存块,避免了碎片的产生

(3)、没有垃圾回收机制,容易造成内存泄漏

        在生命周期结束后统一释放内存,完全避免了内存泄露的产生

(4)、内存分配与释放的逻辑在程序中相隔较远时,降低程序的稳定性

        在生命周期结束后统一释放内存,避免重复释放指针或释放空指针等情况

3、高并发内存池如何实现

高并发(High Concurrency是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。

高并发特点

(1)、响应时间短

(2)、吞吐量大

(4)、每秒响应请求数 QPS

(5)、并发用户数高:

内存池设计考虑

设计逻辑应该尽量简单,避免不同请求之间互相影响,尽量降低不同模块之间的耦合

内存池生存时间应该尽可能短,与请求或者连接具有相同的周期,减少碎片堆积和内存泄漏

四、高效内存池设计与实现

1、内存池的实现思路

(1)、对于每个请求或者连接都会建立相应的内存池,建立好内存池之后,我们可以直接从内存池中申请所需要的内存,不用去管内存的释放,当内存池使用完成之后一次性销毁内存池。

(2)、区分大小内存块的申请和释放,大于池尺寸的定义为大内存块,使用单独的大内存块链表保存,即时分配和释放;小于等于池尺寸的定义为小内存块,直接从预先分配的内存块中提取,不够就扩充池中的内存,在生命周期内对小块内存不做释放,直到最后统一销毁。

2、Nginx内存池结构图

3、关键数据结构

typedef struct 
{u_char               *last;         // 保存当前数据块中内存分配指针的当前位置u_char               *end;         // 保存内存块的结束位置ngx_pool_t           *next;      // 内存池由多块内存块组成,指向下一个数据块的位置ngx_uint_t            failed;      // 当前数据块内存不足引起分配失败的次数
} ngx_pool_data_t;struct ngx_pool_s 
{ngx_pool_data_t       d;        // 内存池当前的数据区指针的结构体size_t                max;      // 当前数据块最大可分配的内存大小(Bytes)ngx_pool_t           *current;  // 当前正在使用的数据块的指针ngx_pool_large_t     *large;    // pool 中指向大数据块的指针(大数据快是指 size > max 的数据块)
};

4、ngx_pool_t结构示意图(大希奥未1024的池)



5、Nginx内存池基本操作

内存池创建、销毁和重置:

操作

函数

创建内存池

ngx_pool_t *  ngx_create_pool(size_t size);

销毁内存池

void ngx_destroy_pool(ngx_pool_t *pool);

重置内存池

void ngx_reset_pool(ngx_pool_t *pool);

内存池申请、释放和回收操作:

操作

函数

内存申请(对齐)

void *  ngx_palloc(ngx_pool_t *pool, size_t size);

内存申请(不对齐)

void *  ngx_pnalloc(ngx_pool_t *pool, size_t size);

内存申请(对齐并初始化)

void *  ngx_pcalloc(ngx_pool_t *pool, size_t size);

内存清除

ngx_int_t  ngx_pfree(ngx_pool_t *pool, void *p);

内存池申请、释放和回收操作:

操作

函数

内存申请(对齐)

void *  ngx_palloc(ngx_pool_t *pool, size_t size);

内存申请(不对齐)

void *  ngx_pnalloc(ngx_pool_t *pool, size_t size);

内存申请(对齐并初始化)

void *  ngx_pcalloc(ngx_pool_t *pool, size_t size);

内存清除

ngx_int_t  ngx_pfree(ngx_pool_t *pool, void *p);

源码代码详细见上传资源

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

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

相关文章

《数字图像处理与机器视觉》案例二(基于边缘检测和数学形态学焊缝图像处理)

一、前言 焊缝是评价焊接质量的重要标志&#xff0c;人工检测方法存在检测标准不统一&#xff0c;检测精度低&#xff0c;焊缝视觉检测技术作为一种重要的质量检测方法&#xff0c;正逐渐在各行各业中崭露头角。把焊缝准确的从焊接工件中准确分割出来是焊缝评价的关键一步&…

linux上git的使用

目录 1.测试是否安装有git 2.下载项目到本地 3.三板斧 1.将代码放在创建的目录中 2.提交改动到本地 3.提交代码到远端 4.注意点 以及补充内容 1.测试是否安装有git 如果输入git --help 会显示下面一大串那么就是已经安装&#xff0c;否则需要自行手动安装 yum install g…

洁盟超声波清洗机怎么样?横向测评希亦、洁盟、苏泊尔超声波清洗机谁是实力派

生活中大多数人戴眼镜&#xff0c;但是很多人都不注意眼镜的保养&#xff0c;导致镜片越来越模糊&#xff0c;从而引发多边的状况发生&#xff0c;比如长久戴模糊不清的眼镜&#xff0c;视力会受到影响随之下降。甚至是眼镜长期不清洗&#xff0c;上面的灰尘、细菌会影响眼部健…

彩虹PLM系统在航空航天业的应用与实践

彩虹PLM系统在航空航天业的应用与实践 彩虹PLM系统作为航空航天业的卓越解决方案&#xff0c;已经在众多企业中得到了广泛的应用和实践。该系统通过其独特的功能和优势&#xff0c;为航空航天企业带来了显著的管理效益和市场竞争力提升。 彩虹PLM系统 在应用方面&#xff0c;彩…

1.2 离散LTI系统的时域分析

目录 离散系统的定义 离散LTI系统的时域描述h[k] 离散系统的分类 线性与非线性系统 时变与非时变系统 因果与非因果系统 稳定与不稳定系统 滑动平均系统 LTI——Linear and Time-invariant System 线性时不变系统 离散系统的定义 离散LTI系统的时域描述h[k] 离…

【并发编程】2-Synchronized

基本概念 线程安全问题三个要素&#xff1a;多线程、共享资源、非原子性操作&#xff1b;产生的根本原因&#xff1a;多条线程同时对一个共享资源进行非原子性操作&#xff1b;Synchronized解决线程安全问题的方式&#xff1a;通过互斥锁将多线程的并行执行变为单线程串行执行…

昇思25天学习打卡营第4天|数据集Dataset

数据集 Dataset 介绍 之前说过&#xff0c;MindSpore是基于Pipeline&#xff0c;通过Dataset和Transformer进行数据处理。Dataset在其中是用来加载原始数据的。mindSpore提供了数据集加载接口&#xff0c;可以加载文本、图像、音频等&#xff0c;同时也可以自定义加载接口。此…

【UE开发】游戏库存UI系统Demo

1.项目介绍 1.描述&#xff1a;一种用于存储记录玩家物品的游戏内可视化操作系统。 2.演示&#xff1a;https://www.bilibili.com/video/BV1f53neVEfW/?vd_source50dea901fd12253f417c48b937975b0d 3.大纲&#xff1a; 4.样式&#xff1a; 2.W_Inventory_Main_01&#xff08;…

CORE Mobility Errorr的调试

在运行CORE tutorial 3中的mobility示例时&#xff0c;出现如下错误&#xff1a; 当看到这个问题的时候&#xff0c;并没有仔细去分析日志和现象&#xff0c;在core-daemon的进程打印界面只看了一下最后的出错堆栈&#xff1a; 2024-06-27 10:43:48,614 - ERROR - _server:_ca…

MySQL8 新特性——公用表表达式用法 with t1 as (select * from user)

MySQL8 新特性——公用表表达式用法_mysql ctes-CSDN博客 1.普通公用表表达式 MySQL8 新特性——公用表表达式用法 在MySQL 8.0及更高版本中&#xff0c;引入了公用表表达式&#xff08;Common Table Expressions&#xff0c;CTEs&#xff09;&#xff0c;它是一种方便且可重…

docker部署vue项目

1.下载docker desktop软件 Docker Desktop启动的时候&#xff0c;有可能弹框提示"WSL2 installations is incomplete"&#xff0c;这是您的系统中没有安装WSL2内核的原因&#xff0c;打开【https://aka.ms/wsl2kernel ,在打开的页面中有一个Linux内核更新包"链…

【python011】经纬度点位可视化html生成(有效方案)

1.熟悉、梳理、总结项目研发实战中的Python开发日常使用中的问题、知识点等&#xff0c;如获取省市等边界区域经纬度进行可视化&#xff0c;从而辅助判断、决策。 2.欢迎点赞、关注、批评、指正&#xff0c;互三走起来&#xff0c;小手动起来&#xff01; 3.欢迎点赞、关注、批…

STM32将外部SDRAM空间作为系统堆(Heap)空间

概述 stm32可以外扩很大的sram&#xff0c;常见外部sram的初始化函数一般是c语言写的&#xff0c;默认写在main函数里面。stm32初始化首先进入汇编代码startup_stm32f429xx.s&#xff0c;在汇编代码中Reset_Handler&#xff08;复位中断服务程序&#xff09;里面先调用了Syste…

vue + Lodop 制作可视化设计页面 实现打印设计功能(二)

历史&#xff1a; vue2 Lodop 制作可视化设计页面 实现打印设计功能&#xff08;一&#xff09; 前言&#xff1a; 之前本来打算用直接拿之前做的vue2版本改改就发的&#xff0c;但考虑到现在主流都是vue3了&#xff0c;所以从这篇文章开始使用vue3来写&#xff0c;以及最后…

三相LCL滤波型PWM逆变器仿真设计

参考并网电流外环电容电流前馈内环的双闭环控制结构&#xff0c;在光伏和风力发电网侧变换器中的应用&#xff0c;可以显著提高系统的稳定性和效率。在并网电流外环中&#xff0c;通过检测电网电流并与其参考值进行比较&#xff0c;可以得到一个电流误差信号。这个电流误差信号…

MySQL基础查询与复杂查询

基础查询 1、查询用户信息&#xff0c;仅显示用户的姓名与手机号&#xff0c;用中文显示列名。中文显示姓名列与手机号列。 2、根据商品名称进行模糊查询&#xff0c;模糊查询需要可以走索引&#xff0c;需要给出explain语句。使用explain测试给出的查询语句&#xff0c;需要显…

程序员职业发展指南,如何选择适合自己的就业方向?

随着科技的发展和数字化时代的到来&#xff0c;程序员是IT行业中的热门职业。尤其是近几年移动互联网的迅速发展&#xff0c;IT人才更是紧缺&#xff0c;越来越多的人加入程序员这个行列。 从事程序员工作&#xff0c;如何接项目呢&#xff1f;YesPMP是一个专注于互联网外包的平…

【知识学习】阐述Unity3D中动画渲染的概念及使用方法示例

Unity3D中的卡通渲染&#xff08;Cartoon Rendering&#xff09;是一种渲染技术&#xff0c;它模仿传统手绘动画或漫画的视觉效果。这种渲染风格通常具有鲜明的颜色、清晰的轮廓线和简化的光影效果&#xff0c;常用于制作动画、游戏和其他视觉媒体。 卡通渲染的基本概念 轮廓…

<sa8650>QCX ISP Tuning 使用详解 — Tuning前置条件

<sa8650>QCX ISP Tuning 使用详解 — Tuning前置条件 一 如何安装 Qualcomm Chromatix™ 摄像头校准工具二 如何使用 Qualcomm Chromatix™ tuning工具创建tuning项目2.1 创建工程前提依赖2.2 创建工程2.3 添加场景2.4 编辑区域触发器三 如何创建Tuning 树一 如何安装 Qualco…

postman教程-22-Newman结合Jenkins执行自动化测试

上一小节我们学习了Postman Newman运行集合生成测试报告的方法&#xff0c;本小节我们讲解一下Postman Newman结合Jenkins执行自动化测试的方法。 在软件开发过程中&#xff0c;持续集成&#xff08;CI&#xff09;是一种实践&#xff0c;旨在通过自动化的测试和构建过程来频繁…