# Sidekiq MemoryKiller

> 原文：[https://docs.gitlab.com/ee/administration/operations/sidekiq_memory_killer.html](https://docs.gitlab.com/ee/administration/operations/sidekiq_memory_killer.html)

*   [Configuring the MemoryKiller](#configuring-the-memorykiller)

# Sidekiq MemoryKiller[](#sidekiq-memorykiller "Permalink")

GitLab Rails 应用程序代码遭受内存泄漏. 对于 Web 请求，可以使用[`puma-worker-killer`](https://github.com/schneems/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[](#configuring-the-memorykiller "Permalink")

使用环境变量控制 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 存储库中设置](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-cookbooks/gitlab/attributes/default.rb) .

*   `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.