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

时间:2017-08-15 09:27:19

标签: git ubuntu docker ssh ubuntu-14.04

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

由于我们还在其中一台服务器上运行 GitLab ,而且每分钟一些Git客户端轮询一次,我们每周最终会为git-user提供数千个zombie cgroup。

大约每月一次我们到达cgroup-limit会导致docker问题:

  

启动容器进程导致“process_linux.go:258:申请   进程的cgroup配置导致了“mkdir   / SYS / FS / cgroup中/内存/泊坞窗/ 28485427c2689d7a2c4be83990af873e9ab5732c5c741f0d10bfc3ba21b1d167:   设备上没有剩余空间\“”

似乎问题只发生在安装了docker的服务器上。其他服务器正确删除cgroup。也许docker install-dependencies之一就是问题所在。 Docker本身正在正确删除其cgroup。

我们所知道的问题的唯一解决方法是重新启动机器。

这里是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

运行〜3小时后

cat /proc/cgroups

#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用户。

1 个答案:

答案 0 :(得分:0)

我知道它不是理想的解决方案,因为它只消除了症状而不是原因,但是现在我创建了一个可以通过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

这将搜索超过10天的所有会话cgroup,并使用cgdelete中的cgroup-tools删除它们。