Sidekiq作业时间显示偏移问题求助:两台服务器系统时间一致但Web UI展示存在3小时差
排查Sidekiq Web UI时间偏移问题的可能方向
这问题确实有点奇怪——明明两台服务器的系统时间、时区完全一致,Sidekiq Worker执行作业时的时间输出也没毛病,但Web UI显示的作业时间却差了3小时。结合Sidekiq的工作机制,我梳理了几个最可能的原因,你可以逐一排查:
1. Redis服务器的时间/时区不一致
Sidekiq的所有作业元数据(包括入队时间、延迟执行时间)都存在Redis里,Web UI直接读取Redis中的数据计算显示时间。如果两台服务器连接的是不同的Redis实例,或者共享的Redis服务器本身时间不对,就会导致显示差异。
排查步骤:
- 在两台服务器上分别执行
redis-cli TIME,这个命令会返回Redis服务器的Unix时间戳和微秒数,对比两者是否完全一致 - 如果Redis是单独部署的,直接登录Redis服务器执行
date命令,确认其系统时间和时区与A、B服务器一致
2. Sidekiq Web UI的时区配置被单独覆盖
虽然系统时区是Europe/Berlin,但Sidekiq Web模块可能被单独设置了时区,或者启动Web进程时的环境变量被修改了:
- 检查Rails项目的初始化文件(比如
config/initializers/sidekiq.rb),看有没有类似下面的配置:Sidekiq.configure_web do |config| config.timezone = "UTC" # 这里如果设置成其他时区,就会导致显示偏移 end - 检查Sidekiq Web进程的环境变量:找到Web进程的PID(用
ps aux | grep sidekiq-web),然后执行cat /proc/<PID>/environ | tr '\0' '\n' | grep TZ,看TZ变量是否被设置成非Europe/Berlin的值
3. 两台服务器的Sidekiq版本不一致
不同版本的Sidekiq Web UI在处理时区转换时可能存在bug。比如某些旧版本在解析Redis中存储的UTC时间时,没有正确转换为本地时区。
排查步骤:
- 在两台服务器上分别执行
bundle info sidekiq(如果用bundle管理)或者sidekiq -v,确认版本完全一致
4. 延迟作业的时间存储/解析逻辑异常
延迟作业的执行时间是以UTC格式存在Redis中的,Web UI需要把这个UTC时间转换为本地时区来计算剩余时间。如果服务器B的Web UI在转换过程中出现错误(比如把UTC时间当成了本地时间),就会导致剩余时间计算偏差。
你可以手动查看Redis中延迟作业的存储数据:
- 执行
redis-cli KEYS "schedule:*"找到延迟作业的key,然后用redis-cli GET <key>查看内容,确认里面的at字段是正确的UTC时间(比如你的测试作业里是2021-08-09 23:33:14 UTC),然后对比两台服务器的Web UI对这个时间的转换结果
5. 服务器B的NTP同步异常
虽然你执行date命令显示时间一致,但可能服务器B的NTP服务没有正常运行,导致时间存在微小偏移?不过从你的测试结果看,Worker执行时的时间是对的,这个可能性相对较低,但也可以排查:
- 执行
timedatectl status查看NTP服务的运行状态,确认两台服务器的NTP同步都正常
内容的提问来源于stack exchange,提问作者Tim Brandes
相关产品推荐
相关产品推荐

