HELLO! 春哥: 感谢回复
> 在 2015年9月1日星期二 UTC+8上午11:44:45,agentzh写道:
> Hello!
> 2015-08-31 21:06 GMT+08:00 humphery:
> 非常感谢你的回复,看样子1G的限制绕不过了?!
> 绕得过,可以使用 luajit-mm 这个 LuaJIT 扩展:
> https://github.com/cloudflare/luajit-mm
> 在 x86_64 上可以把每 VM 的 GC 管理内存的上限提高到约 2GB.
> 不过,说实话,真达到上限时,很多时候是因为我们自己写出了低效的 Lua 代码,疯狂地分配 Lua GC 对象。
> 根据你提供的方法在core文件中取得如下数据:
> (gdb) lgcstat
> 556851 str objects: max=287, avg = 59, min=18, sum=32968181
> 41782 upval objects: max=24, avg = 24, min=24, sum=1002768
> 483064 thread objects: max=1048, avg = 639, min=424, sum=308713272
> 这个 thread 对象的数目感觉有些夸张。你一共有多少下游连接?你每个请求内部平均创建多少个协程?尽量减少单位请求内的协程数目(包括
> coroutine.create 创建的和 ngx.thread.spawn 创建的)。
我这个应用用的是长连接,处理客户端的请求的同时需要下发来自服务器的推送消息,因此每个WEBSOCKET连接都新建一个thread用于处理服务下发的消息,处理逻辑如下:
local wsserver = require "resty.websocket.server"
local mqttsvr = require "resty.mqtt.mqtt"
...
local processSubscribeThread,err = ngx.thread.spawn(mqttsvr.mqtt_thread_processSubscribe,mqttsvr) --处理Subscribe消息
while(true) do
local data, typ, err = wb:recv_frame()
...
mqttsvr:parse_message(data)
end
-- other destroy...
因此thread与客户端连接数成正比关系
> 164 proto objects: max=3143, avg = 382, min=80, sum=62687
> 1794669 func objects: max=144, avg = 21, min=20, sum=39395808
> 这个 func 对象的数目也太夸张了。建议尽量避免每请求时创建新的 Lua closer(或 Lua 函数)。Lua
> 函数的定义尽可能地放到你自己 Lua module 中。
通过优化现已经将func大幅降低:)
247330 func objects: max=144, avg = 20, min=20, sum=4952788
> 36 trace objects: max=1500, avg = 473, min=160, sum=17060
> 92087 cdata objects: max=4112, avg = 16, min=12, sum=1477512
> 2719842 tab objects: max=4194344, avg = 174, min=32, sum=475144600
> 另外,建议避免创建过碎的 Lua table. 能复用则复用。
> 稍微调整一下你的 Lua 代码就可以避免很多无谓的 Lua GC 对象的分配,特别是那些朝生暮死的临时对象。
> Regards,
> -agentzh
tab数量正在定位,新一轮的测试结果如下:
(gdb) lgcstat
802677 str objects: max=287, avg = 68, min=18, sum=54706362
330 upval objects: max=24, avg = 24, min=24, sum=7920
435011 thread objects: max=976, avg = 610, min=64, sum=265753480
172 proto objects: max=3066, avg = 401, min=80, sum=69016
247330 func objects: max=144, avg = 20, min=20, sum=4952788
54 trace objects: max=1500, avg = 503, min=160, sum=27176
213096 cdata objects: max=4112, avg = 16, min=12, sum=3413656
2935653 tab objects: max=4194344, avg = 157, min=32, sum=462322080
501909 udata objects: max=440, avg = 374, min=40, sum=188183085
sizeof strhash 4194304
sizeof g->tmpbuf 16384
sizeof ctype_state 8664
sizeof jit_state 6040
total sz 983666179
g->strnum 802677, g->gc.total 983666179
elapsed: 694.270000 sec