在容器里執行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命令,成功獲取到正確的資源限制
