heeroz
1.7.2.1 系统 ubuntu14
代码如下:
--测试redis timeout
local redis = require("resty.redis")
function do_redis_read()
local red = redis:new()
red:set_timeout(2000)
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
error("failed to connect:"..err)
return
end
local ok, err = red:auth("111111")
if not ok then
error("failed to authenticate:"..err)
return
end
local ok, err = red:set_keepalive(10000, 100)
if not ok then
ngx.say("failed to set keepalive: ", err)
return
end
end
do_redis_read()
local test = function(n)
local t1 = os.time()
for i=1,n do end
print("time ", os.time() - t1)
end
test(10000000000)
--ngx.sleep(10) 用sleep就无法还原出此问题
do_redis_read()
结果:
2014/09/01 19:52:00 [error] 11936#0: *798 lua tcp socket read timed out
2014/09/01 19:52:00 [error] 11936#0: *798 lua entry thread aborted: runtime error: /home/test.lua:16: failed to authenticate:timeout
大致情况就是,第二次读取redis数据时,如果之前有cpu用满的情况,第二次读写就会失败,我哪里用法有问题?
感谢。
On Mon, Sep 1, 2014 at 5:11 AM, Heero Zhang wrote:
> 2014/09/01 19:52:00 [error] 11936#0: *798 lua tcp socket read timed out
> 2014/09/01 19:52:00 [error] 11936#0: *798 lua entry thread aborted: runtime
> error: /home/test.lua:16: failed to authenticate:timeout
> 大致情况就是,第二次读取redis数据时,如果之前有cpu用满的情况,第二次读写就会失败,我哪里用法有问题?
我使用严格的串行请求无法复现你看到的问题。你看到这样的超时错误应当是你使用了并发请求吧?当有并发请求时,当请求 A 忙于 CPU
计算时,该计算会阻塞对应的 worker 进程的事件循环较长的时间,从而有可能让正在等待 IO 事件的请求 B
发生超时(毕竟你的超时设置只是 2 秒)。你的 socket 超时设置应长于最久可能的阻塞时间。
Regards,
-agentzh
heeroz
我使用的是串行,同时只有一个链接请求操作
当时我在ubuntu或windows下都复现出来了,明天我试试看用干净的系统看能否复现出来