Hello!
2014-04-19 0:09 GMT-07:00 Pahud Hsieh:
> 大部分情況ngx_lua運行表現都是很棒的,但是還是有可能因為某些原因運行超時了,不知道ngx_lua或nginx.conf是否有什麼類似max
> execution time的設定,可以避免ngx_lua運行超過一定的時間,例如最多20秒就必須結束,否則會被自動terminate並且產生nginx
> error log。
>
对于 IO 操作,你应当自己恰当地设置相关的超时配置。例如 ngx_proxy 模块提供了 proxy_connect_timeout,
proxy_rend_timeout 和 proxy_send_timeout 这些配置指令。再比如 ngx_lua 的 cosocket
API (以及对应的 lua-resty-redis, lua-resty-memcached, lua-resty-mysql
等上层客户端驱动)也提供了 settimeout(或 set_timeout)方法供设置超时保护。
对于 CPU 操作,你需要自己确保你的 Lua 代码逻辑不会执行过热,特别是避免过热的循环。我在 github 上面有提供现成的 gdb 和
systemtap 工具来定位这样的热 Lua 代码,比如
https://github.com/agentzh/nginx-gdb-utils#lbt
https://github.com/agentzh/stapxx#lj-lua-stacks
https://github.com/agentzh/stapxx#lj-lua-bt
未来 ngx_lua 或许会提供抢占式的针对热 Lua 代码的超时中断保护,基于自己的 OS 线程和 Lua debug hooks.
当然这种保护本身是有性能损耗的,无论是否被实际触发。这种保护对于运行不受信任的 Lua 代码时还是很有意义的,可以用于类似公共 App
Engine 那样的场景。
Regards,
-agentzh