我们先来捋一下,常见的内存性能指标,基本如下图所示

图片

系统内存中的已用内存 剩余内存 很容易理解,就是已经使用和未使用的内存

共享内存通过tmpfs实现,一种特殊的缓存

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

缓存则是磁盘的页缓存和Slab分配器中的可回收内存

缓冲区是对原始磁盘块的临时存储,方便读取和写入

然后是进程的内存使用,

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

常驻内层,则是进程实际使用的物理内存

共享内存,则是多个进程间的共享内存,包括,动态链接库和程序的代码段等

Swap内存则是Swap换到磁盘之后扩出来的内存

进程别忘了还有缺页异常这个指标,

关于这个指标,如果可以直接从物理内存中分配,被称为次缺页异常,如果需要磁盘IO的话,则是主缺页异常

最后是Swap的使用,包括了已用空间,剩余空间,即已经使用和没有使用的内存空间

换入和换出速度,每秒钟的换入和换出内存的大小

我们总结一下我们这几次使用的工具

首先是free,老大哥,常用的内存工具,查看系统的整体内存和Swap情况,除此外,还有top和ps,查看进程的使用情况,基本原理还有proc文件系统,这也是万物的源头,还有vmstat,可以动态观察内存变化

对于缓存cachestat,可以查看系统缓存的读写命中情况,利用cachetop观察每一个进程缓存的读写命中情况

关于内存泄露,可以使用memleak,进行观察

在Swap中,可以利用/proc/zoneinfo观察Swap升高的问题

还利用/proc文件,查看到Swap影响到的进程

对于性能指标和工具的联系,我们可以从不同的维度触发

从内存指标的维度出发,可以将工具和内存的工作原理关联起来

图片

从工具的维度触发,可以最大化的利用已有的工具,找到需要的指标

图片

那么如何在实际生产中,快速的利用这些,定位系统问题,优化性能呢?

一般来说,我们可以运行几个覆盖面比较大的性能工具,free top vmstat pidstat等

利用free和top查看系统整体内存使用情况

利用vmstat和pidstat,查看一段时间内的趋势,判断内存问题类型

最后详细分析

图片

首先是free,确定内存已经大量被缓存占用,继续使用vmstat或者sar观察缓存的变化趋势

如果继续增大,说明缓存身高的进程还在继续,使用缓存或者缓冲区分析工具,分析缓存在哪里占用

如果是可用内存不足的话,就需要确认内存是否被缓存或者缓冲区占用,然后利用top或者pidstat定位内存占用最多的进程,找到进程后,利用进程内存空间工具,分析进程地址空间中内存情况就可以了

最后,通过vmstat或者sar发现内存在不断增长之后,分析是否存在内存泄露的问题

可以利用memleak进行查看内存是否存在泄露

最后给出一些常见的优化思路

1.禁止Swap,如果非要开启,就降低swappiness的值,减少使用swap的倾向

2.减少内存的动态分配,使用内存池,大页等

3.使用cgroups等限制进程的内存使用情况

4.通过/proc/pid.oom_adj,调整应用的oom_score,保证不会被OOM杀死

发表评论

邮箱地址不会被公开。 必填项已用*标注