迪克猪的博客
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

第三周15-22阶段小结

内存性能

linux内存工作原理

  • 内存映射
    • 内核空间
    • 用户空间
    • 虚拟内存地址
    • 物理内存地址
    • 内存映射
    • 缺页异常
  • 虚拟内存空间分布
    • 内核空间
    • 文件映射
    • 数据段
    • 只读段
  • 内存分配与回收
  • 内存查看工具free

内存buffer与cache

  • Buffers 是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值。
  • Cache 是内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached 与 SReclaimable 之和。
  • proc文件系统

内存泄露

  • 只读段,包括程序的代码和常量,由于是只读的,不会再去分配新的内存,所以也不会产生内存泄漏。
  • 数据段,包括全局变量和静态变量,这些变量在定义时就已经确定了大小,所以也不会产生内存泄漏。
  • 最后一个内存映射段,包括动态链接库和共享内存,其中共享内存由程序动态分配和管理。所以,如果程序在分配后忘了回收,就会导致跟堆内存类似的泄漏问题。

内存泄漏的危害非常大,这些忘记释放的内存,不仅应用程序自己不能访问,系统也不能把它们再次分配给其他应用。内存泄漏不断累积,甚至会耗尽系统内存。

Swap

  • 原理
    • 所谓换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。
    • 而换入,则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来。
  • 页最小阈值(pages_min)、页低阈值(pages_low)和页高阈值(pages_high)。剩余内存,则使用 pages_free 表示。
    • 剩余内存小于页最小阈值,说明进程可用内存都耗尽了,只有内核才可以分配内存。
    • 剩余内存落在页最小阈值和页低阈值中间,说明内存压力比较大,剩余内存不多了。这时 kswapd0 会执行内存回收,直到剩余内存大于高阈值为止。
    • 剩余内存落在页低阈值和页高阈值中间,说明内存有一定压力,但还可以满足新内存请求。
    • 剩余内存大于页高阈值,说明剩余内存比较多,没有内存压力。
  • swappiness
    • 对文件页的回收,当然就是直接回收缓存,或者把脏页写回磁盘后再回收。
    • 而对匿名页的回收,其实就是通过 Swap 机制,把它们写入磁盘后再释放内存。
    • Linux 提供了一个 /proc/sys/vm/swappiness 选项,用来调整使用 Swap 的积极程度。
    • swappiness 的范围是 0-100,数值越大,越积极使用 Swap,也就是更倾向于回收匿名页;数值越小,越消极使用 Swap,也就是更倾向于回收文件页。

系统内存问题

  • 内存性能指标
  • 内存性能工具
  • 性能指标和工具的联系
  • 如何迅速分析内存的性能瓶颈
    • 为了迅速定位内存问题,我通常会先运行几个覆盖面比较大的性能工具,比如 free、top、vmstat、pidstat 等。
  • 内存问题分析步骤
    • 先用 free 和 top,查看系统整体的内存使用情况。
    • 再用 vmstat 和 pidstat,查看一段时间的趋势,从而判断出内存问题的类型。
    • 最后进行详细分析,比如内存分配分析、缓存 / 缓冲区分析、具体进程的内存使用分析等。