• Linux 内存回收机制


    内存回收

    内存资源紧张会导致内存回收和 OOM 杀死进程。

    内存回收,也就是系统释放掉可以回收的内存,比如缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File-backed Page)。

    大部分文件页,都可以直接回收,以后有需要时,再从磁盘重新读取就可以了。而那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页),就得先写入磁盘,然后才能进行内存释放。

    除了文件页,应用程序动态分配的堆内存,也就是我们在内存管理中说到的匿名页(Anonymous Page)也可以被回收。(使用 Swap 回收)

    Swap 机制

    Swap 把这些不常访问的内存先写到磁盘中,然后释放这些内存,给其他更需要的进程使用。再次访问这些内存时,重新从磁盘读入内存就可以了。

    Swap 说白了就是把一块磁盘空间或者一个本地文件(以下讲解以磁盘为例),当成内存来使用。它包括换出和换入两个过程。

    • 所谓换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。
    • 而换入,则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来。

    我们常见的笔记本电脑的休眠和快速开机的功能,也基于 Swap 。休眠时,把系统的内存存入磁盘,这样等到再次开机时,只要从磁盘中加载内存就可以。这样就省去了很多应用程序的初始化过程,加快了开机速度。

    kswapd0

    一个专门的内核线程用来定期回收内存,也就是 kswapd0。为了衡量内存的使用情况,kswapd0 定义了三个内存阈值(watermark,也称为水位),分别是:

    页最小阈值(pages_min)、页低阈值(pages_low)和页高阈值(pages_high)。剩余内存,则使用 pages_free 表示。

    • 剩余内存小于页最小阈值,说明进程可用内存都耗尽了,只有内核才可以分配内存。
    • 剩余内存落在页最小阈值和页低阈值中间,说明内存压力比较大,剩余内存不多了。这时 kswapd0 会执行内存回收,直到剩余内存大于高阈值为止。
    • 剩余内存落在页低阈值和页高阈值中间,说明内存有一定压力,但还可以满足新内存请求。
    • 剩余内存大于页高阈值,说明剩余内存比较多,没有内存压力。

    swappiness

    回收的内存既包括了文件页,又包括了匿名页。

    • 对文件页的回收,当然就是直接回收缓存,或者把脏页写回磁盘后再回收。
    • 而对匿名页的回收,其实就是通过 Swap 机制,把它们写入磁盘后再释放内存。

    Linux 提供了一个 /proc/sys/vm/swappiness 选项,用来调整使用 Swap 的积极程度。

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

    总结

    在内存资源紧张时,Linux 通过直接内存回收和定期扫描的方式,来释放文件页和匿名页,以便把内存分配给更需要的进程使用。

    • 文件页的回收比较容易理解,直接清空,或者把脏数据写回磁盘后再释放。
    • 而对匿名页的回收,需要通过 Swap 换出到磁盘中,下次访问时,再从磁盘换入到内存中。

    你可以设置 /proc/sys/vm/min_free_kbytes,来调整系统定期回收内存的阈值(也就是页低阈值),还可以设置 /proc/sys/vm/swappiness,来调整文件页和匿名页的回收倾向。

    在 NUMA 架构下,每个 Node 都有自己的本地内存空间,而当本地内存不足时,默认既可以从其他 Node 寻找空闲内存,也可以从本地内存回收。

    你可以设置 /proc/sys/vm/zone_reclaim_mode ,来调整 NUMA 本地内存的回收策略。

    why Kubernetes 关闭 swap ?

    • 一个是性能问题,开启swap会严重影响性能(包括内存和I/O);
    • 另一个是管理问题,开启swap后通过cgroups设置的内存上限就会失效。

    学习笔记
    整理自极客时间:《Linux性能优化实战》

  • 相关阅读:
    Principle of Computing (Python)学习笔记(5) BFS Searching + Zombie Apocalypse
    《Java从入门到精通》src9-25
    《Java从入门到精通》src0-8
    windows查看某个端口被谁占用
    css selector: xpath:
    awk 正则表达式
    Centos系统各种日志存详解
    mysql日志文件
    mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY'
    递归函数时间复杂度分析
  • 原文地址:https://www.cnblogs.com/galvin007/p/12694717.html
Copyright © 2020-2023  润新知