在 2012年12月6日星期四UTC+8上午3时38分43秒,agentzh写道:
Hello!2012/12/5 Demon:
> 我想询问一下set_keepalive具体用法, 我现在有很多后端的redis(机器和端口号不同),
> 我为每一个redis配置了一个keepalive的timeout和size, 但是我发现这样执行起来效率并没有提升,
1. 请确认你使用的是 LuaJIT 2.0.0 正式版(或者更新的版本);
2. 请使用类似 netstat 这样的工具确认你的连接池确实起作用了。如果没有,请提供一个最小化的 Lua 代码片段。
1.确认是LuaJit2.0.0
2.从下面所描述的情况, 我实际一台nginx所有worker对A实例的长链应该到达 4 * 96(实际配置)个, 但是实际情况用netstat查看却只有30个左右, 大并发下面会响应不过来, 我开了info级的error_log, 但是没有相关错误信息.
完整的使用示例可以参见这里:
https://github.com/agentzh/lua-resty-redis#synopsis
> 我想确定的一点是,
> set_keepalive是否需要针对不同的server和port设置一个值, 比如 我有A和B两个后端redis size均为32,
> 我的本意是为A和B各保持32个长链接(如果有需要), 那么我究竟应该是set_keepalive(0, 32)还是set_keepalive(0,
> 64) ?
>
如果你想让 A 和 B 这两个不同的 redis 后端分别保持最多 32 个长连接,则在访问 A 或者 B 的 resty.redis
对象上都调用 set_keepalive(0, 32),因为默认情况下不同的 redis 后端拥有不同的连接池。
如果你希望 A 和 B 都共享一个连接池,则可以在 connect() 方法中指定 pool 选项,例如:
redA:connect("A", 6379, { pool = "my_redis_cluster" })
redB:connect("B", 6379, { pool = "my_redis_cluster" })
然后在调用 set_keepalive 时使用 64 作为这个 A、B 共享池的连接数上限:
redA:set_keepalive(0, 64)
redB:set_keepalive(0, 64)
更多细节可以参见文档:
https://github.com/agentzh/lua-resty-redis#connect
不过要注意的一点是,连接池是每 worker 的粒度,所以实际的第个 redis 后端的总连接数上限还要再用 32 剩上 worker 数。
Best regards,
-agentzh