Docker-- cgroups资源控制实战
什么是cgroups?
cgroups是Linux内核中的一项功能,最初由Google的工程师提出,后来被整合进Linux内核;
它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。
基本功能
资源限制:cgroups可以对进程组使用的资源进行限制,如CPU时间、内存使用量、I/O带宽等。一旦进程组使用的资源达到限额,再申请资源时可能会受到限制或触发相应的错误处理机制(如OOM,Out of Memory)。
优先级控制:通过cgroups,用户可以为进程组分配特定的CPU份额,从而控制其运行的优先级。
资源记录:cgoups还可以记录进程组使用的资源数量,如CPU时间、内存使用量等,便于用户进行监控和分析。
进程组隔离:使用cgroups,用户可以使不同的进程组使用不同的命名空间(namespace),以达到隔离的目的。不同的进程组将有各自的进程、网络、文件系统挂载空间等。
进程组控制:cgroups提供了对进程组的控制功能,如挂起、恢复等。
组成结构
任务(Task):在cgroups中,任务就是系统的一个进程。一个进程可以加入到某个cgroup中,也可以从一个cgroup迁移到另一个cgroup。
控制族群(Control Group):cgroup表示按某种资源控制标准划分而成的任务组,包含一个或多个子系统。cgroups中的资源控制都是以控制族群为单位实现的。
层级(Hierarchy):cgroups具有层次结构,类似于文件系统的层次树。每个cgroup可以包含多个子CGroup,资源控制是自上而下继承的。层级中的cgroup节点可以包含零个或多个子节点,子节点继承父节点挂载的子系统。
子系统(Subsystem):一个子系统就是一个资源调度控制器(又称controllers),如CPU子系统可以控制CPU的时间分配,内存子系统可以限制内存的使用量。子系统必须附加到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有cgroup都受到这个子系统的控制。
为什么使用cgroups?
它能够对cpu、内存等资源做到精细的控制,目前的轻量级容器Docker和k8s就是使用了cgroup提供的资源限制能力对cpu、内存等资源进行资源控制。
比如要使用内存的时候,假如全部有2G内存,我们能够根据我们的需求具体分配出400m内存出来供资源使用,达到上限时就会触发OOM;
cgroups控制子系统
命令:pidstat
pidstat [options] [interval] [count]
关键参数
-u:默认参数,显示每个进程的CPU利用率(用户空间、内核空间)。
-r:显示每个进程的内存使用情况,包括页面错误(minflt/majflt)和虚拟内存大小(VSZ)及实际使用的物理内存(RSS)。
-d:显示每个进程的磁盘I/O统计,如读写操作的数量和带宽。
-w:显示每个进程的上下文切换次数(自愿和非自愿)。
-p PID:监视指定PID的进程。
-t:包含线程级别的统计信息。
如:
每2秒输出一次所有进程的CPU和内存使用情况:
pidstat -ru 2
监视PID为1234的进程的CPU、内存和磁盘I/O,并每隔5秒输出一次:
pidstat -urd 5 -p 1234
显示特定进程及其线程的CPU使用率:
pidstat -ut 1 -p <process_id>
命令:stress
stress [OPTION [ARG]]
-c ,–cpu N:模拟N个CPU核心的负载。
-m --vm N:模拟N个虚拟内存设备的负载。
–vm-bytes B:指定每个虚拟内存设备的大小为B(单位可以是K、M、G)。
-i, --io N:模拟N个磁盘I/O操作的负载(注意:在某些版本中,这个选项可能被–hdd替代)。
-t, --timeout T:指定压力测试运行T秒后自动停止。
pidstat-C stress-p ALL-u2 10000
stress-c 1
stress-i 1
stress-m --vm-bytes 50m
版本查看
cat /proc/filesystems | grep cg
子系统查看
cat /proc/cgroups
cgroup 挂载信息查看
mount | grep cgroup
显示当前挂载的文件系统,这些行显示了不同的cgroup子系统是如何挂载到文件系统中的
tmpfs是一种基于内存的文件系统,这里它被用来挂载cgroup的根目录。
cgroup类型表示这是一个cgroup挂载点,后面的参数(如name=systemd)指定了cgroup子系统的名称。
显示当前shell进程所属的cgroup(控制组)信息
ll /sys/fs/cgroup/memory/user.slice
当使用了systemd作为初始化系统(init system)时,/sys/fs/cgroup/目录下会包含各种cgroup(控制组)子系统的挂载点。
user.slice是systemd用来管理用户会话的一个cgroup层级,它包含了所有用户级别的进程和服务。
查看该目录下的文件:
使用cgroups对内存的控制
cd/sys/fs/cgroup/memory
创建一个测试目录,并进入;
mkdir test_memlimit cd test_memlimit
echo "20971520" > memory.limit_in_bytes
pidstat -C stress -p ALL -r 2 10000 stress -m 1 --vm-bytes 50m
echo "3605712" > tasks
使用cgroups对cpu进行控制
mount | grep cg
mkdir test_cpu cd test_cpu
stress -c 1 pidstat -C stress -p ALL-u 2 10000
echo "20000"> cpu.cfs_quota_us
echo "3615387" > tasks
本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!
云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:
《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq
想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ