Reclaim¶
CXL内存可以间接利用的另一种方式是通过mm/vmscan.c
中的reclaim系统。当系统上的内存容量基于全局和cgroup本地的watermark(水位线)设置变得紧张时,就会启用Reclaim。
在本节中,我们不讨论watermark(水位线)配置,只讨论reclaim系统的各个部分如何消耗CXL内存。
Demotion(降级)¶
默认情况下,reclaim系统在回收内存时会优先选择交换(或zswap)。启用kernel/mm/numa/demotion_enabled
将导致vmscan在容量可用时,机会性地优先选择远端NUMA节点,而不是交换或zswap。
降级会启用mm/memory_tier.c
组件来确定下一个降级节点。下一个降级节点基于HMAT
或CDAT
性能数据。
cpusets.mems_allowed 缺陷¶
在Linux v6.15及更低版本中,降级在迁移页面时不会考虑cpusets.mems_allowed
。因此,如果启用了降级,vmscan无法保证容器的内存与未在mems_allowed中设置的节点隔离。
在Linux v6.XX及更高版本中,降级会尝试考虑cpusets.mems_allowed
;但是,某些由另一个cgroup最初实例化的共享内存类(例如,公共库 - 例如libc)可能仍然会被降级。因此,mems_allowed接口仍然无法提供与远程节点的完美隔离。
ZSwap和节点偏好¶
在Linux v6.15及更低版本中,ZSwap从处理器本地节点分配内存,用于正在压缩的新页面。由于正在压缩的页面通常是冷的,因此结果是冷页面被提升 - 只是在老化脱离LRU后才被降级。
在Linux v6.XX中,ZSwap尝试优先选择正在压缩的页面的节点作为压缩页面的分配目标。这有助于防止抖动。
降级与ZSwap¶
当同时启用降级和ZSwap时,您会创建一个ZSwap默认会优先选择最慢的CXL内存形式,直到该层内存耗尽的情况。