diff --git a/cmd/dockerd/daemon_unix.go b/cmd/dockerd/daemon_unix.go index 9869043a7f..75583e6058 100644 --- a/cmd/dockerd/daemon_unix.go +++ b/cmd/dockerd/daemon_unix.go @@ -62,6 +62,9 @@ func getDaemonConfDir(_ string) (string, error) { func (cli *DaemonCli) getPlatformContainerdDaemonOpts() ([]supervisor.DaemonOpt, error) { opts := []supervisor.DaemonOpt{ + // TODO(thaJeztah) change this to use /proc/self/oom_score_adj instead, + // which would allow us to set the correct score even if dockerd's score + // was set through other means (such as systemd or "manually"). supervisor.WithOOMScore(cli.Config.OOMScoreAdjust), } diff --git a/libcontainerd/supervisor/remote_daemon.go b/libcontainerd/supervisor/remote_daemon.go index fd46e9ffbe..2df2794b55 100644 --- a/libcontainerd/supervisor/remote_daemon.go +++ b/libcontainerd/supervisor/remote_daemon.go @@ -13,6 +13,7 @@ import ( "github.com/containerd/containerd" "github.com/containerd/containerd/services/server/config" + "github.com/containerd/containerd/sys" "github.com/docker/docker/pkg/system" "github.com/pelletier/go-toml" "github.com/pkg/errors" @@ -40,6 +41,9 @@ type remote struct { daemonStopCh chan struct{} stateDir string + + // oomScore adjusts the OOM score for the containerd process. + oomScore int } // Daemon represents a running containerd daemon @@ -203,6 +207,10 @@ func (r *remote) startContainerd() error { r.daemonPid = cmd.Process.Pid + if err := r.adjustOOMScore(); err != nil { + r.logger.WithError(err).Warn("failed to adjust OOM score") + } + err = os.WriteFile(filepath.Join(r.stateDir, pidFile), []byte(fmt.Sprintf("%d", r.daemonPid)), 0660) if err != nil { system.KillProcess(r.daemonPid) @@ -214,6 +222,18 @@ func (r *remote) startContainerd() error { return nil } +func (r *remote) adjustOOMScore() error { + if r.oomScore == 0 || r.daemonPid <= 1 { + // no score configured, or daemonPid contains an invalid PID (we don't + // expect containerd to be running as PID 1 :)). + return nil + } + if err := sys.SetOOMScore(r.daemonPid, r.oomScore); err != nil { + return errors.Wrap(err, "failed to adjust OOM score for containerd process") + } + return nil +} + func (r *remote) monitorDaemon(ctx context.Context) { var ( transientFailureCount = 0 diff --git a/libcontainerd/supervisor/remote_daemon_options_linux.go b/libcontainerd/supervisor/remote_daemon_options_linux.go index 14511dbf93..9be34177ed 100644 --- a/libcontainerd/supervisor/remote_daemon_options_linux.go +++ b/libcontainerd/supervisor/remote_daemon_options_linux.go @@ -3,7 +3,7 @@ package supervisor // import "github.com/docker/docker/libcontainerd/supervisor" // WithOOMScore defines the oom_score_adj to set for the containerd process. func WithOOMScore(score int) DaemonOpt { return func(r *remote) error { - r.OOMScore = score + r.oomScore = score return nil } }