设为首页 加入收藏

TOP

100 行 shell 写个 Docker(五)
2023-07-23 13:41:32 】 浏览:135
Tags:100 shell 写个 Docker
miting): Cgroups可以对进程组使用的资源总额进行限制。如对特定的进程进行内存使用上限限制,当超出上限时,会触发OOM。

  • 优先级分配(Prioritization): 通过分配的CPU时间片数量及硬盘IO带宽大小,实际上就相当于控制了进程运行的优先级。

  • 资源统计(Accounting): Cgroups可以统计系统的资源使用量,如CPU使用时长、内存用量等等,这个功能非常适用于计费。

  • 进程控制(Control):Cgroups可以对进程组执行挂起、恢复等操作。

  • Cgroups的组成:

    1. task: 在Cgroups中,task就是系统的一个进程。

    2. cgroup: Cgroups中的资源控制都以cgroup为单位实现的。cgroup表示按照某种资源控制标准划分而成的任务组,包含一个或多个子系统。一个任务可以加入某个cgroup,也可以从某个cgroup迁移到另外一个cgroup。

    3. subsystem: 一个subsystem就是一个内核模块,被关联到一颗cgroup树之后,就会在树的每个节点(进程组)上做具体的操作。subsystem经常被称作"resource controller",因为它主要被用来调度或者限制每个进程组的资源,但是这个说法不完全准确,因为有时我们将进程分组只是为了做一些监控,观察一下他们的状态,比如perf_event subsystem。到目前为止,Linux支持13种subsystem(Cgroup v1),比如限制CPU的使用时间,限制使用的内存,统计CPU的使用情况,冻结和恢复一组进程等。

    4. hierarchy: 一个hierarchy可以理解为一棵cgroup树,树的每个节点就是一个进程组,每棵树都会与零到多个subsystem关联。在一颗树里面,会包含Linux系统中的所有进程,但每个进程只能属于一个节点(进程组)。系统中可以有很多颗cgroup树,每棵树都和不同的subsystem关联,一个进程可以属于多颗树,即一个进程可以属于多个进程组,只是这些进程组和不同的subsystem关联。如果不考虑不与任何subsystem关联的情况(systemd就属于这种情况),Linux里面最多可以建13颗cgroup树,每棵树关联一个subsystem,当然也可以只建一棵树,然后让这棵树关联所有的subsystem。当一颗cgroup树不和任何subsystem关联的时候,意味着这棵树只是将进程进行分组,至于要在分组的基础上做些什么,将由应用程序自己决定,systemd就是一个这样的例子。

    2.2.2 查看Cgroup信息

    查看当前系统支持的subsystem

    #通过/proc/cgroups查看当前系统支持哪些subsystem
    # cat /proc/cgroups
    #subsys_name    hierarchy       num_cgroups     enabled
    cpuset              11              1           1
    cpu                 4               67          1
    cpuacct             4               67          1
    memory              5               69          1
    devices             7               62          1
    freezer             8               1           1
    net_cls             6               1           1
    blkio               9               62          1
    perf_event          3               1           1
    hugetlb             2               1           1
    pids                10              62          1
    net_prio            6               1           1
     
    #字段含义
    #subsys_name: subsystem的名称
    #hierarchy:subsystem所关联到的cgroup树的ID,如果多个subsystem关联到同一颗cgroup树,那么他们的这个字段将一样,比如这里的cpu和cpuacct就一样,表示他们绑定到了同一颗树。如果出现下面的情况,这个字段将为0:
            当前subsystem没有和任何cgroup树绑定
            当前subsystem已经和cgroup v2的树绑定
            当前subsystem没有被内核开启
    #num_cgroups: subsystem所关联的cgroup树中进程组的个数,也即树上节点的个数
    #enabled: 1表示开启,0表示没有被开启(可以通过设置内核的启动参数“cgroup_disable”来控制subsystem的开启).

    查看进程所属cgroup

    #查看当前shell进程所属的cgroup
    # cat /proc/$$/cgroup
    11:cpuset:/
    10:pids:/system.slice/sshd.service
    9:blkio:/system.slice/sshd.service
    8:freezer:/
    7:devices:/system.slice/sshd.service
    6:net_prio,net_cls:/
    5:memory:/system.slice/sshd.service
    4:cpuacct,cpu:/system.slice/sshd.service
    3:perf_event:/
    2:hugetlb:/
    1:name=systemd:/system.slice/sshd.service
     
    #字段含义(以冒号分为3列):
    # 1. cgroup树ID,对应/proc/cgroups中的hierachy
    # 2. cgroup所绑定的subsystem,多个subsystem使用逗号分隔。name=systemd表示没有和任何subsystem绑定,只是给他起了个名字叫systemd。
    # 3. 进程在cgroup树中的路径,即进程所属的cgroup,这个路径是相对于挂载点的相对路径。

    2.2.3 相关命令

    使用cgroup

    cgroup相关的所有操作都是基于内核中的cgroup virtual filesystem,使用cgroup很简单,挂载这个文件系统就可以了。一般情况下都是挂载到/sys/fs/cgroup目录下,当然挂载到其它任何目录都没关系。

    查看下当前系统cgroup挂载情况。

    #过滤系统挂载可以查看cgroup
    # mount |grep cgroup
    tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
    cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
    cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
    cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
    cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
    cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
    cgroup
    首页 上一页 2 3 4 5 6 7 8 下一页 尾页 5/9/9
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇 常用的文件查看命令 下一篇Linux基础命令和项目部署

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目