hi,
如果是使用的标准lua,可以用debug hook来防止死循环,比如设置运行多少条(字节码)指令之后调用hook。但是如果使用luajit则无法用此方法,因为jit之后没法统计字节码。
防止死循环的做法,我觉得可以从下面几个地方:
1, 尽量在测试时候发现这些可能死循环的地方,毕竟即使你用c编写代码,同样可能发生死循环;
2, 自己在应用代码的可能死循环的地方添加一些判断,比如设置一个变量,每次运行某段代码时,加一,并检查是否超过某个阈值;
3, 在运行机上加一些监控,发生死循环时,一般该进程会导致cpu占用达到100%,出现cpu占用持续过高的情况时,报警或者reload nginx
agentzh
Hello!
2013/3/4 pengqi:
> 3, 在运行机上加一些监控,发生死循环时,一般该进程会导致cpu占用达到100%,出现cpu占用持续过高的情况时,报警或者reload nginx
>
某个 worker 进程的 CPU
使用率较高时,自然应当上“火焰图”工具进行实时采样,以确定瓶颈所在(对于死循环或者较长时间的循环,但是这样的循环的所在),呵呵:
https://github.com/agentzh/nginx-systemtap-toolkit/#ngx-sample-lua-bt
特别地,对于很热的 Lua 计算,应当自己在循环中手动插入 ngx.sleep(0.001) 这样的调用,以便把控制权定时 yield 给
Nginx 事件循环。
通过 debug hook 自动对用户 Lua 代码进行执行超时保护确实还是 ngx_lua 模块的 TODO,而且 LuaJIT 2.0
的 JIT 编译器也需要添加对 debug hook 的恰当支持(不过真实世界中运行在 ngx_lua 上的代码,多半也是运行在
LuaJIT 2.0 的解释器而非 JIT 编译后的,所以眼下也还是有些意义的,虽然不能保证覆盖所有的 Lua 代码)。
Best regards,
-agentzh
myoldman
hello!
谢谢各位的回复,受益匪浅,对nginx_lua更有信心了。
在 2013-03-05 14:37:03,agentzh <age...@gmail.com> 写道:
>Hello!
>
>2013/3/4 pengqi:
>> 3, 在运行机上加一些监控,发生死循环时,一般该进程会导致cpu占用达到100%,出现cpu占用持续过高的情况时,报警或者reload nginx
>>
>
>某个 worker 进程的 CPU
>使用率较高时,自然应当上“火焰图”工具进行实时采样,以确定瓶颈所在(对于死循环或者较长时间的循环,但是这样的循环的所在),呵呵:
>
> https://github.com/agentzh/nginx-systemtap-toolkit/#ngx-sample-lua-bt
>
>特别地,对于很热的 Lua 计算,应当自己在循环中手动插入 ngx.sleep(0.001) 这样的调用,以便把控制权定时 yield 给
>Nginx 事件循环。
>
>通过 debug hook 自动对用户 Lua 代码进行执行超时保护确实还是 ngx_lua 模块的 TODO,而且 LuaJIT 2.0
>的 JIT 编译器也需要添加对 debug hook 的恰当支持(不过真实世界中运行在 ngx_lua 上的代码,多半也是运行在
>LuaJIT 2.0 的解释器而非 JIT 编译后的,所以眼下也还是有些意义的,虽然不能保证覆盖所有的 Lua 代码)。
>
>Best regards,
>-agentzh
>
>--
>--
>邮件自: 列表“openresty”,专用于技术讨论!
>发言: 请发邮件到 openresty@googlegroups.com
>退订: 请发邮件至 openresty+unsubscribe@googlegroups.com
>详情: http://groups.google.com/group/openresty
>官网: http://openresty.org/
>仓库: https://github.com/agentzh/ngx_openresty
>建议: 提问的智慧 http://wiki.woodpecker.org.cn/moin/AskForHelp
>教程: http://agentzh.org/misc/nginx/agentzh-nginx-tutorials-zhcn.html
>
>---
>您收到此邮件是因为您订阅了 Google 网上论坛的“openresty”论坛。
>要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 openresty+unsubscribe@googlegroups.com。
>要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
>
>