kswapd0 和 kswapd1(可能还有其他 kswapdN)都是 Linux 内核中用于内存回收的核心线程,它们的本质和主要功能是相同的。区别主要在于并行化和NUMA架构的支持。
下面是详细的区别和解释:
核心共同点
它们都是 kswapd 内核线程的实例,负责页面回收。当系统内存不足时(特别是当空闲内存低于“低水位线”时),kswapd 会被唤醒,开始将不常用的内存页面交换到磁盘(swap),或清理缓存,以释放物理内存。
主要区别
1. 单节点 vs 多节点(NUMA)
这是最常见的区别原因。
kswapd0:在非NUMA系统(UMA,即对称多处理)或单内存节点的系统上,通常只有一个 kswapd 线程,就是 kswapd0。它负责全局的内存回收。
kswapd0, kswapd1, ...:在NUMA系统上,每个内存节点(Node)通常会拥有自己专属的 kswapd 线程。这是为了优化性能,让每个节点独立管理自己的内存回收,避免跨节点操作带来的延迟。例如:
kswapd0 负责 NUMA 节点 0 的内存回收。
kswapd1 负责 NUMA 节点 1 的内存回收。
以此类推。
2. 并行回收(较新内核)
即使在单节点系统上,较新版本的 Linux 内核(大约从 4.x 开始)也可能会创建多个 kswapd 线程。这是为了实现并行内存回收,提高回收效率,尤其是在多核CPU系统上,避免单个 kswapd 线程成为瓶颈。
如何验证和查看
你可以通过以下命令来了解你系统上 kswapd 线程的情况:
1. 查看所有 kswapd 线程
bash
ps aux | grep kswap
输出可能类似:
text
root 50 0.0 0.0 0 0 ? S Jan01 0:00 [kswapd0]
root 51 0.0 0.0 0 0 ? S Jan01 0:00 [kswapd1]
2. 查看 NUMA 节点信息(判断是否因NUMA产生)
bash
numactl --hardware
如果输出显示有多个 available 节点,例如 node 0 和 node 1,那么多个 kswapd 线程很可能是为NUMA服务的。
3. 查看线程与CPU/节点的绑定关系
bash
ps -eLo pid,tid,psr,comm | grep kswap
psr 列显示该线程最后一次在哪个CPU核心上运行。
结合 numactl 信息,可以推断线程与节点的关系。
4. 查看内核启动参数(判断是否因并行产生)
bash
cat /proc/cmdline | grep -o kswapd
或者检查内核文档,但更直接的方法是看系统是否有 vm.kswapd_threads 这样的参数(注意:此参数名可能随内核版本变化,并行化更多是内核内部行为)。
总结对比表

2. 并行回收(较新内核)
主要目的回收内存页,维持内存水位线与kswapd0相同,但作用域可能限定在特定NUMA节点或用于并行任务
注意事项
这些线程是内核的一部分,通常不应该被用户空间干预。它们出现在进程列表(如 top 或 htop)中,但优先级为内核级。
如果某个 kswapd 线程持续占用很高的CPU(例如长时间超过20%),这通常是系统内存压力过大、频繁进行交换的症状,而不是问题本身。你需要排查的是为什么内存不足(应用泄漏、配置不当等),而不是去杀死 kswapd 线程(这也不可能做到)。
简单来说,你可以将 kswapd1 等视为 kswapd0 的克隆体或兄弟,它们为了更高效地管理多节点或多核系统的内存而存在,功能上没有任何差异。