Sidekiq MemoryKiller
原文:https://docs.gitlab.com/ee/administration/operations/sidekiq_memory_killer.html
Sidekiq MemoryKiller
GitLab Rails 应用程序代码遭受内存泄漏. 对于 Web 请求,可以使用puma-worker-killer
来解决此问题,如果超过内存限制,它将重新启动 Puma worker 进程. Sidekiq MemoryKiller 对 GitLab 用来处理后台作业的 Sidekiq 进程采用相同的方法.
与 puma-worker-killer(自 GitLab 13.0 起默认对所有 GitLab 安装启用)不同,Sidekiq MemoryKiller 默认仅对 Omnibus 软件包启用. 这样做的原因是,MemoryKiller 依赖于 runit 在内存引起的关闭之后重新启动 Sidekiq,并且从源头安装 GitLab 并不全部使用 runit 或等效版本.
使用默认设置,MemoryKiller 将使 Sidekiq 重新启动的频率不超过每 15 分钟一次,并且重新启动会为传入的后台作业造成大约一分钟的延迟.
一些后台作业依赖于长时间运行的外部流程. 为确保在重启 Sidekiq 时将它们彻底终止,每个 Sidekiq 进程应以进程组负责人的身份运行(例如,使用chpst -P
). 如果使用 Omnibus 或安装了runit
的bin/background_jobs
脚本, runit
为您处理.
Configuring the MemoryKiller
使用环境变量控制 MemoryKiller.
SIDEKIQ_DAEMON_MEMORY_KILLER
:默认为 0.设置为 1 时,MemoryKiller 在守护程序模式下工作. 否则,MemoryKiller 将在旧模式下工作.在传统模式下,MemoryKiller 在每个作业后检查 Sidekiq 进程 RSS.
在守护程序模式下,MemoryKiller 每 3 秒检查一次 Sidekiq 进程 RSS(由
SIDEKIQ_MEMORY_KILLER_CHECK_INTERVAL
定义).SIDEKIQ_MEMORY_KILLER_MAX_RSS
(KB):如果设置了此变量,并且其值大于 0,则启用 MemoryKiller. 否则,将禁用 MemoryKiller.SIDEKIQ_MEMORY_KILLER_MAX_RSS
定义了 Sidekiq 进程允许的 RSS.在传统模式下,如果 Sidekiq 进程超出允许的 RSS,则将触发不可逆的延迟正常重启. Sidekiq 的重启将在
SIDEKIQ_MEMORY_KILLER_GRACE_TIME
秒后发生.在守护程序模式下,如果 Sidekiq 进程超出允许的 RSS 的时间超过
SIDEKIQ_MEMORY_KILLER_GRACE_TIME
,则将触发正常重启. 如果 Sidekiq 进程在SIDEKIQ_MEMORY_KILLER_GRACE_TIME
内低于允许的 RSS,则重新启动将被中止.Omnibus 软件包的默认值在 Omnibus GitLab 存储库中设置 .
SIDEKIQ_MEMORY_KILLER_HARD_LIMIT_RSS
(KB):由守护程序模式使用. 如果 Sidekiq 进程 RSS(以千字节为单位)超过SIDEKIQ_MEMORY_KILLER_HARD_LIMIT_RSS
,则会立即立即正常重启 Sidekiq.SIDEKIQ_MEMORY_KILLER_CHECK_INTERVAL
:在守护程序模式下用于定义检查进程 RSS 的频率,默认为 3 秒.SIDEKIQ_MEMORY_KILLER_GRACE_TIME
:默认为 900 秒(15 分钟). 此变量的用法描述为SIDEKIQ_MEMORY_KILLER_MAX_RSS
一部分.SIDEKIQ_MEMORY_KILLER_SHUTDOWN_WAIT
:默认为 30 秒. 这定义了所有 Sidekiq 作业完成所允许的最长时间. 在此期间将不接受任何新作业,并且所有作业完成后该过程将立即退出.如果作业在此期间未完成,则 MemoryKiller 将通过将
SIGTERM
发送到 Sidekiq 进程来中断所有当前正在运行的作业.If the process hard shutdown/restart is not performed by Sidekiq, the Sidekiq process will be forcefully terminated after
Sidekiq.options[:timeout] * 2
seconds. An external supervision mechanism (e.g. runit) must restart Sidekiq afterwards.