Nginx系列三 内存池的设计
Nginx的高性能的是用非常多细节来保证,epoll下的多路io异步通知。阶段细分化的异步事件驱动,那么在内存管理这一块也是用了非常大心血。上一篇我们讲到了slab分配器,我们能够能够看到那是对共享内存的管理的优化。Nginx在进程内也实现了自己的内存池,目的在于降低内存碎片,降低向操作系统的申请次数,减低模块开发难度。Nginx实现的内存池实际上非常easy:
Nginx内存池的管理是分大内存和小内存的,详细说来。Nginx在向系统初始化内存池后,当我们调用ngx_palloc申请小内存后,再调用ngx_free() 内存池是不负责回收的,只在销毁内存池时候一并销毁。
可是我们在ngx_palloc申请大于4KB的内存时候当我们ngx_free()的时候内存池是否则回收的,这一点很合理和自然,内存池未来提高内存的利用度,须要处理大内存的回收和再利用。
struct ngx_pool_s {
ngx_pool_data_t d;
size_t max; //最大分配出去的大小
ngx_pool_t *current;
ngx_chain_t *chain;
ngx_pool_large_t *large; //本内存池下的大内存域
ngx_pool_cleanup_t *cleanup;
ngx_log_t *log;
}; struct ngx_pool_large_s {
ngx_pool_large_t *next; //大于4KB的内存管理(可回收再利用)
void *alloc;
}; typedef struct {
u_char *last;
u_char *end;
ngx_pool_t *next; //管理内存池
ngx_uint_t failed; //经验值 查找失败大于6次则又一次分配
} ngx_pool_data_t;
这三个数据结构构成了主要的内存池的主体.通过ngx_create_pool能够创建一个内存池,通过ngx_palloc能够从内存池中分配指定大小的内存。
能够看到是内存池对于内存的管理是区分大内存和小内存的,实际上大于4KB的申请,实际上是终于调用了malloc直接申请。只是兴许由Nginx的内存池来管理。
通常每个请求都有一个这样的简单独立的内存池,Nginx为每个TCP请求分配一个内存池,自然也为每个HTTP请求分配一个内存池,在连接释放后,销毁内存池,同一归还给操作系统。内存的分配管理消耗系统极少资源。总结一下内存池的优点:最大优点就是把多次向系统申请内存的 操作整合成一次。这大大降低了CPU的资源消耗。同一时候降低了内存碎片。
參考资料:《深入理解Nginx》 陶辉
《深入剖析Nginx》 高凯群
Nginx系列三 内存池的设计的更多相关文章
- Linux编程之内存池的设计与实现(C++98)
假设服务器的硬件资源"充裕",那么提高服务器性能的一个很直接的方法就是空间换时间,即"浪费"服务器的硬件资源,以换取其运行效率.提升服务器性能的一个重要方法就是 ...
- Nginx数据结构之内存池
基本结构 1. ngx_pool_t struct ngx_pool_s { ngx_pool_data_t d; size_t max; ngx_pool_t *current; ngx_chain ...
- 【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计
这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1.window 7的开始菜单 2.有道词典的主菜单 3. ...
- nginx源码学习----内存池
最近在进行监控平台的设计,之前一直觉得C/C++中最棘手的部分是内存的管理上,远不止new/delete.malloc/free这么简单.随着代码量的递增,程序结构复杂度的提高.各种内存方面的问题悄然 ...
- Nginx 之 内存池
1.基本结构 先来学习一下nginx内存池的几个主要数据结构:[见:./src/core/ngx_palloc.h/.c] ngx_pool_data_t(内存池数据块结构) 1: typed ...
- 菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t
菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...
- 菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t[转]
菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...
- 高效内存池的设计方案[c语言]
一.前言概述 本人在转发的博文<内存池的设计和实现>中,详细阐述了系统默认内存分配函数malloc/free的缺点,以及进行内存池设计的原因,在此不再赘述.通过对Nginx内存池以及< ...
- Linux简易APR内存池学习笔记(带源码和实例)
先给个内存池的实现代码,里面带有个应用小例子和画的流程图,方便了解运行原理,代码 GCC 编译可用.可以自己上网下APR源码,参考代码下载链接: http://pan.baidu.com/s/1hq6 ...
随机推荐
- Ubuntu16.04进入无限登录状态的解决办法
具体来说就是,输入密码之后又到了登录界面,无限循环(也许可能不能输入密码,这种状态我没有测试) 此方案仅适用于安装过NVIDIA显卡驱动的系统并且在登录界面会发现分辨率变了 如果你没有安装过NVIDI ...
- Activiti数据表
--1:资源库流程规则表SELECT * FROM JEESITE.act_re_deployment --部署信息表SELECT * FROM JEESITE.act_re_model --流程设计 ...
- 如何将表的行数赋值给变量(MySQL)
delimiter $$ drop procedure if exists test_at $$ create definer=root@localhost procedure test_at() b ...
- 【转】错误: ORA-01591: 锁被未决分布式事务处理 7.2.428982 持有--解决方案
SQL 错误: ORA-01591: 锁被未决分布式事务处理 7.2.428982 持有 01591. 00000 - "lock held by in-doubt distributed ...
- Android开发——常用ADB命令的使用
ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备.它的功能如下: 运行设备的sh ...
- 大数据学习——hive显示命令
show databases; desc t_partition001; desc extended t_partition002; desc formatted t_partition002; !c ...
- python 监控oracle 数据库
import cx_Oracle import os db = cx_Oracle.connect('**********') print "Show Oracle Version: &qu ...
- 从Excel中读取数据(python-xlrd)
从Excel中读取数据(python-xlrd) 1.导入模块 import xlrd 2.打开Excel文件读取数据 data = xlrd.open_workbook('excelFile.xls ...
- 七牛云赵之健:多维度融合赋能视频 AI 的实践
6 月 30 日下午,赵之健在七牛架构师实践日第二十九期进行了<多维度融合赋能视频 AI 的实践>为题的实战分享. 作者简介: 赵之健,七牛人工智能实验室资深算法工程师, 七 ...
- JAVA自定义监听器的示例代码
JAVA用户自定义事件监听完整例子 JAVA用户自定义事件监听完整例子- —sunfruit 很多介绍用户自定义事件都没有例子,或是例子不全,下面写了一个完整的例子,并写入了注释以便参考,完整 ...