我把lua_shared_dict当作本地缓存来给worker共享,并且同时用了lua_resty_lock来合并请求。shared_dict用了100GB,并且大概存储了1-2亿左右的键值对,过期时间设置了一天到一周不等,大小浮动较从1Byte到6KB都会有。
每个请求会查询约30个键值对,命中率不到一半,然后没有查询到的会去请求数据库并且得到结果后插入。在请求数量为170每秒的时候,持续运行4-6小时填充满100Gshared_dict,持续运行20小时左右时会突然系统雪崩,请求延迟从数十毫秒提升到数秒甚至十多秒。通过reload不能解决问题。kill进程重启后,缓存清空,恢复正常。
第一次使用openresty,找不太到这个问题的头绪。经过了解lua_shared_dict的确不太适合这样数量和大小的缓存使用,但为什么在缓存填充满后能保持持续运行一段时间,直到某个点出现问题?这个问题可以复现,并且两台机器同时跑基本上在几分钟内相继雪崩。雪崩的情况下我查询了lua_shared_dict和lua_resty_lock相关的log, timeout和no memory报错和雪崩前数量并没有相差太多。