local num = 1
while true do
local sock = ngx.socket.tcp()
local ok, err = sock:connect("127.0.0.1", 6379)
num = num + 1
if num % 10 == 0 then
ngx.sleep(0.001)
end
end
上面的代码中6379 不存在监听, 在 timer 或 连接处理, stream 或http 模块均存在 内存泄露.
如果一个 全局定时器在 长时间运行中, 可能会 尝试建立多次连接(由于后端异常可能会有多次尝试).
这在长请求(如定时器启动的全局协程)有负面影响:
例如, redis 集群某个节点一直连接拒绝, 但是 我们不能直接认为全部redis后端异常, 大量事务处理导致大量的连接报错, 最终修复redis后, openresty 由于该内存问题, 可能需要重启. 这个例子假设了redis操作在一个请求(定时器)中.
频繁连接错误下, 连接池也无法避免.
socket应避免在一个请求中频繁断连.频繁错误的host需要有不可用 周期.
标题应改为 超长时间的长请求(或定时器全局协程, stream 长连接)中, 频繁sock:connect错误存在内存泄露风险.