内存中的swap机制

Posted 为了维护世界和平_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存中的swap机制相关的知识,希望对你有一定的参考价值。

目录

一、swap原理

二、swap内存回收的情况

三、NUMA架构下的Swap说明

四、回收策略

五、实验

六、总结


一、swap原理

把一块磁盘空间或者一个本地文件当成内存来使用。有换入和换出两个动作

换出:把进程暂时不用的额内存存到磁盘中,并释放这些数据占用的内存

换入:进程再次访问这些内存的时候,从磁盘读取数据到内存。

二、swap内存回收的情况

1)请求大块内存时,剩余内存不足,系统会回收一部分内存,swap内存会被回收

2)内核线程kswapd0,会定期回收内存。什么情况下回收有三个内存阈值,pages_min,pages_low,pages_high。页低阈值通过内核选项/proc/sys/vm/min_free_kbytes来配置页最小阈值,其他两个参数通过最小阈值计算生成。

  • 剩余内存<页最小阈值,说明进程可用内存都耗尽了,只有内核才可以分配内存。
  • 页最小值 <剩余内存<页低阈值,内存压力大。kswapd0会执行内存回收,指导剩余的内存大于高阈值为止。
  • 页低阈值<剩余内存<页高阈值,说明内存有一定压力,但可以满足内存的使用请求。
  • 剩余内存>页高阈值, 说明内存非常充足。
#cat  /proc/zoneinfo

Node 0, zone   Normal
  pages free     459160
        min      10552
        low      13190
        high     15828
...
      nr_free_pages 459160
      nr_zone_inactive_anon 176665
      nr_zone_active_anon 261
      nr_zone_inactive_file 255910
      nr_zone_active_file 195346
      nr_zone_unevictable 0
      nr_zone_write_pending 10

min,low,high是最小,低,高内存的阈值。

nr_zone_inactive_anon,nr_zone_active_anon 分别是活跃和非活跃的匿名页数
nr_zone_inactive_file,nr_zone_active_file 分别是活跃和非活跃的文件页数

三、NUMA架构下的Swap说明

swap内存升高,说明没有内存可用,有时会发现系统剩余内存还有很多,为什么还会发生Swap? NUMA下会发生,多处理器被划分为不同Node上。

当某个Node内不足时,系统可用从其他Node寻址内存空间,也可以从本地中回收内存。内存参数/proc/sys/vm/zone_reclaim_mode可以调整。

默认0,可以从其他Node寻找内存,也可以从本地回收内存

1,2,4 三个值都表示只回收本地内存,2,可以回写脏数据回收内存,4,可以用Swap方式回收内存。

四、回收策略

对文件页回收,直接回收内存,或者把脏页写会磁盘后再回收

对匿名页回收,Swap机制,把数据写入磁盘后再释放内存。

Swap内存回收的积极性调整  /proc/sys/vm/swappiness

swappiness的范围0-100,值越大越积极使用Swap,也就是回收匿名页,反之倾向于回收页文件。

当值为0时,当剩余内存+文件页小于页高阈值时,还是会发生Swap

五、实验

当Swap使用升高时,如何定位分析呢?

总体监控图如下,三个终端

 

 使用的命令与参数

5.1、系统启用swap机制,如果free有swap则代表已经开启

# 创建Swap文件
# fallocate -l 2G /mnt/swapfile
# chmod 600 /mnt/swapfile
# mkswap /mnt/swapfile
# swapon /mnt/swapfile

5.2、模拟数据读取

dd if=/dev/sda1 of=/dev/null bs=1G count=2048

5.3、使用sar -r -S 1 查看内存使用情况

kbmemfree不断减少,kbbuffer不断增大,并逐渐趋于稳定,说明剩余内存空间分配给了缓冲区。

剩余内存很小后,Swap使用逐渐增大

5.4、使用watch -d grep -A 15 'Normal' /proc/zoneinfo 观察内存三值的波动

pages free在不断变化,。当值小于pages_low时,又突然增大到高于pages_high的值

5.5,查看swappiness的值

#cat /proc/sys/vm/swappiness
60

监控输出解析 

  1. 剩余内存和缓冲区的波动,由于内存回收和缓存再分配的循环操作;
  2. 当剩余内存小于页低阈值时,系统会回收一些缓存和匿名内存;
  3. 匿名缓冲区的回收导致Swap 的使用增大;
  4. 剩余内存又重新分配给缓存,导致剩余内存减少,缓冲区增大;
  5. swappiness值60,系统会根据实际情况,选择回收类型(不活跃的匿名页或不活跃的文件页);

六、总结

  • 内存资源紧张时,linux会通过Swap,把不常用的匿名页换出到磁盘,访问时再从磁盘换入到内存;
  • 系统定期回收的阈值通过/proc/sys/vm/min_free_kbytes 调整;
  • 页回收的倾向通过 /proc/sys/vm/wappiness 调整;
  • 监控策略sar,/proc/zoneinfo查看。

参考链接

https://course.0voice.com/v1/course/intro?courseId=2&agentId=0


以上是关于内存中的swap机制的主要内容,如果未能解决你的问题,请参考以下文章

内存还剩余很多,却使用 swap 分区

如何限制Linux内存的使用

Linux内存机制(swap)

Linux内存机制以及手动释放swap和buffer和cache

Linux内存机制以及手动释放swap和buffer和cache

[转]找到MySQL发生swap的原因