【Nginx 源码学习】内存池 及 优秀案例赏析:Nginx内存池设计(1)


malloc 底层原理


  1. malloc开始搜索空闲内存块,如果能找到一块大小合适的就分配出去

  2. 如果malloc找不到一块合适的空闲内存,那么调用brk等系统调用扩大堆区从而获得更多的空闲内存

  3. malloc调用brk后开始转入内核态,此时操作系统中的虚拟地址系统开始工作,扩大进程的堆区,操作系统并没有为此分配真正的物理内存

  4. brk执行结束后返回到malloc,从内核态切换到用户态,malloc找到一块合适的空闲内存后返回

  5. 进程拿到内存,继续干活。

  6. 当有代码读写新申请的内存时系统内部出现缺页中断,此时再次由用户态切换到内核态,操作系统此时真正的分配物理内存,之后再次由内核态切换回用户态,程序继续。

如果对堆和栈有所了解的朋友应该会知道,堆是像上伸展的,栈是向下延伸的,那什么向上向下啊?有点迷哈。看个图:

在这里插入图片描述

一切尽在不言中咯。

在这里插入图片描述


在这里插入图片描述


jemalloc && tcmalloc


jemalloc

tcmalloc

说实话啊,这俩我都没有用过呢,也是第一次听,先把概念放这儿,之后有时间了研究研究。


Nginx内存池设计


Nginx 使用内存池对内存进行管理,把内存分配归结为大内存分配和小内存分配,申请的内存大小比同页的内存池最大值 max 还 大,则是大内存分配,否则为小内存分配。

  1. 大块内存的分配请求不会直接在内存池上分配内存来满足请求,而是直接向系统申请一块内存(就像 直接使用 malloc 分配内存一样),然后将这块内存挂到内存池头部的 large 字段下。

  2. 小块内存分配,则是从已有的内存池数据区中分配出一部分内存。

Nginx 内存分配总流图如下:其中 size 是用户请求分配内存的大小,pool是现有内存池。

在这里插入图片描述


基础数据结构

数据块:

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; // 内存池数据块的最大值(数目)

ngx_pool_t *current; // 指向当前内存池

ngx_chain_t *chain; // 该指针挂接一个ngx_chain_t结构

ngx_pool_large_t *large; // 大块内存链表,即分配空间超过max的内存

ngx_pool_cleanup_t *cleanup; // 释放内存池的callback

ngx_log_t *log; // 主要用于记录日志信息

};

在这里插入图片描述


大块内存:

struct ngx_pool_large_s {

ngx_pool_large_t *next; // 指向下一个large内存

void *alloc; // 指向分配的large内存

};

在这里插入图片描述


回收站:

struct

1:首先下载libunwind-1.1 # wget http://down.yunwei8.com/soft/linux/libunwind-1.1.tar.gz 然后安装 # tar zxvf libunwind-1.1.tar.gz # cd libunwind-1.1 # CFLAGS=-fPIC ./configure # make CFLAGS=-fPIC # make CFLAGS=-fPIC install 2:安装google-perftools: 首先下载gperftools-2.0 # wget http://down.yunwei8.com/soft/linux/gperftools-2.0.tar.gz 然后安装 # tar zxvf gperftools-2.0.tar.gz # cd gperftools-2.0/ # ./configure # make && make install # echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf # /sbin/ldconfig 3:重新编译nginx 不会安装的看这里 http://www.yunwei8.com/nginx124/ # cd /soft/nginx-1.2.4 # ./configure --user=www --group=www --prefix=/usr/local/server/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-google_perftools_module # make && make install 安装参数说明看这里:http://www.yunwei8.com/nginxcs 4:为tcmalloc添加目录,并且赋予适当权限 # mkdir -p /tmp/tcmalloc/ # chown -R www:www /tmp/tcmalloc/ 5:修改 nginx.conf ,令nginx可以 google-perftools实现加速 # vi /usr/local/server/nginx/conf/nginx.conf 修改前面几行为: user www www; worker_processes 8; error_log /web/logs/nginx_error.log crit; pid logs/nginx.pid; google_perftools_profiles /tmp/tcmalloc/; events{ use epoll; worker_connections 65535; } 6:测试和运行 # /usr/local/server/nginx/sbin/nginx -t 如果显示下面信息,即表示配置没问题 nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok nginx: configuration file /opt/nginx/conf/nginx.conf test is successful 输入代码运行nginx服务 # /usr/local/server/nginx/sbin/nginx # ps aux|grep [n]ginx 如果显以类似下面的信息,即表示nginx已经启动 root 22900 0.0 0.1 43216 1576 ? Ss 08:23 0:00 nginx: master process /usr/local/server/nginx/sbin/nginx www 23019 0.0 2.6 68816 27160 ? S 08:48 0:00 nginx: worker process www 23020 0.0 2.6 68816 26828 ? S 08:48 0:00 nginx: worker process www 23021 0.0 2.6 68816 26828 ? S 08:48 0:00 nginx: worker process www 23022 0.0 2.6 68816 26828 ? S 08:48 0:00 nginx: worker process www 23023 0.0 2.6 68816 26828 ? S 08:48 0:00 nginx: worker process www 23024 0.0 2.6 68816 26828 ? S 08:48 0:00 nginx: worker process www 23025 0.0 2.6 68816 26828 ? S 08:48 0:00 nginx: worker process www 23026 0.0 2.6 68816 26828 ? S 08:48 0:00 nginx: worker process 输入代码检测是否支持加速 # lsof -n | grep tcmalloc 如果显示类似下面的信息,即表示支持tcmalloc加速 (nginx八个线程都支持) nginx 31655 www 9w REG 8,1 0 479533 /tmp/tcmalloc/.31655 nginx 31656 www 11w REG 8,1 0 479534 /tmp/tcmalloc/.31656 nginx 31657 www 13w REG 8,1 0 479535 /tmp/tcmalloc/.31657 nginx 31658 www 15w REG 8,1 0 479536 /tmp/tcmalloc/.31658 nginx 31659 www 17w REG 8,1 0 479537 /tmp/tcmalloc/.31659 nginx 31660 www 19w REG 8,1 0 479540 /tmp/tcmalloc/.31660 nginx 31661 www 21w REG 8,1 0 479538 /tmp/tcmalloc/.31661 nginx 31662 www 23w REG 8,1 0 479539 /tmp/tcmalloc/.31662 优化完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值