Ubuntu-服务器:每个 SSH 连接都会创建未删除的 cgroup
Ubuntu-Server: Every SSH-Connect creates non deleted cgroup
我们 运行 一些 Ubuntu 14.04 服务器以某种方式为每个 SSH 创建一个新的 cgroup-会话已创建,但遗憾的是,当会话关闭时,cgroups 不会被删除。
因为我们也在其中一台服务器上 运行 GitLab 和一些 Git-clients 每分钟轮询一次我们结束每周为 git 用户创建数千个僵尸 cgroup。
大约每月一次我们达到 cgroup-limit
导致问题 docker 说:
starting container process caused "process_linux.go:258: applying
cgroup configuration for process caused \"mkdir
/sys/fs/cgroup/memory/docker/28485427c2689d7a2c4be83990af873e9ab5732c5c741f0d10bfc3ba21b1d167:
no space left on device\""
似乎问题只出现在安装了 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
正常运行约 3 小时后:
#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 用户。
我知道这不是理想的解决方案,因为它只能消除症状而不是根源,但现在我创建了一个脚本,可以通过 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
中删除它们。
我们 运行 一些 Ubuntu 14.04 服务器以某种方式为每个 SSH 创建一个新的 cgroup-会话已创建,但遗憾的是,当会话关闭时,cgroups 不会被删除。
因为我们也在其中一台服务器上 运行 GitLab 和一些 Git-clients 每分钟轮询一次我们结束每周为 git 用户创建数千个僵尸 cgroup。
大约每月一次我们达到 cgroup-limit
导致问题 docker 说:
starting container process caused "process_linux.go:258: applying cgroup configuration for process caused \"mkdir /sys/fs/cgroup/memory/docker/28485427c2689d7a2c4be83990af873e9ab5732c5c741f0d10bfc3ba21b1d167: no space left on device\""
似乎问题只出现在安装了 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
正常运行约 3 小时后:
#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 用户。
我知道这不是理想的解决方案,因为它只能消除症状而不是根源,但现在我创建了一个脚本,可以通过 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
中删除它们。