一、 内存性能指标

为了分析内存的性能瓶颈,首先你要知道,怎样衡量内存的性能,也就是性能指标问题。

1. 系统内存使用情况:比如已用内存、剩余内存、共享内存、可用内存、cache和buffer的用量等。

2. 进程内存使用情况:比如进程的虚拟内存、常驻内存、共享内存以及 Swap 内存等。

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

3. 缺页异常:系统调用内存分配请求后,并不会立刻为其分配物理内存,而是在请求首次访问时,通过缺页异常来分配。缺页异常又分为下面两种场景:

  • 可以直接从物理内存中分配时,被称为次缺页异常。
  • 需要磁盘 I/O 介入(比如 Swap)时,被称为主缺页异常。

显然,主缺页异常升高,就意味着需要磁盘 I/O,那么内存访问也会慢很多,这也就是下一类指标。

4. Swap 的使用情况:比如 Swap 的已用空间、剩余空间、换入速度和换出速度等。

二、 内存性能工具

了解了内存的性能指标,我们还得知道,怎么才能获得这些指标,也就是会用性能工具。

1. 最常用的:free、top、ps,查看整体和进程的内存使用情况。

2. 动态观察内存变化:vmstat,还可以区分缓存和缓冲区、Swap 换入和换出的内存大小

3. 缓存命中情况:cachestat查看整个系统缓存,cachetop针对每个进程缓存

4. 观察内存泄漏:memleak,给出的内存分配栈,找到了内存泄漏的可疑位置。

5. Swap:sar+cachetop+cat /proc/zoneinfo 查看内存阈值+ /proc 文件系统找出 Swap 所影响的进程。

根据内存性能指标和工具的对应关系,我做了两个表格,方便你梳理关系和理解记忆。当然,你也可以当成“指标工具”和“工具指标”指南来用,在需要时直接查找。

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

还是那个关键词,找关联。其实,虽然内存的性能指标很多,但都是为了描述内存的原理,指标间自然不会完全孤立,一般都会有关联。当然,反过来说,这些关联也正是源于系统的内存原理,这也是我总强调基础原理的重要性。

为了迅速定位内存问题,我通常会先运行几个覆盖面比较大的性能工具,比如free、top、vmstat、pidstat 等。
具体的分析思路主要有这几步。

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

图中列出了最常用的几个内存工具,和相关的分析流程。其中,箭头表示分析的方向,举几个例子你可能会更容易理解。

第一个例子,当你通过 free,发现大部分内存都被缓存占用后,可以使用 vmstat 或者 sar观察一下缓存的变化趋势,确认缓存的使用是否还在继续增大。如果继续增大,则说明导致缓存升高的进程还在运行,就能用缓存 / 缓冲区分析工具(比如 cachetop、slabtop 等),分析这些缓存到底被哪里占用。

第二个例子,当你 free 发现系统可用内存不足时,首先要确认内存是否被缓存 / 缓冲区占用。排除缓存 / 缓冲区后,你可以继续用 pidstat 或者 top,定位占用内存最多的进程。找出进程后,再通过进程内存空间工具(比如 pmap),分析进程地址空间中内存的使用情况就可以了。

第三个例子,当你通过 vmstat 或者 sar 发现内存在不断增长后,可以分析中是否存在内存泄漏的问题。比如你可以使用内存分配分析工具 memleak ,检查是否存在内存泄漏。如果存在内存泄漏问题,memleak 会输出内存泄漏的进程以及调用堆栈。

注意,这个图里我没有列出所有性能工具,只给出了最核心的几个。这么做,一方面,确实不想让大量的工具列表吓到你。
另一方面,希望你能把重心先放在核心工具上,通过我提供的案例和真实环境的实践,掌握使用方法和分析思路。 毕竟熟练掌握它们,你就可以解决大多数的内存问题。

四、 内存调优

在我看来,内存调优最重要的就是,保证应用程序的热点数据放到内存中,并尽量减少换页和交换。

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

《Linux性能优化实战》笔记(十三)—— 如何“快准狠”找到系统内存的问题相关推荐

  1. “快准狠”找到系统内存的问题

    "快准狠"找到系统内存的问题 文章目录 "快准狠"找到系统内存的问题 前言 一.内存性能指标 二.内存性能工具 三.性能指标和工具的联系 四.如何迅速分析内存的 ...

  2. Linux性能优化实战:如何“快准狠”找到系统内存的问题?(21)

    一 内存性能指标 1.系统内存使用情况 共享内存:是通过tmpfs实现的,所以它的大小也就是tmpfs使用的大小了tmpfs其实也是一种特殊的缓存 可用内存:是新进程可以使用的最大内存它包括剩余内存和 ...

  3. Linux性能优化实战: 套路篇-优化性能问题的一般方法(56)

    一.上节回顾 上一节,我带你一起梳理了,性能问题分析的一般步骤.先带你简单回顾一下. 我们可以从系统资源瓶颈和应用程序瓶颈,这两个角度来分析性能问题的根源. 从系统资源瓶颈的角度来说,USE 法是最为 ...

  4. Linux性能优化实战: 套路篇-分析性能问题的一般步骤(55)

    一.上节回顾 上一节,我们一起学习了,应用程序监控的基本思路,先简单回顾一下.应用程序的监控,可以分为指标监控和日志监控两大块. 指标监控,主要是对一定时间段内的性能指标进行测量,然后再通过时间序列的 ...

  5. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

  6. Linux性能优化实战学习笔记:第十讲==中断

    Linux性能优化实战学习笔记:第十讲 一.坏境准备 1.拓扑图 2.安装包 在第9节的基础上 在VM2上安装hping3依奈包 ? 1 2 3 4 5 6 7 wget http://www.tcp ...

  7. linux性能优化实战学习笔记-(1)CPU性能分析工具与套路

    版权归Linux性能优化实战 作者倪鹏飞,本文主要是为学习.整理相关知识点,请勿用作商用,侵删. linux性能分析工具 下图来自:Brendan D. Gregg http://www.brenda ...

  8. linux性能优化实战 倪朋飞,Linux性能优化实战:系统的swap变高(09)

    一.实验环境 1.操作系统 root@openstack:~# lsb_release -a No LSB modules are available. Distributor ID:Ubuntu D ...

  9. linux下缓存命中测试,Linux 性能优化实战(倪朋飞)---查看缓存命中情况

    cachestat 提供了整个操作系统缓存的读写命中情况. cachetop 提供了每个进程的缓存命中情况.但是,cachetop 并不把直接 I/O 算进来. 安装 cachestat.cachet ...

最新文章

  1. C++ Primer 学习笔记(第四章:表达式)
  2. Linux内核文件vmlinux 和压缩后的bzImage文件格式分析
  3. paddleocr win10 编译
  4. 从php到python的第一天
  5. 安装mysql-8.0.13-winx64遇到的问题和亲测有效的安装方法
  6. 论文浅尝 | 基于图注意力的常识对话生成
  7. json是什么_如何利用Python处理JSON格式的数据,建议收藏!!!
  8. linux下如何查看某个容器的详细信息?
  9. 自学python能学成吗-没有任何编程基础可以直接学习python语言吗?学会后能够做什么?...
  10. 【maven】maven基础知识总结
  11. tomcat配置项目的接种方式
  12. android aso优化工具,如何使用ASO优化工具优化安卓应用商店
  13. 2020腾讯广告算法大赛——算法小白的复盘
  14. 玩转软件|通过汉化WINRAR,手把手教你如何汉化软件
  15. Java日志框架的使用
  16. sipdroid软件直接使用andriod打网络电话
  17. git 如何回退版本(通俗易懂,简单上手)
  18. Nginx防止大流量攻击,限制流量访问(limit_req_zone模块)以及进行网站压力测试
  19. 解决“C2001:常量中有换行符“编译问题
  20. Android 插件化之—— 加载插件中的资源

热门文章

  1. 库卡(KUKA)机器人入门学习必备知识
  2. 棒棒糖也能画成图—— ggplot2绘制棒棒糖图/哑铃图
  3. 阿里云-个人建网站从0到精通(一)
  4. matlab怎么产生一个随机数,matlab怎么产生随机数
  5. 太可怕,有码变高清!AI 一秒还原马赛克?
  6. GIC/ITS代码分析(0)GIC/ITS框架介绍
  7. MOOC中国接受《环球时报》英文版专访:MOOC证书对求职有用吗?
  8. MPB:青岛大学苏晓泉组分享基于分类学和系统发育的宏基因组比较DMS算法
  9. python实现视频ai换脸_python 实现 AI 换脸
  10. im4java+GraphicsMagick 的问题