• 内存中的swap机制


    目录

    一、swap原理

    二、swap内存回收的情况

    三、NUMA架构下的Swap说明

    四、回收策略

    五、实验

    六、总结


    一、swap原理

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

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

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

    二、swap内存回收的情况

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

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

    • 剩余内存<页最小阈值,说明进程可用内存都耗尽了,只有内核才可以分配内存。
    • 页最小值 <剩余内存<页低阈值,内存压力大。kswapd0会执行内存回收,指导剩余的内存大于高阈值为止。
    • 页低阈值<剩余内存<页高阈值,说明内存有一定压力,但可以满足内存的使用请求。
    • 剩余内存>页高阈值, 说明内存非常充足。
    1. #cat /proc/zoneinfo
    2. Node 0, zone Normal
    3. pages free 459160
    4. min 10552
    5. low 13190
    6. high 15828
    7. ...
    8. nr_free_pages 459160
    9. nr_zone_inactive_anon 176665
    10. nr_zone_active_anon 261
    11. nr_zone_inactive_file 255910
    12. nr_zone_active_file 195346
    13. nr_zone_unevictable 0
    14. 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则代表已经开启

    1. # 创建Swap文件
    2. # fallocate -l 2G /mnt/swapfile
    3. # chmod 600 /mnt/swapfile
    4. # mkswap /mnt/swapfile
    5. # 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的值

    1. #cat /proc/sys/vm/swappiness
    2. 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


  • 相关阅读:
    离线电商数仓(一)
    HTML+CSS+JS——动漫风二次元论坛(2页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作
    9篇分布式机器学习系统经典论文;深度学习硬件的黄金十年|AI系统前沿动态...
    Qt 中捕获三方库&自身标准打印方法
    ubuntu在线直接升级
    std::shared_ptr(基础、仿写、安全性)
    内核中的信号量
    ​软考-高级-信息系统项目管理师教程 第四版【第15章-项目风险管理-思维导图】​
    js 同步、异步的概念,async 和 await 的说明
    Ceph入门到精通-sysctl参数优化
  • 原文地址:https://blog.csdn.net/WANGYONGZIXUE/article/details/126217266