------------------ 原始邮件 ------------------
发件人: Johnny Wong <zhanla...@gmail.com>
发送时间: 2016年1月2日 12:06
收件人: openresty <openresty@googlegroups.com>
主题: Re: [openresty] ngx.shared.DICT 可以锁定吗?
是这样子, 比如说要计算10分钟之内的所有请求的平均响应时间, 假设我们使用
log_by_lua_file 这样的指令, 在这个lua脚本文件里做统计所有请求的处理时间总和,但是每累加一次请求的处理时间,我们必须存储总时间到共享内存里,以便下次请求来的时候取出来后再累加,因为请求是并发过来的,这样每次存取共享内存内的『总时间』就会有race condition,一个请求在做存储,另外一个请求在做get, 那么后边这个请求或取到的就有可能是脏数据。 从这样的角度看,每个请求对共享内存的存取,就是一个多线程的并发操作,必然要引入『锁』的概念,,另外的方法就是可以将所有get/set请求的做成异步的串行化操作。
On Saturday, January 2, 2016 at 5:23:32 AM UTC+8, agentzh wrote:
Hello!
2015-12-31 3:36 GMT-08:00 Johnny Wong:
> 我想做一个简单的nginx
> 日志分析,计算QPS,成功率,平均响应时间等,,使用shared.dict作为存储一段时间内所有request的平均响应时间等,,这时候对共享内存的存取,明显有一个race
> condition,请问如何能更好的解决这个问题?
我没看懂你这里说的 race condition,你能仔细描述一下吗?最好附带最小化的代码示例。
> 我对lua_ngx不是太熟悉,,请问是否有这样的一个机制,比如所有的request在处理完成后,都发一个Async的请求到shared dict
> ,increase本次request的响应时间,这样对于共享内存来说就是一个顺序的读写,不会存在race condtion ?
>
由于共享内存的存储并不涉及 I/O,甚至不涉及任何系统调用,我不明白你这里发到 shared dict 的"async
请求"有什么意义。如果你只是想作严格的串行化的话,我们可以在 lua shared dict 中引入 pipeline 的原语,类似
redis 的 pipeline 支持,这样可以稍微接近一点“事务”。你有兴趣贡献一个补丁吗?
Regards,
-agentzh
--