什么是swap
swap是交换分区。在操作系统中,swap是硬盘上的一部分空间,当系统内存(RAM)不足时,操作系统会将部分内存中的数据移到swap空间,以释放内存供其他程序使用。虽然swap的速度比RAM慢,但它可以防止系统因内存不足而崩溃。
swap分区的使用原理
当物理内存(RAM)不足时,操作系统会将一些暂时不使用的内存页(page)或进程的内存段(segment)移动到swap分区,从而释放物理内存供其他进程使用。这个过程称为换出(swap out) 。当这些数据再次被访问时,操作系统会将它们从swap分区重新加载到物理内存中,这个过程称为换入(swap in) 。
- 换出(Swap Out)原理
当系统检测到物理内存不足时,会触发换出操作。以下是换出过程的关键步骤:
(1)选择换出的对象
- 页面置换算法(Page Replacement Algorithm) :操作系统会根据某种算法选择哪些内存页应该被换出。常见的算法包括:
- 最近最少使用(LRU,Least Recently Used) :选择最近最久未被访问的页面换出。
- 先进先出(FIFO,First-In-First-Out) :选择最早进入内存的页面换出。
- 最佳适应(Optimal) :基于未来访问情况选择最优的页面换出(实际中难以实现,主要用于理论分析)。
- 选择进程的内存段:对于进程的内存段,操作系统会选择那些当前不活跃的进程或进程的非关键部分进行换出。
(2)将数据写入swap分区
- 操作系统将选定的内存页或内存段从物理内存中读取出来,并将其写入swap分区的指定位置。
- 每个换出的页面或段都会在swap分区中分配一个空间,并记录其位置信息,以便后续能够快速找到并换入。
(3)更新内存管理数据结构
- 操作系统会更新内存管理单元(MMU)中的数据结构,如页表(Page Table)或段表(Segment Table),将换出的页面或段标记为“不在内存”状态。
- 同时,记录这些页面或段在swap分区中的位置,以便后续换入时能够快速定位。
2.换入(Swap In)原理
当进程尝试访问已经被换出到swap分区的数据时,会触发换入操作。以下是换入过程的关键步骤:
(1)触发页面错误(Page Fault)
- 当进程访问一个不在物理内存中的页面时,会产生一个页面错误(Page Fault)。
- 操作系统会捕获这个错误,并检查该页面是否在swap分区中。
(2)从swap分区读取数据
- 如果页面在swap分区中,操作系统会找到该页面在swap分区中的位置,并将其读取到物理内存中。
- 如果物理内存中没有足够的空间,操作系统可能会再次触发换出操作,以腾出空间。
(3)更新内存管理数据结构
- 操作系统将换入的页面或段标记为“在内存”状态,并更新页表或段表中的相关信息。
- 进程恢复执行,继续访问该页面或段。
swap分区的优缺点
优点:
- 扩展内存容量:通过swap分区,系统可以将硬盘空间作为虚拟内存使用,从而扩展可用内存容量。
- 避免内存不足导致的崩溃:当物理内存不足时,swap分区可以提供缓冲,避免系统因内存耗尽而崩溃。
缺点:
- 性能下降:由于硬盘的读写速度远低于物理内存,频繁的swap操作会导致系统性能显著下降,尤其是在高负载情况下。
- 增加系统复杂性:swap分区的管理需要额外的机制和开销,增加了系统的复杂性。
空间充足依然占用swap现象
由于 swap 存在的缺陷在于性能的降低,故而在大多数的商用系统之中,都会竭力避免使用 swap ,甚至某些极端的举措是直接将 swap 关闭。不过大多数的选择,都是通过系统的配置,来是操作系统尽量不分配swap,优先使用内存。
我们的系统也采取系统配置的方式尽量不分配swap,设置两条配置,如下:
(1) vm.swappiness = 0 //表示最大限度使用物理内存,然后才是 swap空间
(2) memory policy设置默认 // 系统启动过程中,采用interleave策略分配内存,即在所有可满足需求的节点上交叉分配,防止启动时在某个节点上负载过重
以上述配置后,我们预期是物理内存快用完了时,才会占用swap。但从实际效果来看,内存空间很充足(buffer/cache占用很高)时,就开始占用swap。
问题产生原因
1.回收内存流程:
(1)内存可用量小于low水位,kswapd开始介入进行异步内存回收(非阻塞式)
(2)内存可用量小于min水位,进入直接同步内存回收(阻塞式)
(3)内存可用量高于high水位,kswapd不再工作
2.buffer/cache中的缓存文件页对应磁盘,当回收文件页内存时,会将缓存页下刷至磁盘
3.buffer/cache中的缓存匿名页无磁盘可对应,但开启swap后,匿名页对应到swap,
内存空闲多也占用swap原因:
1.每个numa自身有local cpu、local 内存
2.每个numa只看自身local内存是否需要内存回收
3.numa需要内存回收时,若开启swap,则buffer/cache中的文件页和匿名页都可对应到磁盘,所以会优先下刷磁盘以获取更多内存。如果还不足,才会去其他numa查询内存
当回收匿名页内存时,会将匿名页下刷至swap。
解决思路
zram简介:
1.zram是linux的驱动,用于使用内存模拟block设备,通常用来创建内存swap
2.zram是使用了内存压缩技术,所以是一种通过时间换空间的技术,即访问zram时,其可以模拟更大的空间,但会消耗一定的cpu资源
3.假设压缩比2:1,则64G虚拟swap,只需要消耗32G实际内存量
方案 | 优点 | 缺点 |
---|---|---|
关闭swap | 彻底消除访问swap慢导致的运行效率问题 | 当物理内存确实因不可控因素被占满,会直接触发系统oom杀进程 |
ZRAM技术内存模拟swap | 1.使用内存模拟swap,可使访问的io速率接近访问内存的速率内存访问:100ns 1zram访问:3000ns 30ssd访问 :50us 500**hdd访问 :1~1000ms 100002.机制成熟,在Android上已大量使用3.不是替代磁盘swap,而是共存,优先使用内存swap,扩充带来性能的提升 | 1.使用一部分内存做swap,可用内存会随着占用增高而减小2.访问swap时会额外占用一部分CPU资源,用以压缩 |
作者:ukulele烨
链接:https://juejin.cn/post/7475226147212951552