你以为的swap是你以为的swap吗?空间充足依然占swap,如何解决?

什么是swap

swap是交换分区。在操作系统中,swap是硬盘上的一部分空间,当系统内存(RAM)不足时,操作系统会将部分内存中的数据移到swap空间,以释放内存供其他程序使用。虽然swap的速度比RAM慢,但它可以防止系统因内存不足而崩溃。

swap分区的使用原理

当物理内存(RAM)不足时,操作系统会将一些暂时不使用的内存页(page)或进程的内存段(segment)移动到swap分区,从而释放物理内存供其他进程使用。这个过程称为换出(swap out) 。当这些数据再次被访问时,操作系统会将它们从swap分区重新加载到物理内存中,这个过程称为换入(swap in)

  1. 换出(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技术内存模拟swap1.使用内存模拟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

### 创建和配置 Swap 分区 在 Ubuntu 18.04 中,可以通过多种方法创建和配置 swap 分区。以下是详细的说明: #### 方法一:通过修改现有 swap 文件大小 此方法适用于已经存在 swap 文件的情况。 1. **进入系统根目录** 使用 `cd /` 命令切换到系统的根目录[^2]。 2. **调整 swap 文件大小** 执行以下命令以扩展现有的 swap 文件: ```bash sudo dd if=/dev/zero of=/swap bs=1M count=16384 ``` 此处的 `bs=1M` 表示每段数据块为 1MB,而 `count=16384` 则表示总共写入 16GB 的零填充数据。 3. **激活 swap 空间** 配置新创建的文件作为 swap 空间: ```bash sudo mkswap /swap ``` 4. **启用 swap** 启动新的 swap 文件: ```bash sudo swapon /swap ``` 5. **验证 swap 是否生效** 使用以下命令确认 swap 已成功添加: ```bash free -m ``` #### 方法二:创建全新的 swap 文件 如果尚未有 swap 文件,则可以选择创建一个新的 swap 文件。 1. **进入根目录** 输入 `cd /` 跳转至根路径。 2. **新建 swap 文件** 下面是一个例子,用于创建一个 16GB 大小的新 swap 文件: ```bash sudo dd if=/dev/zero of=/new_swap_file bs=1M count=16384 ``` 3. **初始化 swap 文件系统** 对刚建立的文件进行格式化处理以便其能被识别为 swap 类型: ```bash sudo mkswap -f /new_swap_file ``` 4. **挂载 swap 文件** 将该文件加入当前运行环境下的可用资源列表中去: ```bash sudo swapon /new_swap_file ``` 5. **禁用旧版 swap 并移除它(可选操作)** 如果希望替换掉之前的 swap 设置,先停止原 swap 功能再将其彻底清除: ```bash sudo swapoff /old_swap_file && sudo rm /old_swap_file ``` 6. **持久化更改** 编辑 `/etc/fstab` 文件,在其中找到关于原始 swap 条目并将之更新指向新的位置或者名称即可实现重启后依然有效果的目的: 添加如下行至文件末尾: ``` /new_swap_file none swap sw 0 0 ``` 7. **再次检查状态** 终端输入 `free -m` 查看最终效果是否满足预期需求。 #### 参数优化建议 为了更好地控制何时以及如何利用虚拟内存机制,还可以进一步调节 Linux 内核参数——swappiness 值。默认情况下它的数值范围是从 0 至 100,默认值通常设定了较高的倾向度数使得硬盘上的页面缓存更容易被淘汰从而腾出更多物理 RAM 给应用程序使用;然而对于某些特定场景来说降低这个比例可能带来性能提升的效果[^1]。 例如设置较低水平 (比如10),意味着除非绝对必要才会考虑把活动进程的数据转移到磁盘上去存储起来而不是优先保持它们驻留在实际硬件里头运作着。 ```bash echo vm.swappiness=10 | sudo tee -a /etc/sysctl.conf sudo sysctl -p ``` 以上就是完整的流程介绍,按照上述指导完成相应步骤之后应该能够顺利解决因缺乏足够的交换区域而导致的各种问题啦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值