1. 内存性能指标

1.1 系统内存使用情况

  • 已用内存:已经使用的内存
  • 剩余内存:还未使用的内存
  • 共享内存:通过tmpfs实现,高效率,df -h命令查看
  • 可用内存:新进程可以使用的最大内存,它包括剩余内存和可回收缓存
  • 缓存:一部分是磁盘读取文件的页缓存,另一部分是 Slab 分配器中的可回收内存
  • 缓存区:对原始磁盘块的临时存储,用来缓存将要写入磁盘的数据。

1.2 进程内存使用情况

  • 虚拟内存(vss):包括了进程代码段、数据段、共享内存、已经申请的堆内存和已经换出的内 存等。
  • 常驻内存(rss):是进程实际使用的物理内存
  • 共享内存(uss):包括与其他进程共同使用的真实共享内存,还包括加载的动态链接库以及程序的代码段
  • Swap内存:通过 Swap 换出到磁盘的内存
  • 内存缺页

1.3 Swap 的使用情况

  • 已用空间
  • 剩余空间
  • 换入速度:每秒内存换入的速度
  • 换出速度:每秒内存换出的速度

2. 性能工具

b751a6f1cb6050b190fedc6e14b8d960.png

3.快速分析内存的性能瓶颈

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

4.优化

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