Hi,各位大神好:
目前我们线上Nginx反向代理服务器遇到了如下的内存泄漏:
经过分析(分析过程见下面),仍然无法看出可能是哪里出现了问题,麻烦各位大神指明一个方向
一. 线上环境:Nginx 1.5.12,Lua 5.1.5
二. 排查过程:
经过最初的排查,确认是Lua方面存在内存泄漏。因此,把某个线上进程得不同内存占用时刻dump下来,产生core文件
进一步分析结果如下:
1.首先检查该Lua VM下确实是否分配了大量的内存
1.1. 该进程内存占用685M时,
(gdb) p ((lua_State *) 0x12c0d00)->l_G.totalbytes
$8 = 210533010
1.2 该进程内存占用786M时,
(gdb) p ((lua_State *) 0x12c0d00)->l_G.totalbytes
$2 = 307000271
在global_state中得统计数据显示,确实增长了近100M得内存,也确实占用较多。
2. 分析主thread下的global table
2.1 该进程内存占用685M时,
(gdb) p *(struct Table *)(((lua_State *) 0x12c0d00)->l_gt.value.gc)
$12 = {next = 0x12c0d00, tt = 5 '\005', marked = 1 '\001', flags = 0 '\000', lsizenode = 6 '\006', metatable = 0x0, array = 0x0,
node = 0x5abfe00, lastfree = 0x5ac0490, gclist = 0x12c0d00, sizearray = 0}
2.2 该进程占用786M时
(gdb) p *(struct Table *)(((lua_State *) 0x12c0d00)->l_gt.value.gc)
$3 = {next = 0x12c0d00, tt = 5 '\005', marked = 1 '\001', flags = 0 '\000', lsizenode = 6 '\006', metatable = 0x0, array = 0x0,
node = 0x5abfe00, lastfree = 0x5ac0490, gclist = 0x12c0d00, sizearray = 0}
3. 分析global_state下的stringtable
3.1 685M
(gdb) p ((lua_State *) 0x12c0d00)->l_G.strt
$14 = {hash = 0xfcdc000, nuse = 58947, size = 65536}
3.2 786M
(gdb) p ((lua_State *) 0x12c0d00)->l_G.strt
$4 = {hash = 0x17690000, nuse = 84502, size = 131072}
从以上分析发现,似乎不是全局table中得key 或者 全局 stringtable中得数据在无限增长。
4. 统计Lua VM下得所有数据占比
4.1 685M时,Lua VM下各数据结构如下:
lightuserdata 0
table 529543
function 218570
userdata 0
tthread 28407
proto 84
upval 11534
deadkey 0
sum 788138
4.2 786M时,Lua VM下各数据结构如下:
table 768602
function 316105
userdata 0
tthread 41180
proto 84
upval 16709
deadkey 0
sum 1142680