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 空间)中去,当下次有进程需要访问这部分数据时,再由内核将它加载到内存中。
因此,我们可以确定:
- 交换空间就是磁盘上预留的一块特殊空间,被系统用来临时存放内存中不常被访问的数据,可以降低内核对内存资源的依赖。
- 由于交换空间在磁盘上,所以访问速度要比内存慢很多,频繁的读写交换空间会带来性能问题
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:
- 如果此时 MEM>WMARK_HIGH ,kswapd则无需运行
- 如果此时 WMARK_HIGH>MEM,kswapd 进行内存回收
- 如果此时 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 的使用策略
- Linux 会倾向保持尽可能多的空闲物理内存,即使在内存压力不大的情况下,Linux 也会提前 swap 出暂时不用的内存,以应对的大内存压力做好准备
- 只有当被重新需要时,交换区的内容才会转移回物理内存
3 性能测试如何关注内存 swap 相关指标信息
3.1 整体策略
- 内存使用 swap 空间,是 Linux 正常的策略
- swap 空间用光时,系统就会发生错误
- 磁盘的读写速度很慢,因此频繁的 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
内存饱和的现象:
- so 数值大
- swapd CPU使用率高
工具:free
[root@localhost ~]# free
total used free shared buff/cache available
Mem: 32739788 853792 29606080 19284 2279916 31418912
Swap: 6213628 0 6213628
内存饱和的现象:
- swap-used 占比大