一、debug_pool內存排查利器
1)接口調用觀察,使用方法
$ curl xxx://localhost:80/debug_pool
pid:18821
size: 223784 num: 2 cnum: 1 lnum: 10 ngx_init_cycle
size: 1536 num: 4 cnum: 1 lnum: 10 ngx_event_accept
size: 0 num: 1 cnum: 0 lnum: 0 ngx_http_lua_create_fake_request
size: 0 num: 1 cnum: 0 lnum: 0 main
size: 0 num: 1 cnum: 0 lnum: 0 ngx_http_lua_create_fake_connection
size: 0 num: 1 cnum: 0 lnum: 6 ngx_http_server_names
size: 8192 num: 4 cnum: 1 lnum: 0 ngx_http_create_request
size: 0 num: 1 cnum: 0 lnum: 0 ngx_http_lua_init_worker
size: 228KB num: 15 cnum: 3 lnum: 26 [SUMMARY]
2)指定pid觀察
你可以使用gdb腳本debug_pool.gdb來獲取指定進程的內存使用情況。
某些進程無法處理HTTP請求,列如master進程和tengine Proc 進程。
下面的示例展示如何獲取master進程的內存使用情況。
$ gdb -q -x debug_pool.gdb -p <pid of master process> |
3)參數說明
除了最后一行的每一行的輸出內容都有相同的格式,如下:
"__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。- ...
最后一行的輸出內容匯總了所有內存池的信息。
二、asan掃描
1.安裝asan庫
RUN yum install devtoolset-7-libasan-devel -y
2.支持asan編譯
RUN cd /root/nginx-rtsp/openresty-1.19.3.2 && ASAN_OPTIONS=detect_leaks=0 ./configure --prefix=/opt/nginx \
--with-pcre-jit \
--with-http_ssl_module \
--with-http_v2_module \
--add-module=../ngx_rtsp_module \
--add-module=../ngx_ff_module \
--add-module=../nginx-toolkit-module \
--add-module=../nginx-client-module \
--add-module=../nginx_upstream_check_module \
--add-module=../ngx_http_upstream_dyups_module \
--add-module=../3rdparty/ngx_debug_pool \
--with-cc-opt="-Werror -W -g -O0 -fno-omit-frame-pointer -fsanitize=address -fsanitize-recover=address" \
--with-ld-opt="-fsanitize=address -fsanitize-recover=address -lpthread"
3.環境變量配置
ENV ASAN_OPTIONS=halt_on_error=0:detect_container_overflow=0
4.掃描結果查看
過濾error.log日志AddressSanitizer字段排查異常。
三、perf & FlameGraph火焰圖分析
1)下載地址:官方下載FlameGraph即可。
2)使用說明:
perf record -e cpu-clock -g -p 1451612 //-p指定pid值,生成perf.data
perf script -i perf.data > perf.script //解析
./FlameGraph-master/stackcollapse-perf.pl perf.script >pref.folded //符號折疊
./FlameGraph-master/flamegraph.pl pref.folded >perf.svg //火焰圖生成