大家好,我是 WeiyiGeek,一名深耕安全运维开发(SecOpsDev)领域的技术从业者,致力于探索DevOps与安全的融合(DevSecOps),自动化运维工具开发与实践,企业网络安全防护,欢迎各位道友一起学习交流、一起进步 ,若此文对你有帮助,一定记得倒点个关注⭐与小红星❤️,收藏学习不迷路 。
使用 slab_state 模块采集 slab 内存使用情况
如何针对 Nginx 的 slab 内存做一个监控管理呢?
在淘宝开源的 tengine 中有一个名为 slab_state[1] 模块用于监控不同slot的使用情况,亦可查看每个slot的大小、已分配数量、使用数量、访问请求次数及失败次数等信息。
由于 slab_state 模块在页面上没提供下载连接,所以我们需下载 Tengine-2.4.1.tar.gz[2] 版本的源代码包解压使用,各位运友可选择 Nginx 或者 OpenResty 进行源码编译安装测试。由于本系列主要讲解的 Nginx ,所以就使用 Nginx 源码进行编译安装 slab_state 模块,配置反向代理缓存,最后查看slab内存分配情况。
操作流程
cd /usr/local/src
# 下载源代码
wget https://tengine.taobao.org/download/tengine-2.4.1.tar.gz
tar -zxvf tengine-2.4.1.tar.gz
# 查看模块
./tengine-2.4.1/modules/ngx_slab_stat/
config ngx_http_slab_stat_module.c README.cn README.md slab_stat.patch t
# 编译构建
wget http://nginx.org/download/nginx-1.28.0.tar.gz
tar -zxvf nginx-1.28.0.tar.gz
cd /usr/local/src/nginx-1.28.0
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --sbin-path=/usr/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --error-log-path=/var/log/nginx/logs/error.log --http-log-path=/var/log/nginx/logs/access.log --lock-path=/var/run/nginx.lock --modules-path=/usr/local/nginx/modules --with-http_stub_status_module --add-module=../tengine-2.4.1/modules/ngx_slab_stat/
make && make install
# 编辑配置文件
$vim /usr/local/nginx/conf/nginx.conf
...
http {
include mime.types;
default_type application/octet-stream;
# 以反向代理 grafana 为例
upstream backend {
zone http_backend 64k;
server 10.20.172.213:3000 weight=5;
}
# 反向代理缓存设置 10m
proxy_cache_path cache_backend keys_zone=cache_backend:10m;
server {
listen 80;
server_name localhost;
# 反向代理
location / {
proxy_pass http://backend;
proxy_cache cache_backend;
}
# 配置 slab_stat 指令
location /slab_status {
slab_stat;
#stub_status;
}
}
}
# 验证配置 & 重启服务
nginx -t
nginx -s reload
浏览器访问 http://10.20.172.214/slab_status 可看到 http_backend 共享内存大小为我们设置的 zone http_backend 64k,而 cache_backend 共享内存大小则设置的 keys_zone=cache_backend:10m ,其 slot 分配使用情况如下图所示:
weiyigeek.top-slab_status模块调用结果
实际上 Nginx 中原生 ngx_http_status_module 模块支持查看 slab 内存分配使用情况, 只不过是在商业版中才有,开源版本中只能自行引用Tengine中ngx_slab_stat模块源代码进行编译,文档直达:ngx_http_status_module[3]
weiyigeek.top-http_status模块
总结:slab内存管理使用best-fit思想,是Linux操作系统常用的内存分配方式,Nginx 在 使用共享内存时,通常需要通过slab分配器分配内存,再由上层数据结构进行对象维护。
引用链接
[1] slab_state: https://tengine.taobao.org/document/ngx_slab_stat.html
[2] Tengine-2.4.1.tar.gz: https://tengine.taobao.org/download/tengine-2.4.1.tar.gz
[3] ngx_http_status_module: https://nginx.org/en/docs/http/ngx_http_status_module.html
加入:作者【全栈工程师修炼指南】知识星球
『 全栈工程师修炼指南』星球,主要涉及全栈工程师(Full Stack Development)实践文章,包括但不限于企业SecDevOps和网络安全等保合规、安全渗透测试、编程开发、云原生(Cloud Native)、物联网工业控制(IOT)、人工智能Ai,从业书籍笔记,人生职场认识等方面资料或文章。
641