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

news2024/11/25 7:40:11

目录

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

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_name
     snprintf(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.coloradmin.cn/o/1872329.html

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

相关文章

【力扣高频题】011. 盛最多水的容器

前面的算法文章&#xff0c;更新了许多 专题系列 。包括&#xff1a;滑动窗口、动态规划、加强堆、二叉树递归套路 等。 还没读过的小伙伴可以关注一下&#xff0c;在主页中点击对应链接查看哦~ 接下来的一段时间&#xff0c;将持续 「力扣高频题」 系列文章&#xff0c;想刷 …

【python】OpenCV—Color Correction

文章目录 cv2.aruco 介绍imutils.perspective.four_point_transform 介绍skimage.exposure.match_histograms 介绍牛刀小试遇到的问题 参考学习来自 OpenCV基础&#xff08;18&#xff09;使用 OpenCV 和 Python 进行自动色彩校正 cv2.aruco 介绍 一、cv2.aruco模块概述 cv2.…

DC/AC电源模块:为新能源汽车充电系统提供高效能源转换

BOSHIDA DC/AC电源模块&#xff1a;为新能源汽车充电系统提供高效能源转换 DC/AC电源模块是新能源汽车充电系统中至关重要的组件&#xff0c;它能够将直流电转换为交流电&#xff0c;为电动车提供高效能源转换。随着人们对可持续能源的需求日益增长&#xff0c;新能源汽车成为…

Spring Cloud LoadBalancer基础入门与应用实践

官网地址&#xff1a;https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html 【1】概述 Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器&#xff0c;它包含在SpringCloud-commons中用…

4.制作的docker镜像

最近工作需要&#xff0c;制作docker镜像&#xff0c;用做构建使用。 1.拉取基础镜像ubuntu:22.04 docker pull ubuntu:22.042.运行ubuntu容器 docker run --privileged -d --name ubuntu_build ubuntu:22.04 sleep infinity3.进入运行的容器 docker exec -it ubuntu_build …

看完这篇,我太爷都要学习大模型了

2008年&#xff0c;年入过亿的媒体人Jeremy Clarkson心血来潮在英国牛津附近的Chadlington查德灵顿买了1000英亩&#xff08;大约6000亩&#xff09;的土地&#xff0c;并托管给了当地的一个农民大叔。作为地主老头的Clarkson从此每年坐收数万英镑的利润。 8年后&#xff0c;农…

解决Transformer根本缺陷,所有大模型都能获得巨大改进

即使最强大的 LLM 也难以通过 token 索引来关注句子等概念&#xff0c;现在有办法了。 最近两天&#xff0c;马斯克和 LeCun 的口水战妥妥成为大家的看点。这两位 AI 圈的名人你来我往&#xff0c;在推特&#xff08;现为 X&#xff09;上相互拆对方台。 LeCun 在宣传自家最新论…

【C++/STL】:优先级队列的使用及底层剖析仿函数

目录 &#x1f4a1;前言一&#xff0c;优先级队列的使用二&#xff0c;仿函数1&#xff0c;什么是仿函数2&#xff0c;仿函数的简单示例 三&#xff0c;优先级队列的底层剖析 &#x1f4a1;前言 优先队列(priority_queue)是一种容器适配器&#xff0c;默认使用vector作为其底层…

热点观察 | 《姜饼人王国》新作来袭、《Monopoly GO!》荣登5月全球畅销榜榜首

本周出海热点&#xff1a; 1. 中国品牌借欧洲杯打响知名度 2. 米哈游玩家切割二次元 3. 6月27日&#xff0c;Steam游戏《六月衷曲》上线TapTap 4. 《Monopoly GO!》荣登5月全球畅销榜榜首 5. 《地下城与勇士》拿下本周亚洲T1市场畅销榜冠军 6. 《姜饼人王国》新作强势登顶…

MySQL基础查询与复杂查询

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

高中数学:复数-三角表示式

一、定义 辐角主值 二、复数乘除运算的三角表示及其几何意义 乘法 复数乘法的几何意义 除法 练习 解

Linux自动化交互脚本expect开发

在日常开发任务中&#xff0c;运行shell脚本有时候会提示输入密码的操作&#xff0c;如何让脚本自动输入密码呢&#xff1f;这时使用expect帮我们输入&#xff0c;Expect是基于Tcl发展而来的&#xff0c;它不仅可以进行交互&#xff0c;还可以根据程序的提示模拟标准输入&#…

AI原力觉醒:华硕NUC组团出道,快来Pick属于你的NUC

NUC 家族组团出道&#xff0c;全新的计算体验&#xff0c;重新定义桌面设备。AI加持下&#xff0c;谁最适合你&#xff1f; 颜值担当 NUC 14 Pro 居家必备单品 适用于广大消费者的NUC 14 Pro&#xff0c;不仅颜值在线&#xff0c;更多方位考虑您的日常所需&#xff0c;工作娱…

项目测试计划(Word)

1简介 1.1 目的 1.2 范围 2. 测试参考文档和测试提交文档 2.1 测试参考文档 2.2 测试提交文档 3. 测试策略 3.1整体测试策略 3.2功能测试 3.3 界面测试 3.4 性能测试 3.5 安全性测试 3.6 工具 4 测试阶段进入和退出标准 4.1进入标准 4.2退出标准 5 测试范围 5.1需要测试的模块 …

AirTestIDEA 使用windows窗口连接,切窗口后无法再操作已连接的游戏画面

目录 左上角&#xff1a; 选项 - 设置 - Windows窗口无嵌入链接(勾选)&#xff0c; 再使用 Windows窗口连接&#xff0c;中的"选择游戏画面"&#xff0c;可解决

【高等数学】一元函数积分及其应用:定积分与反常积分

文章目录 第一节. 定积分一. 定积分的概念1. 定义2. 定积分存在定理3. 定积分的几何意义与求解 二. 定积分的性质1. 不等式2. 中值定理 三. 积分上限&#xff08;为x&#xff09;函数1. 积分上限函数定义2. 积分函数求导3. 积分函数的奇偶性变化 四. 定积分的计算 第二节. 反常…

真实案例解析!企业如何做好安全生产管理工作?

很多企业都有相对应的安全管理制度&#xff0c;安全管理系统&#xff0c;安全管理人员等等&#xff0c;但这都仅限于企业“做了”安全生产管理&#xff0c;并不能“做好”安全生产管理。其实做好安全生产管理需要安全管理系统的配合。 听说过EHS系统吗&#xff1f;这系统能帮企…

【Android】在App里面安装Apk文件

项目需求 在一个App里面内置一个第三方的APK文件&#xff0c;然后通过这个App可以安装这个APK文件。 需求实现 1.内置APK文件 在App里面创建一个assets文件夹&#xff0c;然后把想要安装的APK文件放到这里面。 2.定义文件路径访问权限 创建一个文件&#xff0c;命名【file…

springboot系列七: Lombok注解,Spring Initializr,yaml语法

老韩学生 LombokLombok介绍Lombok常用注解Lombok应用实例代码实现idea安装lombok插件 Spring InitializrSpring Initializr介绍Spring Initializr使用演示需求说明方式1: IDEA创建方式2: start.spring.io创建 注意事项和说明 yaml语法yaml介绍使用文档yaml基本语法数据类型字面…

酣客的“FFC模式”|白酒商业模式|分润制度顶层架构设计

酣客公社摒弃传统商业模式&#xff0c;提出“心联网”及“FFC模式”的商业模式。 坐标&#xff1a;厦门&#xff0c;我是肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 今天和大家分享“酣客”的营销模式&#xff…