系统优化-内存-阶段性总结

本文主要是针对之前的内存方面的学习进行阶段性的总结,重点在于我们去看内存的哪些重要指标,常用工具是哪些,排查内存问题的思路。

重要指标

如下的脑图:

avator

系统内存:

  • 已用内存和剩余内存很容易理解,就是已经使用和还未使用的内存。
  • 剩余内存:只进程可以分配的内存。
  • 缺页异常:系统在分配内存,会产生缺页异常,当访问到该内存地址发现异常会切换到内存完成真正的物理内存分配
    • 主缺页异常(majflt):从磁盘中加载分配(Swap)
    • 次缺页异常(minflt):直接从内存中分配
  • 共享内存:通过 tmpfs 实现的,所以它的大小也就是 tmpfs 使用的内存大小。tmpfs 其实也是一种特殊的缓存。
  • 缓存包括两部分,一部分是磁盘读取文件的页缓存,用来缓存从磁盘读取的数据,可以加快以后再次访问的速度。另一部分,则是 Slab 分配器中的可回收内存。

    程序的内存:

  • VIRT:包括了进程代码段、数据段、共享内存、已经申请的堆内存和已经换出的内存等。这里要注意,已经申请的内存,即使还没有分配物理内存,也算作虚拟内存。

  • RSS:进程实际使用的物理内存,不过它不包括Swap和共享内存。
  • PSS:进程自己独自占有的+共享的/共享的数目。
  • USS:进程独自占用的物理内存(不包含共享库占用的内存)。

    Swap

  • 用量

  • 换入/换出

常用工具

性能指标和工具的联系,如图1

avator

从性能工具出发,整理了这些常见工具能提供的内存指标。,如图2

avator

排查思路

常见的如:

  • 内存泄露:内存持续增长直至进程被Kill,可以用memleak排查,然后修改代码
  • Swap过高:查看用vmstat、sar、top先看换入换出的情况,然后调整swapiness或者关闭swap大内存场景建议关闭swap
  • buffer/cache的优化:可以用cachestat和cachetop看缓存的命中率,如果过低,去相关代码排查
  • 内存占用过高:可以用pmap或者smap找到内存分配的地方。