首页 > 其他分享 >Resctrl内核实现(四)schemata和cpus

Resctrl内核实现(四)schemata和cpus

时间:2023-10-07 10:37:27浏览次数:33  
标签:group -- mask cpus closid schemata MON Resctrl cpu

前言

在Resctrl中可编程的文件主要有两个,schemata指定资源分配策略,cpus则为cpu绑定default_closiddefault_rmid

修改cpus文件

cpus文件按照所处目录的类型不同有两种操作,当所处目录类型为CTRL-MON group时会调用cpus_ctrl_write,目录类型为MON group时会调用cpus_mon_write。通过对源码的分析,处理的过程包括:

  1. 进行权限检查
  2. 重设cpu的默认closid和rmid的

修改cpus会产生两种变化,一种是被drop掉的cpu,一种是新增的cpu。所谓drop就是相比于原cpus释放的cpu,新增则是相比于原cpus迁移来的cpu。

对于CTRL-MON group来说:

  1. drop掉的cpu需要还给默认CTRL-MON group(因此默认CTRL-MON group无法进行drop cpu);
  2. 对于新增的cpu需要更新这些cpu的默认closid和rmid;对于这些新增cpu的原本所属的CTRL-MON group需要移除这些cpu;
  3. 对于CTRL-MON group下的MON group需要清空cpu_mask,MON group清空掉的cpu需要更新对应默认closid和rmid为parent CTRL-MON group。

对于MON group来说:

  1. 首先会检查新增的cpu是否属于parent CTRL-MON group,MON group不允许添加parent CTRL-MON group中不存在的cpu;
  2. 检查是否有drop cpu,这些cpu需要放入到parent CTRL-MON group中,并且更新这些cpu的closid和rmid为parent CTRL-MON group;
  3. 对于新增的cpu,如果是从其他MON group移入的需要在其他MON group中移除这些cpu,并且更新新增的cpu的默认closid和rmid为当前MON group。
rdtgroup_cpus_write
    -->cpus_ctrl_write // ctrl group write cpus
        -->cpumask_andnot(tmpmask, &rdtgrp->cpu_mask, newmask)
            -->cpumask_or(&rdtgroup_default.cpu_mask, &rdtgroup_default.cpu_mask, tmpmask);
            -->update_closid_rmid // 检查是否有从控制组中释放的cpu,需要归还给默认控制组,将这些cpu的默认closid和rmid改为默认控制组
           -->cpumask_andnot(tmpmask, newmask, &rdtgrp->cpu_mask)
            -->list_for_each_entry(r, &rdt_all_groups, rdtgroup_list) // 遍历所有的rdtgroup,将新增的cpu从原本的group中移除
                -->cpumask_and(tmpmask1, &r->cpu_mask, tmpmask)
                -->cpumask_rdtgrp_clear(r, tmpmask1);
            -->update_closid_rmid(tmpmask, rdtgrp) // 更新这些cpu的closid和rmid
        -->cpumask_copy(&rdtgrp->cpu_mask, newmask); // 更新group的cpu_mask
        -->list_for_each_entry(crgrp, head, mon.crdtgrp_list)
            -->cpumask_and(tmpmask, &rdtgrp->cpu_mask, &crgrp->cpu_mask); // 对于mon group,对于child group丢失的cpu更新rmid和closid,清空child group的cpu_mask
            -->update_closid_rmid(tmpmask, rdtgrp);
            -->cpumask_clear(&crgrp->cpu_mask);

    -->cpus_mon_write(rdtgrp, newmask, tmpmask) // mon group write cpus
        -->cpumask_andnot(tmpmask, newmask, &prgrp->cpu_mask) // 检查cpus是否属于parent ctrl group,不允许添加一个parent group不存在的cpu
        -->cpumask_andnot(tmpmask, &rdtgrp->cpu_mask, newmask) // 检查是否有减少的cpu,将drop的cpu添加到父cpus中,更新这些cpu的closid和rmid
        -->cpumask_andnot(tmpmask, newmask, &rdtgrp->cpu_mask) // 对新增的cpu 如果属于其他的mon group,将这些cpu进行移除,并更新这些cpu的默认closid和rmid
        -->cpumask_copy(&rdtgrp->cpu_mask, newmask) // 更新cpu mask

修改schedmata

rdtgroup_schemata_write会对输入进行解析,按照不同的资源分别通过IPI的方式通知cpu调用rdt_ctrl_update进行更新,修改closid对应的cbm(cache bit mask)以及delay。

rdtgroup_schemata_write
    -->rdtgroup_parse_resource
    -->for_each_alloc_enabled_rdt_resource(r)
        -->update_domains(r, rdtgrp->closid)
            -->smp_call_function_many(cpu_mask, rdt_ctrl_update, &msr_param, 1) // 通过IPI的方式通知closid涉及到的cpu更新资源控制
                
rdt_ctrl_update
    -->get_domain_from_cpu(cpu, r)
    -->msr_update(d, m, r); //msr_update 是一个函数指针 不同的资源有不同的更新函数
    -->mba_wrmsr or cat_wrmsr

static void
mba_wrmsr(struct rdt_domain *d, struct msr_param *m, struct rdt_resource *r)
{
    unsigned int i;

    /*  Write the delay values for mba. */
    for (i = m->low; i < m->high; i++)
        wrmsrl(r->msr_base + i, delay_bw_map(d->ctrl_val[i], r));
}

static void
cat_wrmsr(struct rdt_domain *d, struct msr_param *m, struct rdt_resource *r)
{
    unsigned int i;

    for (i = m->low; i < m->high; i++)
        wrmsrl(r->msr_base + cbm_idx(r, i), d->ctrl_val[i]);
}

在此场景下,m->low=closid,m->high=m->low+1,因此只会更新closid对应的资源分配机制。更新资源会按照closid,将控制的值(对于cache是cache bit mask,对于mb是延迟)写入资源控制的msr寄存器。

标签:group,--,mask,cpus,closid,schemata,MON,Resctrl,cpu
From: https://www.cnblogs.com/wodemia/p/17745682.html

相关文章

  • Resctrl内核实现(一)CPU状态
    Resctrl内核实现(一)CPU状态resctrl是rdt机制的一个用户态接口,通过对rdt技术进行封装,提供了一套资源分配和监控机制的接口,方便用户进行使用。本文从resctrl的资源分配和监控的角度对内核源码实现进行了分析,参考的kernel版本为4.19.287。Resctrl下的CPU状态变化resctrl中有两种gro......
  • Resctrl内核实现(二)CLOSID和RMID管理
    前言RDT的监控数据累计和资源分配策略的关键就是CLOSID和RMID的分配策略。CLOSID和RMID管理CLOSID管理RDT中的资源通过控制组进行分配,控制组对于各类资源进行划分或者限制。每一个控制组用一个CLOSID进行标识,由于CLOSID的数量有限所以在内核中通过一个位图进行表示和管理。st......
  • AMD cpus在VM虚拟机安装macOS10.15和12教程一
    本教程采用软件为vmwareworkstation17pro,操作系统win10,CPU为5600G,macOS10.15或者macOS12VM虚拟机的下载和安装这里不阐述,大家可以百度一下macos13在上述环境下安装后会提示错误,macOS14beta暂时不支持安装,所以13-14可以暂时放弃macOS的下载请百度一下就有了~记得下载带引导......
  • 10分钟学习cpustat命令
    cpustat是 Linux 下一个强大的系统性能测量程序,它用Go编程语言编写。它通过使用“用于分析任意系统的性能的方法(USE)”,以有效的方式显示CPU利用率和饱和度。cpustat能用两种方式输出数据:定时汇总的纯文本列表和每个取样的彩色滚动面板。它高频率对系统中运行的每......
  • cpuset.cpus.effective: no such file or directory (修改 docker cgroup 版本的方法)
    要切换使用v1版cgroup,需要做如下配置: vim/etc/default/grub   GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0" update-grubreboot  完美解决 ......
  • k8s 能做到限制pod在节点的指定cpu核心上运行吗?用--cpuset 方式实现,请给出一个具体案
    在Kubernetes中,可以使用--cpuset方式来限制Pod在节点的指定CPU核心上运行。这可以通过在Pod的yaml文件中设置容器启动命令来实现。具体地,我们可以在容器的启动命令中使用--cpuset选项来指定需要运行的CPU核心。下面是一个典型的使用--cpuset选项的Pod的yaml文件示例:apiVersion:......
  • Reason=Low socket*core*thread count, Low CPUs [slurm@2021-09-15T15:18:53]
    提交作业:#srunhostnamesrun:Requirednodenotavailable(down,drainedorreserved)srun:job58queuedandwaitingforresources查看作业状态:squeue58compute......
  • 遭遇流氓软件 CPUSH
    遭遇流氓软件CPUSHendurer原创2007-08-01第1版刚才一位网友说他的电脑中了病毒,瑞星清除后重启电脑又出现了,让偶通过QQ远程协助。检查瑞星的杀毒记录,原来是CPUSH这个流......