该模块可以提供nginx/tengine内存池占用内存的状态信息。
示例
获取worker进程的信息
http { |
请求URI /debug_pool,可以获取到接受该请求的worker进程的内存使用情况。
页面输出如下:
$ curl http://localhost:80/debug_pool |
获取指定进程的信息
你可以使用gdb脚本debug_pool.gdb来获取指定进程的内存使用情况。
某些进程无法处理HTTP请求,列如master进程和tengine Proc 进程。
下面的示例展示如何获取master进程的内存使用情况。
$ gdb -q -x debug_pool.gdb -p <pid of master process> |
数据
除了最后一行的每一行的输出内容都有相同的格式,如下:
"__size__: %12u __num__: %12u __cnum__: %12u __lnum__: %12u __\<function name\>__"
- size: 当前内存池占用的内存
- num: 内存池创建的个数(包括当前正在使用的内存池数量和已经被释放的内存池数量)
- cnum: 当前正在使用的内存池数量
- lnum: 该类内存池调用ngx_palloc_large()次数
- funcion name: 创建该内存池的nginx/tengine C函数的函数名
- 通过创建该内存池的函数的函数名,我们可以知道各个模块的内存使用情况,列如:
ngx_http_create_request
创建的内存池用于HTTP请求。- 因为大多数模块直接从该内存池上分配内存,所以很难区分具体哪个模块使用了内存。
ngx_event_accept
创建的内存池用于TCP连接。ngx_init_cycle
创建的内存池用于解析nginx/tengine的配置和保存其他全局数据结构。ngx_http_lua_init_worker
用于指令init_worker_by_lua。- ...
最后一行的输出内容汇总了所有内存池的信息。
安装
$ ./configure --add-module=./modules/ngx_debug_pool |
指令
Syntax: debug_pool
Default:none
Context:server, location
nginx/tengine的内存池使用信息可以通过该location访问到。
例外
不通过内存池分配的内存不会被该模块统计到。
例如,ngx_http_spdy_module模块会通过malloc(ngx_alloc)为SYN_REPLY帧的生数据分配一块临时缓冲区,该缓冲区在此数据被用于压缩后会被立即释放。