lichengguo




内存性能指标

  1. 系统内存指标,比如已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量等

    1. 已用内存和剩余内存很容易理解,就是已经使用和还未使用的内存

    2. 共享内存是通过tmpfs实现的,所以它的大小也就是tmpfs使用的内存大小
      tmpfs其实也是一种特殊的缓存

    3. 可用内存是新进程可以使用的最大内存,它包括剩余内存和可回收缓存

    4. 缓存包括两部分,一部分是磁盘读取文件的页缓存,用来缓存从磁盘读取的数据,可以加快以后再次访问的速度
      另一部分,则是Slab分配器中的可回收内存

    5. 缓冲区是对原始磁盘块的临时存储,用来缓存将要写入磁盘的数据
      内核就可以把分散的写集中起来,统一优化磁盘写入


  2. 进程内存指标,比如进程的虚拟内存、常驻内存、共享内存以及Swap内存等
    常驻内存一般会换算成占系统总内存的百分比,也就是进程的内存使用率

    1. 虚拟内存,包括了进程代码段、数据段、共享内存、已经申请的堆内存和已经换出的内存等
      已经申请的内存,即使还没有分配物理内存,也算作虚拟内存

    2. 常驻内存是进程实际使用的物理内存,它不包括Swap和共享内存

    3. 共享内存,既包括与其他进程共同使用的真实的共享内存,还包括了加载的动态链接库以及程序的代码段等

    4. Swap内存,是指通过Swap换出到磁盘的内存

    5. 缺页异常,系统调用内存分配请求后,并不会立刻为其分配物理内存,而是在请求首次访问时,通过缺页异常来分配
      缺页异常又分为下面两种场景(主缺页异常升高,就意味着需要磁盘I/O,那么内存访问也会慢很多)

      1. 可以直接从物理内存中分配时,被称为次缺页异常
      2. 需要磁盘 I/O 介入(比如Swap)时,被称为主缺页异常

  3. Swap的使用情况,比如Swap的已用空间、剩余空间、换入速度和换出速度等

    1. 已用空间和剩余空间就是已经使用和没有使用的内存空间

    2. 换入和换出速度,则表示每秒钟换入和换出内存的大小



image-20211214152204200




内存性能工具

从内存指标出发

image-20211214152459845



从性能工具出发

image-20211214153854340




如何迅速分析内存的性能瓶颈

为了迅速定位内存问题,通常会先运行几个覆盖面比较大的性能工具,比如free、top、vmstat、pidstat等

  1. 先用free和top,查看系统整体的内存使用情况
  2. 再用vmstat和pidstat,查看一段时间的趋势,从而判断出内存问题的类型
  3. 最后进行详细分析,比如内存分配分析、缓存/缓冲区分析、具体进程的内存使用分析等

image-20211214154233020

例子1

当通过free发现大部分内存都被缓存占用后
可以使用vmstat或者sar观察一下缓存的变化趋势
确认缓存的使用是否还在继续增大
如果继续增大,则说明导致缓存升高的进程还在运行,
那就能用缓存/缓冲区分析工具(cachetop、slabtop等),分析这些缓存到底被哪里占用


例子2

当free一下,发现系统可用内存不足时,首先要确认内存是否被缓存/缓冲区占用
排除缓存/缓冲区后,可以继续用pidstat或者top,定位占用内存最多的进程
找出进程后,再通过进程内存空间工具(比如pmap),分析进程地址空间中内存的使用情况就可以了


例子3

当通过vmstat或者sar发现内存在不断增长后,可以分析中是否存在内存泄漏的问题
可以使用内存分配分析工具memleak ,检查是否存在内存泄漏。如果存在内存泄漏问题
memleak会输出内存泄漏的进程以及调用堆栈




小结

内存调优最重要的就是,保证应用程序的热点数据放到内存中,并尽量减少换页和交换

常见的优化思路有这么几种

  1. 最好禁止Swap。如果必须开启Swap,降低swappiness的值,减少内存回收时Swap的使用倾向
  2. 减少内存的动态分配。比如可以使用内存池、大页(HugePage)等
  3. 尽量使用缓存和缓冲区来访问数据
    比如,可以使用堆栈明确声明内存空间,来存储需要缓存的数据
    或者用Redis这类的外部缓存组件,优化数据的访问
  4. 使用cgroups等方式限制进程的内存使用情况
    这样,可以确保系统内存不会被异常进程耗尽
  5. 通过/proc/pid/oom_adj ,调整核心应用的oom_score
    这样,可以保证即使内存紧张,核心应用也不会被OOM杀死

分类:

技术点:

相关文章:

  • 2021-11-13
  • 2021-06-09
  • 2022-01-08
  • 2021-06-05
  • 2021-12-09
  • 2021-11-21
  • 2021-08-08
猜你喜欢
  • 2021-11-22
  • 2021-08-10
  • 2021-07-10
  • 2021-05-01
  • 2021-08-19
相关资源
相似解决方案