Magento 2店铺Redis因慢Lua脚本触发BUSY错误,请求排查脚本身份及解决方法
Magento 2店铺Redis因慢Lua脚本触发BUSY错误,请求排查脚本身份及解决方法
遇到这种Redis BUSY错误确实头疼,我来帮你一步步排查问题根源并给出解决思路:
首先先把你遇到的错误信息和慢脚本日志整理出来,方便后续分析:
BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE. Process went away
慢脚本日志:
2160643:M 04 Jun 2024 02:30:11.917 # Lua slow script detected: still in execution after 5098 milliseconds. You can try killing the script using the SCRIPT KILL command. Script SHA1 is: 6990147f5d1999b936dac3b6f7e5d2071908bcf3 2160643:M 05 Jun 2024 02:30:13.788 # Lua slow script detected: still in execution after 5064 milliseconds. You can try killing the script using the SCRIPT KILL command. Script SHA1 is: 6990147f5d1999b936dac3b6f7e5d2071908bcf3 2160643:M 05 Jun 2024 02:32:23.071 # Lua slow script detected: still in execution after 5793 milliseconds. You can try killing the script using the SCRIPT KILL command. Script SHA1 is: 6990147f5d1999b936dac3b6f7e5d2071908bcf3
第一步:先确定这个SHA1对应的Lua脚本内容
要解决问题,首先得知道这个慢脚本到底在做什么。你可以直接通过Redis命令获取脚本的源代码:
redis-cli SCRIPT FETCH 6990147f5d1999b936dac3b6f7e5d2071908bcf3
执行这个命令后,就能看到完整的Lua代码。结合代码逻辑,你就能判断它是Magento官方的缓存操作脚本、库存原子操作脚本,还是第三方扩展的自定义逻辑。
第二步:定位脚本的触发源
从日志时间来看,脚本总是在凌晨2点半左右触发,大概率是Magento的定时Cron任务导致的。你可以从这几个方向排查:
- 登录Magento后台,查看
系统 > 工具 > 计划任务,检查这个时间点有没有执行缓存清理、索引重建、库存同步或者批量数据处理的任务 - 检查是否安装了第三方扩展(比如库存管理、批量商品操作类的扩展),这类扩展为了保证Redis操作的原子性,经常会自定义Lua脚本
第三步:解决方法
临时应急:先解除Redis BUSY状态
如果当前Redis还处于BUSY状态,优先执行以下命令终止慢脚本:
redis-cli SCRIPT KILL
⚠️ 注意:这个命令只能终止未执行写操作的Lua脚本。如果脚本已经修改了Redis数据,那只能用SHUTDOWN NOSAVE(但会丢失未持久化的数据,不到万不得已不要使用)。
根源优化方案
- 脚本逻辑优化:
- 如果是Magento官方自带的脚本,检查你的Magento版本是否存在已知的性能bug,建议升级到对应分支的最新稳定版,官方会定期修复这类Redis相关的性能问题
- 如果是第三方扩展的脚本,联系扩展开发者获取优化版本,或者自行修改脚本(比如把大批次操作拆分成多个小批次,减少单次Lua脚本的执行时间)
- 调整Redis配置参数:
Redis默认的Lua脚本超时时间是5000ms,你可以适当调高这个阈值。找到Redis配置文件(比如redis.conf),修改lua-time-limit参数为10000ms(根据实际情况调整),然后重启Redis服务。但这只是临时缓解方案,还是要从脚本本身优化。 - 优化触发任务:
如果是Cron任务触发的慢脚本,把大任务拆分成多个小任务执行。比如把批量缓存清理改成分批次清理,或者调整Cron的执行时间(虽然你这个是凌晨,但如果数据量过大还是会超时)。
备注:内容来源于stack exchange,提问作者kekw
相关产品推荐
相关产品推荐

