- kswapd进程
- 主要机制:
- kswapd是Linux内核中的一个守护进程,它主要负责回收内存。当系统的空闲内存低于某个阈值(称为“水印”)时,kswapd被唤醒。它使用一种基于LRU(最近最少使用)算法的页面回收机制。
- 例如,在一个运行多个应用程序的Linux服务器上,如果数据库应用占用了大量内存,使得空闲内存减少,kswapd就会开始工作。它会遍历内存中的页面,将那些最近最少使用的页面标记为可回收。这些页面可能包括缓存的文件数据(页缓存)或者进程的匿名内存(如堆和栈)。
- 对于页缓存,kswapd可以直接释放这些页面,因为文件数据可以从磁盘重新读取。对于匿名内存,kswapd可能会将页面内容交换到磁盘上的交换空间(swap space),以便为其他进程腾出物理内存。
- 配置参数影响回收行为:
- 可以通过调整一些内核参数来影响kswapd的行为。例如,
vm.swappiness
参数用于控制系统将内存数据交换到磁盘交换空间的倾向程度。取值范围是0 - 100,数值越高,表示系统越倾向于使用交换空间来释放内存。
可以使用命名vmstat -a
查看活跃和非活跃的内存有多少,
- OOM Killer(内存不足杀手)机制
- 触发条件和工作方式:
- 当系统内存极度紧张,kswapd无法及时回收足够的内存来满足新的内存请求时,就可能触发OOM Killer机制。它会根据每个进程的内存使用情况、优先级等因素,选择一个或多个进程“杀死”,以释放内存。
- 例如,在一个内存资源有限的嵌入式Linux设备上,如果同时运行了多个内存密集型应用,并且内存已经耗尽,OOM Killer会评估各个进程。通常,它会优先选择占用内存较多且优先级较低的进程,如一些后台的非关键任务进程,将其终止,从而回收内存来保障系统的基本功能和更重要的进程能够继续运行。
- 配置进程的OOM分数来控制优先级:
- 可以通过调整进程的OOM分数(
oom_score
)来控制进程被OOM Killer选中的概率。OOM分数越高,进程在内存紧张时被选中终止的可能性越大。一些关键的系统进程通常具有较低的OOM分数,以避免被意外终止。
- 内存压缩机制(如zRAM)
- 工作原理:
- 内存压缩是一种相对较新的内存回收辅助机制。以zRAM为例,它是一种基于内存的块设备,通过将内存中的数据进行压缩,从而在不使用交换空间的情况下腾出更多的可用内存。
- 当系统需要回收内存时,zRAM会尝试压缩内存中的页面。如果页面能够成功压缩到一定程度,就可以在内存中腾出空间,而不需要将页面交换到磁盘。例如,对于一些频繁访问但暂时不使用的数据,zRAM可以将其压缩存储在内存中,当需要再次访问时,再进行解压。这种方式比将数据交换到磁盘速度更快,因为磁盘I/O速度通常比内存读写速度慢很多。
- 配置和性能影响:
- 可以通过内核参数来配置zRAM的大小和压缩算法等参数。不过,内存压缩也会消耗一定的CPU资源,因为压缩和解压操作需要CPU进行计算。所以在配置zRAM时,需要根据系统的实际情况(如CPU性能、内存大小等)来平衡内存回收效果和CPU消耗之间的关系。
- **内核函数try_to_free_page()