一、怎么样衡量系统内存
1、查看系统内存的使用情况,比如已用内存,剩余内存,共享内存,可用内存,缓存和缓冲区的用量。

  • 已用内存和剩余内存,就是已经使用和还未使用的内存。
  • 共享内存,是通过tmpfs来实现的,它的大小就是tmpfs使用的内存大小,tmpfs其实也是一种特殊的缓存。
  • 可用内存,就是新进程可以使用的最大内存,包括剩余内存和可回收内存
  • 缓存,缓存包括磁盘读取文件的页缓存和Slab分配器中的可回收内存。页缓存用来缓存从磁盘读取的数据。
  • 缓冲区,是对原始磁盘块的l临时存储,用来缓存将要写入磁盘的数据,这样内核就可以把分散的写集中起来,统一优化磁盘写入。

2、查看进程内存的使用情况,比如进程的虚拟内存,常驻内存,共享内存已经swap内存。

  • 虚拟内存,包括进程的代码段,数据段,共享内存,已经申请的堆内存和已经换出的内存等。注意:已经申请的内存,即使还没有分配物理内存,也算作是虚拟内存。
  • 常驻内存,进程实际使用的物理内存,不包括swap和共享内存。
  • 共享内存,它既包括与其他进程共同使用的真实的共享内存,还包括加载的动态链接库和程序的代码段。
  • swap内存,指通过swap换出到磁盘的内存。
  • 缺页异常,系统在调用内存分配请求后,并不会立刻为其分配物理内存,而是在请求首次访问时,通过缺页异常来分配。缺页异常分为下面两种场景:

    1. 通过直接从物理内存分配,称为次缺页异常。
    2. 需要磁盘IO接入时,称为主缺页异常。

二、内存的性能分析工具
1、更具内存指标找对应的工具

快速定位系统内存问题的思路_第1张图片
2、根据性能工具看内存指标

快速定位系统内存问题的思路_第2张图片
三、定位内存问题为了快速定位内存问题,通常我会先运行几个覆盖率比较大的性能工具,比如free,top,vmstat,pidstat具体的思路如下:

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

四、常用优化思路

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