> nginx的占用内存持续增加,CPU使用率也有小幅增加
这里内存持续增加,是指压测过程中内存不断增加,而且压测结束后相当长一段时间都维持在高位不减少吗?
压测过程中,单纯的 占用内存持续增加 并不是什么问题,GC 并不保证每个请求用到的内存都能在请求结束后立刻释放。
lj_str_new 函数占比的变化其实还有另一种解释,`ngx.var.session_id = get_session_id()` 调用时,可能会创建字符串 “session_id"。如果 get_session_id 返回的结果不是字符串,由于类型转化的关系,也会创建新的字符串。
建议试下相关的 GC 检查工具,看看具体是什么情况?
https://github.com/openresty/openresty-gdb-utils#lgcstat
https://github.com/openresty/stapxx#lj-gc-objs
在 2017年8月12日星期六 UTC+8下午3:15:03,lili...@gmail.com写道:
版本:openresty-1.9.15.1
LuaJIT-2.1
lua-5.1.5
应用的场景是这样的
location / {
set session_id "";
content_by_lua_block {
ngx.var.seesion_id = get_session_id()
}
}
持续压测运行后,发现nginx的占用内存持续增加,CPU使用率也有小幅增加。
通过对热点函数的分析,对比启动时和运行较长时间之后热点函数分布,发现lj_str_new函数在压测较长时间后,排名到top1.
所以怀疑是GC并没有回收生命周期结束的字符串,导致了hash表的持续增长,从而内存和cpu使用率双增。
将上述代码改造成如下再进行压测,就没这个问题了
location / {
set session_id "";
content_by_lua_block {
local seesion_id = get_session_id()
}
}
按理来说ngx.var.VARIABLE是请求级的,请求结束也就释放了,不应有问题才对。
大家帮忙一起分析看看