我可以想象实际上有两个位置:
- 在属于正在换入/换出 ram 的进程的内核空间中
- 从
[kswapd0]
但是,深入研究 kswapd 源代码 ( mm/vmscan.c
, init/main.c
),我可以发现:kswapd 是单线程的,并且是在单线程上启动的。(NUMA 系统除外,所有内存区域都有不同的 kswapd。但大多数普通 PC 都不是 NUMA 系统。)
但是,从现在开始,我们有一个问题。我们可以假设,磁盘比内存慢得多,这就是我们不需要多线程 kswapd 来处理磁盘 I/O 的原因。但如果我们还需要使用内部 zswap 层,情况就不是这样了。特别是从更高的压缩率(放气)中,cpu 可以并且很可能会成为瓶颈。
但是kswapd 是单线程的。
这是真的吗?
是否计划进行任何多线程 kswapd?真的需要吗?
Ps 我在 linux 内核邮件列表中找到了这个线程。这是关于一个被拒绝的补丁建议,什么可以在非 NUMA 系统上启用多线程 kswapd。他们在谈论一切,除了这个 zswap 问题。也许是无关的。
PS2。语境:
- 我有一个高度 ram 过度使用的 Linux 系统(进程使用的 ram 比物理上可用的多得多)。
- 同时运行的进程数远低于 CPU 内核数。
- 我正在大量使用 zswap。
- 在这种环境下,将所有可用的 CPU 内核用于压缩/解压缩内存页面将非常有用。我目前最好的估计是页面压缩/解压缩由
[kswapd0]
单个内核线程完成。我正在研究利用所有 CPU 内核进行压缩/解压缩的选项。从本质上讲,这将是一种转换剩余 CPU 容量以弥补物理内存不足的方法。
经过大量调查,我想我找到了答案。
实际的压缩是在
[kswapd]
.引用线程中拒绝邮件的作者表明,负责人至少有一些原因他没有沟通,但更有可能他根本不知道 zswap。
我在我的系统上安装了补丁建议。它使
kswapd
多线程,即它可以压缩所有 CPU 内核上的内存。该补丁的作用就像魅力一样,并显着改善了 zswap-ping 环境。证明:我的系统(内存消耗量大的 qemu + pxz 压缩器)严重超载,包括内存和 CPU。之后,我在
top
:是的,它还意味着以下内容:
我在测试环境中使用的 zswap 参数如下(可以在 中设置
/sys/modules/zswap/parameters
):