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

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

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

slab内存管理

AAffA0nNPuCLAAAAAElFTkSuQmCC

image.png

AAffA0nNPuCLAAAAAElFTkSuQmCC

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 使用状态

数据监控,数据统计。

AAffA0nNPuCLAAAAAElFTkSuQmCC

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去查看共享内存的使用情况。

AAffA0nNPuCLAAAAAElFTkSuQmCC

image.png

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

slab_stat 如何使用

AAffA0nNPuCLAAAAAElFTkSuQmCC

image.png

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

代码走起

AAffA0nNPuCLAAAAAElFTkSuQmCC

image.png

AAffA0nNPuCLAAAAAElFTkSuQmCC

image.png

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

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

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

相关文章

睡觉时:新增的Java 8新增功能

自Java 8推出以来,最有趣的功能是什么? Java 8最近庆祝了它的第一个生日,而主要版本刚刚一年多前发布。 这当然值得庆祝。 自从最初的Java 8版本问世以来,已经发布了六个更新。 这些更新中的一些元素是次要的,但是如…

树莓派安装win10arm linux,在树莓派3B 上安装 Windows 10 ARM 版的方法

早先关注我们的朋友可能对《国外开发者尝试在树莓派3上运行Windows 10桌面版》有印象。本文转自 amatfan.com,文末视频来自 daveb778(感谢柠栀和刺分享),给出了如何在树莓派3B上安装Windows10 ARM版,是的,这次并非IoT版&#xff0…

各种触摸手势

轻按(UITapGestureRecognizer) -- 用一个或多个手指在屏幕上轻按。 按住(UILongPressGestureRecognizer) -- 用一个或多个手指在屏幕上按住。 轻扫(UISwipeGestureRecognizer) -- 用一个或多个手指沿特定方向轻扫。 张合(UIPinchGestureRecognizer) -- 张合手指以缩放对象。 旋…

宝塔linux取消登录,宝塔面板如何关闭安全入口

通过 SSH 终端关闭安全入口通过 SSH 终端连接rm -f /www/server/panel/data/admin_path.pl即可关闭宝塔 Linux 面板的安全入口,关闭之后的面板登录地址就是:http://服务器 IP:8888。不过关闭这个安全入口之后很难恢复,所以不建议关闭宝塔面板…

[ofbiz]设置任务计划(job),提示service_item已经传递

问题描述:设置任务计划(job),提示service_item已经传递 解决办法: 红色框内不要填写,就可以了。"已经传递"是翻译的不准确,应该是"已过时",所以不设置开始时间,或者开始时间…

c支限界算法语言n皇后问题分,n皇后问题(分析)

这道题需要用到回溯算法,现在在这里先简单的介绍一下这个算法:回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路…

android系统相机自动录像,android 调用系统相机录像并保存

1、在AndroidManifest.xml中添加如下代码tools:ignore"ProtectedPermissions" />android:authorities"${applicationId}.provider"android:name"android.support.v4.content.FileProvider"android:exported"false"android:grantUri…

【原创】jpgraph中文乱码问题的解决

php jpgraph库非常强大,可以在后台生成图片 后台生成在需要导出图表型报告的时候非常有用,当然,前端的可视化还是要用highcharts/echarts/anycharts等类库 比较麻烦的是中文乱码问题,有3个地方乱码: legendsetStickLab…

getstring方法android,JSON中optString和getString方法的区别

JSON中optString和getString方法的区别更新时间:2017年07月07日 15:18:24 投稿:mrroptString方法会在对应的key中的值不存在的时候返回一个空字符串,但是getString会抛一个JSONException 。下面通过一段代码给大家介绍JSON中optString和get…

jpanel把原本内容覆盖掉_A5:APP关键词覆盖你该了解哪些

A5:APP关键词覆盖你该了解哪些点击上方蓝字关注我们苹果ios/安卓-各大应用商店ASO优化大全IOS关键词覆盖1、苹果AppStore关键词搜索的权重排序为app标题、副标题>app关键词>app描述>宣传文本及评论(App关键词100字符)。2、如何优化100字符关键词①、根据产品用户画像分…

android音乐播放器音乐加载,Android开源音乐播放器之在线音乐列表自动加载更多...

系列文章前言当咱们的ListView数据比较多时,咱们通常都会选择分页显示,而分页显示就须要一个动做触发加载更多操做,一般咱们会使用上拉加载更多,但我以为不够人性化,由于用户须要手动上拉,因此更加人性化的…

最短路径--Floyd算法

Floyd算法 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3)…

vue 打开一个iframe_Vue 之五 —— 单元测试

单元测试(unit testing):是指对软件中的最小可测试单元进行检查和验证。代码的终极目标有两个,第一个是实现需求,第二个是提高代码质量和可维护性。单元测试是为了提高代码质量和可维护性,是实现代码的第二…

Hibernate如何存储二级缓存条目

介绍 使用数据库访问抽象层的好处是可以透明地实现缓存,而不会泄漏到业务逻辑代码中 。 Hibernate Persistence Context充当事务后写式高速缓存 ,将实体状态转换转换为DML语句。 持久性上下文充当逻辑事务存储,并且每个Entity实例最多可以具…

file协议访问linux,Mozilla Firefox for Android 'file'协议未授权访问漏洞(CVE-2014-1501)

发布日期&#xff1a;2014-03-18更新日期&#xff1a;2014-04-02受影响系统&#xff1a;Mozilla Firefox < 28.0描述&#xff1a;--------------------------------------------------------------------------------BUGTRAQ ID: 66424CVE(CAN) ID: CVE-2014-1501Firefox是…

dcdc芯片效率不高的原因_半导体厂商如何做芯片的出厂测试?

本文来源于知乎&#xff0c;已获作者授权&#xff0c;谢谢。作者&#xff1a;温戈链接&#xff1a;https://www.zhihu.com/question/20584576/answer/1538640891知乎网友提问&#xff1a;半导体厂商如何做芯片的出厂测试&#xff1f;例如 Intel 的 CPU、手机处理器&#xff0c;…

魅族android n内测报名,不再万年Android 5.0! Flyme安卓N内测招募开启

科客点评&#xff1a;恰逢Flyme五周年庆&#xff0c;这算的是给煤油们最大的礼物。近日&#xff0c;魅族Flyme系统非常活跃&#xff0c;为国内友商操碎了心&#xff0c;为此适配了一众友商热门机型&#xff0c;刷了不少存在感&#xff0c;但这显然不是魅族要搞的“大事情”。6月…

db2数据库连接数 linux_介绍一款数据库管理工具DBeaver

之前连接MySQL一直使用的是navicate&#xff0c;挺好用的&#xff0c;不过是个付费软件&#xff0c;一直想找一款免费开源的软件来替代。今天偶然间发现DBeaver&#xff0c;这是一款基于java开发的数据库工具&#xff0c;而且可以支持Windows、Linux、MacOS多个平台&#xff0c…

jqgrid mvc_jqGrid,REST,AJAX和Spring MVC集成

jqgrid mvc两年多以前&#xff0c;我写了一篇关于如何在Struts2中实现优雅的CRUD的文章。 实际上&#xff0c;我必须就该主题写两篇文章&#xff0c;因为该主题如此广泛。 今天&#xff0c;我采用了一套更为流行的&#xff0c;完善的框架和库&#xff0c;采用了更为轻量级的现代…

ChronicleMap –具有堆外内存的Java体系结构

我的上一篇文章是在几周前写的&#xff0c;在收到一些有效的反馈后&#xff0c;我想澄清几点&#xff0c;作为本文的序言。 “ 使用零垃圾创建数百万个对象 ”的主要收获应该是&#xff0c;使用Chronicle&#xff0c;在编写Java程序时&#xff0c;您不会“局限于”使用jvm分配…