用Linux resctrl玩x86 CPU上的L3 CAT

Table of Contents

最近基于Verilator框架写了一个SoC仿真器,用C++实现了AXI接口以便软件定义MMIO。然而写完后运行发现,它的速度确实比FPGA要慢上非常多,FPGA上几秒钟完成的事情用Verilator仿真可能要跑几分钟才能跑出来。而RTL仿真是对于CPU的Cache压力很大的应用场景,因此就玩了下Linux的resctrl进行测试。方便后续选购CPU。

Linux resctrl已经支持Intel和AMD处理器中的许多技术。包括常见到的用来共享隔离Cache缓解侧信道的Intel CAT技术。然而我手里的Intel 12900K通过查看/proc/cpuinfo发现它只支持L2 CAT。而自己的AMD 5800X却可以支持L3 CAT,因此就用它进行了测试。而resctrl的配置主要参考了User Interface for Resource Control feature

首先,对于Kernel v5.0以上,需要在config中打开CONFIG_X86_CPU_RESCTRL。Debian已经默认打开。

然后,挂载resctrl文件系统:

sudo mount -t resctrl resctrl /sys/fs/resctrl

接着,进入/sys/fs/resctrl,结构如下所示:

➜  resctrl tree                   
.
├── cpus
├── cpus_list
├── info
│   ├── L3
│   │   ├── bit_usage
│   │   ├── cbm_mask
│   │   ├── min_cbm_bits
│   │   ├── num_closids
│   │   └── shareable_bits
│   ├── L3_MON
│   │   ├── max_threshold_occupancy
│   │   ├── mon_features
│   │   └── num_rmids
│   ├── last_cmd_status
│   └── MB
│       ├── bandwidth_gran
│       ├── delay_linear
│       ├── min_bandwidth
│       └── num_closids
├── mode
├── mon_data
│   └── mon_L3_00
│       ├── llc_occupancy
│       ├── mbm_local_bytes
│       └── mbm_total_bytes
├── mon_groups
├── schemata
├── size
└── tasks

7 directories, 22 files

之后,可以通过在/sys/fs/resctrl下创建文件夹,来创建一个control group。

➜  mkdir group0
➜  cd group0
➜  ls
cpus  cpus_list  mode  mon_data  mon_groups  schemata  size  tasks

这里比较需要用到的是schemeta和mon_data文件夹。mon_data用于查看正在运行的程序的统计信息。由于AMD Zen 3能够支持L3 Monitor,因此我们也可以在运行时观测这个程序用掉了多少L3 Cache。而schemeta则是我们可以设置的参数,用来对这个control group进行资源限制。

可以先查看一下可供设置的参数。

➜  cat schemata
    MB:0=2048
    L3:0=ffff

这里需要注意的是,针对多CCX的处理器以及NUMA上,可能L3会有多个,且可能并不共享,这时候需要通过访问/sys/devices/system/cpu/cpu*/cache/index*/id来查看Cache和CPU之间的拓扑关系。此外,不同的CPU核心访问不同的L3 Cache Slice延迟可能也不一样。

在此,我们如果要把一个应用能访问的L3 Cache限制到2M,只需要执行以下代码:

➜  echo "L3:0=0001" > /sys/fs/resctrl/group0/schemata
➜  cat /sys/fs/resctrl/group0/schemata
    MB:0=2048
    L3:0=0001

然后运行应用,查看pid,将pid加入control group文件夹下的tasks即可。

➜  echo 2333 > /sys/fs/resctrl/group0/tasks

在程序运行时可以通过查阅mon_data各项参数来看程序的运行情况。

最后我测试了基于SmallBoomConfig在我的仿真SoC上运行u-boot到dram init的速度,5800X上不限制L3以及限制L3到2M的情况,时间分别为376.00s411.19s。而通过查看mon_data的数据,运行全程基本L3 Cache使用量也不超过4MB(一开始还以为我输错了数位)。因此可能对于我的使用场景后续换5800X 3D提升不大。当然这与RTL大小和特点、Verilator的优化、CC的优化均有关。

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to Top