扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

Nginx | slab_state 模块实践,实时追踪 slab 内存使用情况

2025/10/15
641
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,我是 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,从业书籍笔记,人生职场认识等方面资料或文章。

相关推荐