aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Heon <matthew.heon@gmail.com>2018-07-05 14:10:13 -0400
committerAtomic Bot <atomic-devel@projectatomic.io>2018-07-06 15:29:38 +0000
commiteae800789631baa7d377568b2019abd8359cbf70 (patch)
tree871496913e9d248a4b57bea39c42a154013de416
parent99959e55fa8e902302a580b13d53bc52d0074ad7 (diff)
downloadpodman-eae800789631baa7d377568b2019abd8359cbf70.tar.gz
podman-eae800789631baa7d377568b2019abd8359cbf70.tar.bz2
podman-eae800789631baa7d377568b2019abd8359cbf70.zip
Remove per-container CGroup parents
Originally, it seemed like a good idea to place Conmon and the container it managed under a shared CGroup, so we could manage the two together. It's become increasingly clear that this is a potential performance sore point, gains us little practical benefit in managing Conmon, and adds extra steps to container cleanup that interfere with Conmon postrun hooks. Revert back to a shared CGroup for conmon processes under the CGroup parent. This will retain per-pod conmon CGroups as well if the pod is set to create a CGroup and act as CGroup parent for its containers. Signed-off-by: Matthew Heon <matthew.heon@gmail.com> Closes: #1051 Approved by: umohnani8
-rw-r--r--libpod/container.go5
-rw-r--r--libpod/container_internal.go16
-rw-r--r--libpod/container_internal_linux.go43
-rw-r--r--libpod/oci_linux.go2
4 files changed, 2 insertions, 64 deletions
diff --git a/libpod/container.go b/libpod/container.go
index 3708ee287..24a5f93af 100644
--- a/libpod/container.go
+++ b/libpod/container.go
@@ -162,9 +162,6 @@ type containerState struct {
// the path of the file on disk outside the container
BindMounts map[string]string `json:"bindMounts,omitempty"`
- // CgroupCreated indicates that the container has created a cgroup
- CgroupCreated bool `json:"cgroupCreated,omitempty"`
-
// UserNSRoot is the directory used as root for the container when using
// user namespaces.
UserNSRoot string `json:"userNSRoot,omitempty"`
@@ -871,7 +868,7 @@ func (c *Container) NamespacePath(ns LinuxNS) (string, error) {
func (c *Container) CGroupPath() (string, error) {
switch c.runtime.config.CgroupManager {
case CgroupfsCgroupsManager:
- return filepath.Join(c.config.CgroupParent, fmt.Sprintf("libpod-%s", c.ID()), "ctr"), nil
+ return filepath.Join(c.config.CgroupParent, fmt.Sprintf("libpod-%s", c.ID())), nil
case SystemdCgroupsManager:
return filepath.Join(c.config.CgroupParent, createUnitName("libpod", c.ID())), nil
default:
diff --git a/libpod/container_internal.go b/libpod/container_internal.go
index 452be176c..94cd74c09 100644
--- a/libpod/container_internal.go
+++ b/libpod/container_internal.go
@@ -325,7 +325,6 @@ func resetState(state *containerState) error {
state.Interfaces = nil
state.Routes = nil
state.BindMounts = make(map[string]string)
- state.CgroupCreated = false
return nil
}
@@ -561,7 +560,6 @@ func (c *Container) init(ctx context.Context) error {
logrus.Debugf("Created container %s in OCI runtime", c.ID())
c.state.State = ContainerStateCreated
- c.state.CgroupCreated = true
if err := c.save(); err != nil {
return err
@@ -832,20 +830,6 @@ func (c *Container) cleanup() error {
lastError = err
}
- if err := c.cleanupCgroups(); err != nil {
- /*
- if lastError != nil {
- logrus.Errorf("Error cleaning up container %s CGroups: %v", c.ID(), err)
- } else {
- lastError = err
- }
- */
- // For now we are going to only warn on failures to clean up cgroups
- // We have a conflict with running podman containers cleanup in same cgroup as container
- logrus.Warnf("Ignoring Error cleaning up container %s CGroups: %v", c.ID(), err)
-
- }
-
// Unmount storage
if err := c.cleanupStorage(); err != nil {
if lastError != nil {
diff --git a/libpod/container_internal_linux.go b/libpod/container_internal_linux.go
index 327c78045..0dc02d117 100644
--- a/libpod/container_internal_linux.go
+++ b/libpod/container_internal_linux.go
@@ -6,12 +6,10 @@ import (
"context"
"fmt"
"path"
- "path/filepath"
"strings"
"syscall"
"time"
- "github.com/containerd/cgroups"
"github.com/containers/storage/pkg/idtools"
spec "github.com/opencontainers/runtime-spec/specs-go"
"github.com/opencontainers/runtime-tools/generate"
@@ -24,47 +22,6 @@ import (
"golang.org/x/sys/unix"
)
-// cleanupCgroup cleans up residual CGroups after container execution
-// This is a no-op for the systemd cgroup driver
-func (c *Container) cleanupCgroups() error {
- if !c.state.CgroupCreated {
- logrus.Debugf("Cgroups are not present, ignoring...")
- return nil
- }
-
- if c.runtime.config.CgroupManager == SystemdCgroupsManager {
- return nil
- }
-
- // Remove the base path of the container's cgroups
- path := filepath.Join(c.config.CgroupParent, fmt.Sprintf("libpod-%s", c.ID()))
-
- logrus.Debugf("Removing CGroup %s", path)
-
- cgroup, err := cgroups.Load(cgroups.V1, cgroups.StaticPath(path))
- if err != nil {
- // It's fine for the cgroup to not exist
- // We want it gone, it's gone
- if err == cgroups.ErrCgroupDeleted {
- return nil
- }
-
- return err
- }
-
- if err := cgroup.Delete(); err != nil {
- return err
- }
-
- c.state.CgroupCreated = false
-
- if c.valid {
- return c.save()
- }
-
- return nil
-}
-
func (c *Container) mountSHM(shmOptions string) error {
if err := unix.Mount("shm", c.config.ShmDir, "tmpfs", unix.MS_NOEXEC|unix.MS_NOSUID|unix.MS_NODEV,
label.FormatMountLabel(shmOptions, c.config.MountLabel)); err != nil {
diff --git a/libpod/oci_linux.go b/libpod/oci_linux.go
index 2128b7481..2be7ee07c 100644
--- a/libpod/oci_linux.go
+++ b/libpod/oci_linux.go
@@ -28,7 +28,7 @@ func (r *OCIRuntime) moveConmonToCgroup(ctr *Container, cgroupParent string, cmd
logrus.Warnf("Failed to add conmon to systemd sandbox cgroup: %v", err)
}
} else {
- cgroupPath := filepath.Join(ctr.config.CgroupParent, fmt.Sprintf("libpod-%s", ctr.ID()), "conmon")
+ cgroupPath := filepath.Join(ctr.config.CgroupParent, "conmon")
control, err := cgroups.New(cgroups.V1, cgroups.StaticPath(cgroupPath), &spec.LinuxResources{})
if err != nil {
logrus.Warnf("Failed to add conmon to cgroupfs sandbox cgroup: %v", err)