「Linux Performance」- 内存

内存性能指标

内存性能工具

free => 整体内存 / Swap

top / ps => 进程的内存使用情况

/proc => 内存使用指标的来源;找到使用 Swap 分区的进程

vmstat => 动态观察内存的变化情况,区分 cache 和 buffer、Swap In 和 Swap Out 的内存大小

sar => 动态观察 buffer 和 Swap 变化

/proc/zoneinfo => 观察内存变化,内存回收情况

cachestat => 查看整个系统缓存的读写命中情况

cachetop => 每个进程缓存的读写命中情况

memleak => 内存泄漏检查

性能指标和性能工具的联系

从内存指标出发

系统已用、可用、剩余内存:free vmstat sar /proc/meminfo
进程虚拟内存、常驻内存、共享内存:ps top
进程内存分布:pmap
进程Swap换出内存:top /proc/pid/status
进程缺页异常:ps top
系统换页情况:sar
缓存/缓冲区用量:free vmstat sar cachestat
缓存/缓冲区命中率:cachetop
SWAP已用空间和剩余空间:free sar
Swap换入换出:vmstat
内存泄漏检测:memleak valgrind
指定文件的缓存大小:pcstat

从性能工具出发

free /proc/meminfo
系统已用、可用、剩余内存以及缓存和缓冲区的使用量

top ps
进程虚拟、常驻、共享内存以及缺页异常

vmstat
系统剩余内存、缓存、缓冲区、换入、换出

sar
系统内存换页情况、内存使用率、缓存和缓冲区用量以及Swap使用情况

cachestat
系统缓存和缓冲区的命中率

cachetop
进程缓存和缓冲区的命中率

slabtop
系统Slab缓存使用情况

/proc/pid/status
进程Swap内存等

pmap /proc/pid/smaps
进程地址空间和内存状态

valgrind
进程内存错误检查器,用来检测内存初始化、泄漏、越界访问等各种内存错误

memleak
内存泄漏检测

pcstat
查看指定文件的缓存情况

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

虽然内存的性能指标很多,描述内存的原理,指标间自然不会完全孤立,一般都会有关联。反过来说,这些关联也正是源于系统的内存原理,所以基础原理的非常重要。

为了迅速定位内存问题,通常可以先运行几个覆盖面比较大的性能工具,比如 free、top、vmstat、pidstat 等
1)整体内存使用情况:先用 free 和 top,查看系统整体的内存使用情况,检查 cache / buffer 占用情况。
2)内存使用变化趋势:再用 vmstat 和 pidstat,查看一段时间的趋势,从而判断出内存问题的类型。
3)最后进行详细分析,cachetop / slabtop,比如内存分配分析、cache / buffer 分析、具体进程的内存使用分析等。通过进程内存空间工具(比如 pmap),分析进程地址空间中内存的使用情况。

常见的优化思路

1)对于服务器,最好禁止 Swap 分区,降低 swappiness 的值,将少 SWAP 分区的使用,避免 I/O 带来的性能问题。
2)减少内存的动态分配。比如,可以使用内存池、大页(HugePage)等
3)尽量使用缓存和缓冲区来访问数据。比如可以使用堆栈明确声明内存空间,来存储需要缓存的数据;或者用外部缓存组件,优化数据的访问
4)使用 cgroups 等方式限制进程的内存使用情况,以保护系统
5)通过 /proc/pid/oom_adj ,调整核心应用的 oom_score 参数,以保护应用程序不被 OOM 结束

参考文献

21 | 套路篇:如何“快准狠”找到系统内存的问题?