在容器里执行top指令,会发现,它显示的信息是宿主机的CPU和内存数据,而不是当前容器的数据。造成该问题的原因在于,容器通过Cgroups来为容器进程设置资源限制,但是/proc 文件系统并不知道用户通过Cgroups给这个容器做了什么样的资源限制,/proc 文件系统不了解Cgroups限制的存在。
# 启动一个容器
teledb@teledb-XPS-8930:~$ docker run -it -m 256m --memory-swap 256m centos /bin/bash
[root@5dc9ff32e459 /]# top 查看发现并没有获取到正确的资源限制
执行top命令查看,发现容器没有获取到正确的资源限制
解决思路
宿主机上执行top指令,是从/proc/stats 目录下获取数据,所以容器不挂载宿主机的该目录即可。lxcfs可实现该功能,它将宿主机的/var/lib/lxcfs/proc/meminfo文件挂载到Docker容器的/proc/meminfo 位置后,容器中进程读取相应文件内容后,lxcfs的fuse实现会从容器对应的Cgroups中读取正确的内存限制,从而使应用获取正确的资源约束。
lxcfs安装
# yum install offline
[ceph@k8s-master lxcfs-4.0.7] sudo yum install -y --downloadonly --downloaddir=/data/tzj/rpm fuse fuse-lib fuse-devel
[ceph@k8s-master lxcfs-4.0.7] sudo yum localinstall /data/tzj/rpm/*.rpm
# make
[ceph@k8s-master lxcfs-4.0.7] cd docker/lxcfs-4.0.7/
[ceph@k8s-master lxcfs-4.0.7] ./configure
[ceph@k8s-master lxcfs-4.0.7] make
[ceph@k8s-master lxcfs-4.0.7] sudo make install
# test
[ceph@k8s-master lxcfs-4.0.7]$ lxcfs -v
4.0.7
隔离测试
[ceph@k8s-master docker] sudo mkdir -p /var/lib/lxcfs
[ceph@k8s-master docker] sudo lxcfs /var/lib/lxcfs
sudo: lxcfs: command not found
# bash -c error too,use root users
[root@k8s-master docker]# lxcfs /var/lib/lxcfs
Running constructor lxcfs_init to reload liblxcfs
mount namespace: 4
hierarchies:
0: fd: 5: name=systemd
1: fd: 6: perf_event
2: fd: 7: memory
3: fd: 8: cpu,cpuacct
4: fd: 9: hugetlb
5: fd: 10: blkio
6: fd: 11: net_cls,net_prio
7: fd: 12: cpuset
8: fd: 13: pids
9: fd: 14: freezer
10: fd: 15: devices
Kernel supports swap accounting
api_extensions:
- cgroups
- sys_cpu_online
- proc_cpuinfo
- proc_diskstats
- proc_loadavg
- proc_meminfo
- proc_stat
- proc_swaps
- proc_uptime
- shared_pidns
- cpuview_daemon
- loadavg_daemon
- pidfds
再次运行docker容器
docker run -it centos /bin/bash
通过lxcfs运行
docker run -it -m 256m --memory-swap 256m \
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
centos /bin/bash
执行top命令,成功获取到正确的资源限制