极客专栏《Nginx核心知识100讲》38小节的笔记

nginx 不同的worker之间需要共享信息的时候,只能通过共享内存。共享内存会使用链表,红黑树这样的数据结构。但是每个红黑树上有很多节点,每个节点上都需要分配内存去存放。怎样把一整块共享内存切割成一小块给红黑树上面的每一个节点使用呢?

slab内存管理

image.png

image.png

首先,会把共享内存分为很多页面,每个页面4k,会切成很多slot。比如32字节是一种slot,64字节是一种slot,128字节也是一种slot。这些slot是以乘2的方式向上增长的。如果现在有一个51字节需要分配的内存会放到哪里呢?会放在小于它最大的slot的环节比如64字节。这样的数据结构有个缺点,就是内存浪费。比如:51字节用64字节存放,其他13字节浪费了。最多有多少内存消耗呢?两倍。这种使用的方式叫做Bestfit,这种分配方式的好处是适合小对象。如果我们分配的内存非常小,比如小于一个页面的大小就非常合适,很少有碎片。 每分配一块内存就是沿着还没使用的空白内存继续使用。当一个页面使用满以后,再拿一个空闲页面给slab slot大小的内存继续使用。

有时候分配在一段内存上的数据结构是固定的,需要初始化,用Bestfit这种方式原先的数据结构都还在。当重复使用的时候,避免了初始化。

slab内存,应用在Openresty的 lua_shared_dict 以及limit request 、limit connection。

ngx_slab_stat:统计Slab 使用状态

数据监控,数据统计。

image.png

可以看不同的slot,分配了多少,使用了多少,有多少请求在访问,失败了多少次。

Openresty如何使用ngx_slab_stat模块

下载tengine,该模块路径tengine-2.2.3/modules/ngx_slab_stat。这是一个标准的nginx第三模块,每个第三方模块会通过C文件定义好nginx_module_t这样的结构体、以及处理哪些配置项、提供哪些变量、并有一个config来帮助它编译到目标nginx中。

Openresty编译的把ngx_slab_stat模块编译进去。然后使用lua_shared_dict 分配内存,再用slab_stat去查看共享内存的使用情况。

image.png

add_module 这个命令可以把一个目录下具备config这样配置项的目录添加到nginx目录中。让模块的源码让./configure 识别到。

slab_stat 如何使用

image.png

location slab_stat中的slab_stat是一个slab_stat提供的配置项,会返回slab_stat统计状况。

代码走起

image.png

image.png

image.png

slab 内存分配了Bestfit思想,也是linux操作系统经常使用的内存分配方式。通常我们使用共享内存时都需要使用slab 分配给相应的内存给对象,再使用上层的数据结构维护这个对象。

留言问题我编译之后将代码写进conf文件,提示nginx: [emerg] unknown directive "slab_stat",是不是还缺少什么东西。nginx -V 是否可以查看到slab是否已经编译进去,我发现nginx -V 没有显示slab模块。

2018-12-20

 作者回复

你是不是没有把编译生成的新版本nginx,替换到安装sbin目录下?

作者:言十年

链接:https://www.jianshu.com/p/9370ab2c55df

Linux的slab和nginx的区别,Nginx核心知识100讲》nginx Slab管理器相关推荐

  1. Nginx核心知识100讲学习笔记(陶辉)Nginx架构基础(一)

    (转载,非常不错的文章) 一.Nginx的请求处理流程进程结构 1.Nginx的请求处理流程 2.Nginx的进程结构 3.进程作用 1.Master进程 1.是进行work进程的监控管理的 2.看看 ...

  2. openresty 静态库_Nginx核心知识100讲学习笔记(陶辉)Nginx架构基础(四)

    一.红黑树 1.红黑树 2.红黑树复杂度 3.使用红黑树的模块 1.本地内存做的红黑树 ngx_conf_module ngx_event_timer_rbtree #管理定时器的红黑树 2.管理定时 ...

  3. linux下面 r和 n的区别,【冷知识】关于/r与/n以及 /r/n 的区别总结

    首先: \r就是"回到行首",\n就是"到下一行" 即:\r是回车,\n是换行,前者使光标到行首,后者使光标下移一格. 通常用的Enter是两个加起来的,即\r ...

  4. linux系统一下剪贴板在哪里,Linux的最佳剪贴板管理器

    为什么你需要一个剪贴板管理器? 剪贴板管理器的一个重要用途是,你不必担心清除或覆盖你的剪贴板内容.特别是,如果你是程序员或作者,要做大量的复制和粘贴操作. 有许多工具可以帮助你管理Linux剪贴板,其 ...

  5. (四)Linux环境部署(Centos+Nginx+Tomcat+Mysql) - 安装Tomcat和JDK 以及 Nginx与Tomcat整合

    因为在网上发现系统性.严谨(特别是在安全方面)的Linux部署方面的参考文章很少,于是整理以下六篇Linux环境部署的系列性文章,其为本人在实践中,完整的搭建一个基于Linux系统上Centos+Ng ...

  6. F5与Nginx的区别

    Linux的注意: F5与Nginx的区别 什么是Nginx: Nginx:高性能的 HTTP和反向代理服务器,同时支持作为IMAP/POP3/SMTP代理服务器.目前被很多网站应用为其HTTP软负载 ...

  7. uwsgi模式_nginx+uwsgi 和nginx+gunicorn区别、如何部署

    [线上环境部署Django,nginx+uwsgi 和nginx+gunicorn,这两种方案,应该如何选择?] 大家是采用的何种部署方式? 第一种,高并发稳定一点 我们公司使用的是nginx+gun ...

  8. linux安装nginx源码,CentOS7源码编译安装Nginx

    一.安装步骤 1.下载 nginx 源码包 官网$ wget http://nginx.org/download/nginx-1.16.0.tar.gz 2.解压 nginx 压缩包$ tar -zx ...

  9. 以两台Linux主机在docker中实现mysql主主备份以用nginx实现mysql高可用

    使用nginx反向代理主主备份的两台mysql,连接时连接nginx,当其中一台myql停止后,仍然可以正常使用,如果使用k8s 会简单许多.所谓主主复制就是在主从复制的基础上掉了个头. 请博主买块糖 ...

最新文章

  1. mysql的字符串函数大全_MySQL的字符串函数大全
  2. 【微信小程序】——实战开发之和风(含demo)
  3. maskView与CAGradientLayer那回事儿
  4. CodeForces - 336A Vasily the Bear and Triangle
  5. Unix环境高级编程学习笔记(五)
  6. Luogu P2319 [HNOI2006]超级英雄
  7. 如何在Linux/MacOS系统上安装Microsoft SQL Server
  8. 示波器电流探头应该怎么保养-PinTech品致
  9. EasyExcel导出Excel设置单元格文本格式(亲测有效)
  10. ruby_Ruby简介
  11. 【CF235C】Cyclical Quest(后缀自动机)
  12. JSON Viewer 安装
  13. 企业办理的icp许可证领取需要什么手续
  14. 大数据开源处理工具汇总
  15. maven阿里云仓库
  16. Mysql技术内幕innodb引擎笔记
  17. 机器学习100天(三十七):037 朴素贝叶斯-挑个好西瓜!
  18. 极光推送 (具体步骤,指导操作,推送成功)
  19. Windows10 pc使用Apple Studio Display显示器设置
  20. linux下小企鹅输入法,支持五笔

热门文章

  1. cocos lua调用java_【Tech-Lua】Cocos-2dx-Lua调用java的小白教程(三)
  2. vscode 智能打印_vscode智能提示
  3. java parallelstream_关于Java8 parallelStream并发安全的深入讲解
  4. win7计算机管理找不到文件夹,Win7系统打开组策略提示找不到文件gpedit.msc怎么办...
  5. 江西财经研究生834c语言试卷,江西财经大学2006年考研C语言程序设计试题(B卷)
  6. php如何写log日志,用php生成log日志
  7. 核心动画与UIView
  8. ID3和C4.5分类决策树算法 - 数据挖掘算法(7)
  9. stage3d 骨骼优化
  10. JS将指定的时间戳转为UTC时间