Hello! 2013/3/10 Aaron Lewis <the.war...@gmail.com>: > ngx.socket.tcp 出现 socket busy 一般是什么原因造成的? > > 我没有使用全局的共享变量,所有的 tcp 对象都是每个线程独立的 (local),也没有使用 keepalive > 这个错误只会当 nginx worker 进程中的多个并发请求试图同时访问一个 cosocket 对象的时候才会出现。 你自己编写的 Lua 模块中很可能有一些局部变量并没有声明为 local,从而造成意外的跨请求 socket 共享。建议总是为写入未声明的 Lua 变量的操作加上运行时检查,比如使用 strict.lua 或者使用 ngx_lua 官方文档中建议的代码片段:http://wiki.nginx.org/HttpLuaModule#Lua_Variable_Scope 先前 bigplum 同学也遇到过这个错误,最后发现正是出于这个原因,为相关的模块函数的局部变量都加上 local 之后问题就解决了。可以参考我们当时在 github issues 上面的讨论: https://github.com/chaoslawful/lua-nginx-module/issues/150 另外,这个错误与是否使用 cosocket 连接池没有关系。cosocket 连接池本身总是并发安全的。 Best regards, -agentzh
Hi,ngx.socket.tcp 出现 socket busy 一般是什么原因造成的? 我没有使用全局的共享变量,所有的 tcp 对象都是每个线程独立的 (local),也没有使用 keepalive
Hello! 2013/3/10 Aaron Lewis <the.warl...@gmail.com>: > ngx.socket.tcp 出现 socket busy 一般是什么原因造成的? > > 我没有使用全局的共享变量,所有的 tcp 对象都是每个线程独立的 (local),也没有使用 keepalive > 这个错误只会当 nginx worker 进程中的多个并发请求试图同时访问一个 cosocket 对象的时候才会出现。 你自己编写的 Lua 模块中很可能有一些局部变量并没有声明为 local,从而造成意外的跨请求 socket 共享。建议总是为写入未声明的 Lua 变量的操作加上运行时检查,比如使用 strict.lua 或者使用 ngx_lua 官方文档中建议的代码片段:http://wiki.nginx.org/HttpLuaModule#Lua_Variable_Scope 先前 bigplum 同学也遇到过这个错误,最后发现正是出于这个原因,为相关的模块函数的局部变量都加上 local 之后问题就解决了。可以参考我们当时在 github issues 上面的讨论: https://github.com/chaoslawful/lua-nginx-module/issues/150 另外,这个错误与是否使用 cosocket 连接池没有关系。cosocket 连接池本身总是并发安全的。 Best regards, -agentzh
Hello! 2013/3/11 Aaron Lewis: > 挺有意思,如果我用 setmetatable 来保存 socket,那么就不会出现这个错误; > > 如果我把socket放在函数外面,就会出错 > 放在函数外面,同时又是 module(...) 里面? Lua 模块级别的变量在 ngx_lua 中是 nginx worker 级别共享的,文档中有专门的讨论: http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker Best regards, -agentzh