用Linux resctrl玩x86 CPU上的L3 CAT
最近基于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.00s
和411.19s
。而通过查看mon_data
的数据,运行全程基本L3 Cache使用量也不超过4MB(一开始还以为我输错了数位)。因此可能对于我的使用场景后续换5800X 3D提升不大。当然这与RTL大小和特点、Verilator的优化、CC的优化均有关。