Ubuntu-Server:每个SSH-Connect都会创build一个未删除的cgroup

我们正在运行一些Ubuntu 14.04服务器,它为创build的每个SSH会话创build一个新的cgroup ,但是遗憾的是当会话closures时,cgroups不会被删除。

因为我们也在其中一台服务器上运行GitLab ,一些Git-clients每分钟轮询一次,所以我们每周会为成千上万的僵尸cgroup提供git-user。

大约每月一次,我们达到了导致cgroup-limit问题的cgroup-limit

启动容器进程导致“process_linux.go:258:应用cgroupconfiguration导致进程”mkdir / sys / fs / cgroup / memory / docker / 28485427c2689d7a2c4be83990af873e9ab5732c5c741f0d10bfc3ba21b1d167:设备上没有剩余空间“

看来这个问题只发生在安装了docker的服务器上。 其他服务器正确删除cgroups。 也许docker安装依赖关系是这里的问题。 Docker本身正在删除它的cgroups。

对于我们所知的问题唯一的解决办法就是重新启动机器。

这里docker version的输出:

 Client: Version: 17.03.1-ce API version: 1.27 Go version: go1.7.5 Git commit: c6d412e Built: Mon Mar 27 17:10:36 2017 OS/Arch: linux/amd64 Server: Version: 17.03.1-ce API version: 1.27 (minimum version 1.12) Go version: go1.7.5 Git commit: c6d412e Built: Mon Mar 27 17:10:36 2017 OS/Arch: linux/amd64 Experimental: false 

这里的docker info的输出

 Containers: 3 Running: 3 Paused: 0 Stopped: 0 Images: 4576 Server Version: 17.03.1-ce Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 2359 Dirperm1 Supported: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe init version: 949e6fa Security Options: apparmor Kernel Version: 4.2.0-42-generic Operating System: Ubuntu 14.04.5 LTS OSType: linux Architecture: x86_64 CPUs: 8 Total Memory: 31.33 GiB Name: repo ID: KT6V:FLPI:EHY6:2FSP:NEBT:T65W:23IX:IRFK:AQM5:KSLM:FQ3D:57X5 Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ WARNING: No swap limit support Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false 

内核版本通过uname -a

Linux repo 4.2.0-42-generic#49〜14.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

cat /proc/cgroups ~3h正常运行后:

 #subsys_name hierarchy num_cgroups enabled cpuset 1 623 1 cpu 2 627 1 cpuacct 3 623 1 blkio 4 623 1 memory 5 627 1 devices 6 623 1 freezer 7 623 1 net_cls 8 623 1 perf_event 9 623 1 net_prio 10 623 1 hugetlb 11 623 1 

在这些623个cgroup中,616位于/sys/fs/cgroup/memory/user/998.user ,其中用户998是git用户。

我知道这不是理想的解决scheme,因为它只是消除了症状,而不是原因,但是现在我创build了一个可以通过cron运行的脚本。

 #!/bin/bash set -e CGROUP_BASE_DIR="/sys/fs/cgroup" declare -a CGROUP_SUBSYSTEMS=('cpuset' 'cpu' 'cpuacct' 'blkio' 'memory' 'devices' 'freezer' 'net_cls' 'perf_event' 'net_prio' 'hugetlb') for CGROUP_SUBSYSTEM in "${CGROUP_SUBSYSTEMS[@]}"; do cd "${CGROUP_BASE_DIR}/${CGROUP_SUBSYSTEM}" for OLD_CGROUP in $(find user/*.user/*.session -type d -ctime +10); do /usr/bin/cgdelete -r "${CGROUP_SUBSYSTEM}:/${OLD_CGROUP}" done done 

这将search所有超过10天的session-cgroups,并使用cgroup-tools cgdelete删除它们。