Linux 内存 swap 相关知识学习笔记

1. Linux 中 swap 的作用

1.1 Linux 使用虚拟内存定义来简化应用使用内存的逻辑

在 Linux 中,内核使用虚拟内存技术,使每个应用程序均认为自己拥有独立且连续的可用的内存空间(一段连续完整的地址空间)。但是在实际上,实际内存空间通常使被映射到多个不同的物理内存段中,甚至还可能有部分内容暂时存储在外部磁盘存储器上,在需要时再加载到内存中来。

那么,实际的内存段存在多种类型,和swap相关的就有以下两种:

  • file backed:存储磁盘文件等形式的外部资源。第一次访问时由于找不到对应的物理内存,CPU会报 page fault 中断,然后操作系统就会处理这个中断并将文件的内容加载到物理内存中。一般程序的可执行文件,动态库用这种方式实现。
  • anonymous:存储程序自己用到的数据段和堆栈空间,逻辑上和 file backed 类似,只是当内存吃紧时,系统会直接删除掉file backed对应的物理内存,因为下次需要的时候还能从磁盘加载到内存,但anonymous page不能被删除,只能被swap out

1.2 交换空间(swap 空间)对Linux的意义

当 Linux 中的内存需要申请更多的内存时,但此时实际物理内存已经不足,那么,内核将会回收部分物理内存满足当前进程的需要,这样的回收主要依靠以下两种策略进行:

  • 对于 file backed 类型的资源,如果磁盘中有其完整备份(也就是没被修改过),所以内核可以直接释放掉对应的物理内存,当下次有进程需要访问这部分数据时,再由内核将它加载到内存中。
  • 对于 anonymous 类型的资源,这部分数据不能直接被删除,则由内核转移到提前在磁盘中申请的交换空间(swap 空间)中去,当下次有进程需要访问这部分数据时,再由内核将它加载到内存中。

因此,我们可以确定:

  1. 交换空间就是磁盘上预留的一块特殊空间,被系统用来临时存放内存中不常被访问的数据,可以降低内核对内存资源的依赖。
  2. 由于交换空间在磁盘上,所以访问速度要比内存慢很多,频繁的读写交换空间会带来性能问题

2. Linux 中使用 swap 的大致原理

2.1 水位线

内核中由三个watermark参数(WMARK_MIN、WMARK_LOW、WMARK_HIGH)来表示当前系统剩余内存的大致水平:

  • MEM>WMARK_HIGH:目前内存使用压力不大
  • WMARK_HIGH>MEM>WMARK_LOW:剩余内存存在一定压力
  • WMARK_LOW>MEM>WMARK_MIN:内存开始有较大压力,剩余内存不多了;
  • WMARK_MIN>MEM:内存面临很大压力,不过小于min这部分内存,内核是保留给特定情况下使用的,一般不会分配。

2.2 kswapd

kswapd 是系统的虚拟内存管理程序,内核会定期唤醒 kswapd:

  1. 如果此时 MEM>WMARK_HIGH ,kswapd则无需运行
  2. 如果此时 WMARK_HIGH>MEM,kswapd 进行内存回收
  3. 如果此时 WMARK_MIN>MEM,会触发内核直接回收操作(direct reclaim)

2.3 内存回收时,swap所占的比重

内存回收时,可以选择将 file backed 类型的资源直接释放掉,也可以选择将 anonymous 类型的资源进行 swap,这里就存在一个回收策略的问题,在 Linux 中可以通过 swappiness 参数进行策略调整:

  • swappiness=60(系统默认):对file backed的文件的释放比例会更大
  • swappiness=100:file backed 与 anonymous 将以同样的优先级进行回收
  • swappiness=0:尽量避免 swap, 但内存真的不够用时,还是会进行swap,比如 global_reclaim 的时候

2.4 Linux对 swap 的使用策略

  1. Linux 会倾向保持尽可能多的空闲物理内存,即使在内存压力不大的情况下,Linux 也会提前 swap 出暂时不用的内存,以应对的大内存压力做好准备
  2. 只有当被重新需要时,交换区的内容才会转移回物理内存

3 性能测试如何关注内存 swap 相关指标信息

3.1 整体策略

  1. 内存使用 swap 空间,是 Linux 正常的策略
  2. swap 空间用光时,系统就会发生错误
  3. 磁盘的读写速度很慢,因此频繁的 swap in / swap out(此时 kswapd CPU 使用率占比很高),说明内存已到瓶颈

3.2 指标及工具

工具:vmstat

[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 29607556 175112 2104620    0    0     0     0    7    3  0  0 100  0  0

内存饱和的现象:

  1. so 数值大
  2. swapd CPU使用率高

工具:free

[root@localhost ~]# free
              total        used        free      shared  buff/cache   available
Mem:       32739788      853792    29606080       19284     2279916    31418912
Swap:       6213628           0     6213628

内存饱和的现象:

  1. swap-used 占比大
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值