前言

我们继续看Linux的性能指标,内存也是重要的组成部分之一。本文从常用命令top、free出发,分析内存有哪些性能指标。

本文基于Ubuntu 16.04。

Linux内存性能指标有哪些

使用top,按下E切换到MB单位,可以看到内存相关的指标如下:

top - 05:09:25 up 7 days, 14:45,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  95 total,   1 running,  55 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem : 3913.410 total, 3090.164 free,  150.316 used,  703.430 buff/cache
MiB Swap:    0.000 total,    0.000 free,    0.000 used. 3497.512 avail Mem PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
28517 user      20   0   40496   3612   3036 R   0.3  0.1   0:00.06 top
  • MiB Mem:系统物理内存相关指标

    • total:总内存
    • free:可用内存
    • used:已使用内存
    • buff/cache:缓存区/缓存占用内存
  • MiB Swap:系统交换空间相关指标
    • total:总内存
    • free:可用内存
    • used:已使用内存
    • avail Mem:交换空间有效内存,包含可回收的页缓存和slabs缓存(下文会提到)
  • 进程的指标:
    • VIRT:虚拟内存大小,只要是进程申请过的内存,即使还没真正分配物理内存,也会计算在内
    • RES:常驻内存大小,也就是进程实际使用的物理内存大小,但不包括swap和共享内存
    • SHR:共享内存大小,比如与其它进程共同使用的共享内存、加载的动态链接库以及程序的代码段等
    • %MEM:进程使用物理内存占系统总内存的百分比

通过free -h,可以看到系统内存相关的指标如下:

# free -htotal        used        free      shared  buff/cache   available
Mem:           3.9G        152M        3.0G         15M        703M        3.4G
Swap:            0B          0B          0B
  • Mem

    • total:总内存
    • used:已使用内存的大小,包含了共享内存
    • free:未使用内存的大小
    • shared:共享内存的大小
    • buff/cache:缓冲区和缓存的大小
    • available:新进程可用内存的大小,不仅包括未使用内存,还包括可回收的缓存,但不包括swap空间大小

总的来说,内存性能指标包括

  • 系统内存性能指标
  • 进程内存性能指标
  • Swap(交换空间)性能指标

在讲这些指标之前,我们先来看Linux内存的工作原理,可以帮助我们更好理解这些性能指标

Linux内存是怎么工作的

计算机中运行着进程,进程的运行需要依赖内存去记录运行时所需的数据。我们平时接触到的内存概念一般是机器的配置,比如8G内存,对于这8G内存是属于物理内存。而对于进程来说,并不是直接访问物理内存,而是通过虚拟内存,两者之间通过页表做映射。如图

那么为什么不直接访问物理内存呢?使用虚拟内存有以下的好处

  • 虚拟内存可以为进程提供独立的内存空间,简化内存分配过程
  • 不限于物理内存的空间限制,可以利用磁盘加物理内存,为进程提供看起来访问速度快,并且容量足够大的存储
  • 虚拟内存可以控制进程对物理内存的访问,隔离不同进程的访问权限,提高系统的安全性

虚拟地址与物理地址映射用的页面存储在MMU中。当进程访问的虚拟地址在页表中找不到时,会产生一个缺页异常,进入内核空间分配物理内存,更新进程页表,最后再返回用户空间,恢复进程的运行。

在MMU中,还通过TLB做页表的高速缓存,提升查询物理地址的性能。TLB空间有限,通过减少进程上下文切换,来减少TLB的刷新次数,就可以提高TLB缓存的使用率,进而提高CPU的内存访问性能。

对于每个进程,都有独自的虚拟内存空间,虚拟内存空间分布如图(32位系统为例)

最上方是内核空间,下方是用户空间。用户空间内存,从低到高分别是五种不同的内存段。

  1. 只读段:包括代码和常量等
  2. 数据段:包括全局变量等
  3. 堆:包括动态分配的内存,从低地址开始向上增长
  4. 文件映射:包括动态库、共享内存等,从高地址开始向下增长
  5. 栈:包括局部变量和函数调用的上下文等

Linux通过伙伴(Buddy)系统管理内存分配,伙伴系统使用页为单位(4KB)来管理内存。

关于分配内存,malloc是C标准库内存分配函数

  • 对于小块内存(小于128KB),malloc通过brk()分配,通过移动堆顶的位置来分配内存。这些内存释放后不会立刻归还系统,而是被缓存起来,这样就可以重复使用。这种方式可以减少缺页异常的发生,但频繁的内存分配和释放会造成内存碎片。
  • 对于大块内存(大于128KB),malloc通过内存映射mmap()分配,也就是在文件映射段找一块空闲内存分配出去,在释放时会直接归还系统,所以每次mmap都会发生缺页异常。这种方式可以保证分配连续大内存段时,减少由于内存碎片导致的分配失败的情况出现。但频繁的内存分配会导致大量的缺页异常,使内核的管理负担增大,这也是malloc只对大块内存使用mmap的原因。

对于比页更小的对象,比如1KB,如果也分配单独的页,会有内存浪费。针对这个问题,在内核空间中,Linux通过slab分配器来管理小对象。

对于释放缓存,应用程序在用户内存后,还需要调用free()或unmap()释放不用的内存,避免内存泄漏。

而对于回收内存,系统可通过以下三种方式回收

  • 回收缓存:比如使用LRU算法,回收最近最少使用的内存页面
  • 回收不常用的内存:把不常用的内存通过swap直接写到磁盘中
  • 杀死进程:通过OOM,直接杀掉占用大量内存的进程

以上就是关于Linux内存工作原理的简单介绍,包括进程使用虚拟内存、虚拟到物理内存的映射方式,以及分配和回收内存的介绍。实际上Linux内存的工作原理还要复杂得多,这里仅作一个整体的认识。

内存性能指标

通过了解工作原理,我们会了解到虚拟内存、swap空间等概念的实际含义,接下来我们来理解Linux的性能指标。

系统内存性能指标

  • 已用内存和剩余内存
  • 共享内存
  • 可用内存:新进程可使用的最大内存,它包括剩余内存和可回收缓存
  • 缓存(cache):包括两部分,一部分是磁盘读取文件的页缓存,用户缓存从磁盘读取的数据,可以加快以后再次访问的速度;另一部分,则是slab分配器中的可回收内存
  • 缓冲区(buff):对原始磁盘块的临时存储,用来缓存将要写入磁盘的数据。这样,内核就可以把分散的写集中起来,统一优化磁盘写入

进程内存性能指标

  • 虚拟内存
  • 常驻内存:进程实际使用的物理内存,不包括swap和共享内存
  • 共享内存
  • swap内存:通过swap换出磁盘的内存

swap性能指标

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

  • 次缺页异常:可以直接从物理内存中分配
  • 主缺页异常:需要磁盘I/O接入(比如swap)

这样,主缺页异常升高,意味着需要磁盘I/O,那么内存访问也会慢很多。

因此,对于swap来说,也属于重要的性能指标,具体包括

  • 已用空间
  • 剩余空间
  • 换入速度:即数据从磁盘换到内存的速度
  • 换出速度:即数据从内存换到磁盘的速度

总结

本文主要讲了Linux内存性能指标,通过如下的脑图可以有个整体的视角

参考链接

  • https://time.geekbang.org/column/intro/100020901
  • https://draveness.me/whys-the-design-os-virtual-memory/

理解Linux内存性能指标相关推荐

  1. 《深入理解LINUX内存管理》学习笔记(一)

    引子 为什么要写这个笔记: 1,这本书的中文版翻译了太垃圾,没法阅读.阅读英文原版,可以很好的理解作者的思路.作此笔记备忘 2,一直以来学习LINUX kernel的知识缺乏系统化,借对这本书的学习, ...

  2. 深入理解Linux内存映射机制

    Author: wzt EMail: [email]wzt@xsec.org[/email] Site: [url]http://www.xsec.org[/url] Date: 2008-6-13 ...

  3. 深入理解Linux内存管理

    1.1 内存管理的意义 1.2 原始内存管理 1.3 分段内存管理 1.4 分页内存管理 1.5 内存管理的目标 1.6 Linux内存管理体系 2.1 物理内存节点 2.2 物理内存区域 2.3 物 ...

  4. 深入理解Linux内存管理(0.3)

    学习方法论 写作原则 标题括号中的数字代表完成度与完善度 0.0-1.0 代表完成度,1.1-1.5 代表完善度 0.0 :还没开始写 0.1 :写了一个简介 0.3 :写了一小部分内容 0.5 :写 ...

  5. 深入理解Linux内存管理--目录导航

    日期 内核版本 架构 作者 GitHub CSDN 2016-08-31 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 1 ...

  6. linux应用对物理内存映射,深入理解Linux内存映射机制 (1)

    一. 绪 论 二. X86的硬件寻址方法 三. 内核对页表的设置 四. 实例分析映射机制 一. 绪 论 我们经常在程序的反汇编代码中看到一些类似0x32118965这样的地址,操作系统中称为线性地址, ...

  7. linux内存管理与设计,深入理解Linux内存管理机制(一)

    通过本文,您即可以: 1. 存储器硬件结构: 2.分段以及对应的组织方式: 3.分页以及对应的组织方式. 注1:本文以Linux内核2.6.32.59本版为例,其对应的代码可以在http://www. ...

  8. 深入理解 Linux 内存机制!| 技术头条

    作者 | 阿文 责编 | 郭芮 作为一名Linux 系统运维工程,在日常管理 Linux 的时候,我们经常发现系统的空闲内存差不多总是被用完了. 通常,我们可以通过 top 和 free 查看内存使用 ...

  9. linux 内存各指标,Linux 内存性能指标

    内存基础概念 先执行一下 top 命令,看结果中关于内存的相关部分 # top 其中的 VIRT.RES.SWAP 都是什么呢? 分别是下面的3个概念 物理内存 Resident - RES 实际的内 ...

最新文章

  1. 【PHPWord】页面添加图片水印
  2. HTML5实践之歌词同步播放器
  3. ApplicationListener,Game,Screen,Stage,Actor,Group
  4. printf,fprintf(stdout,stderr),sprintf等的使用方法及区别
  5. 网络应用优化——时延与带宽
  6. nullnullGet previous business day
  7. 算法之动态规划——编辑距离问题
  8. DB Stack Overflow
  9. NLog日志框架使用探究
  10. java学习(147):字节输入流
  11. 一个web版的计算器
  12. 第七节:WebApi与Unity整合进行依赖注入和AOP的实现
  13. zuul集成cloud_如何在具有持续集成的Google Cloud Run上运行Laravel-分步指南
  14. stl之string类用法详细总结
  15. Beego 使用笔记
  16. python项目方案书-前端python解释器方案预研
  17. DM9000有线网卡驱动编写
  18. win10安装docker导致virtualbox无法启动问题解决
  19. 图像处理:推导Canny边缘检测算法
  20. 时间的思考---《把时间当作朋友》读后感

热门文章

  1. android手机助手---小部分功能篇(2)
  2. Zabbix监控系统系列之十七:MYSQL数据库监控
  3. 微信支付xxe漏洞php,XXE 漏洞对微信支付有什么影响?
  4. 操作系统-内存管理(快表的地址变换机构,两级页表,虚拟内存的基本概念,基本页式管理下的页表和页面置换算法)
  5. 中国自动驾驶行业研究——商业化落地脚步加速
  6. oracle 9i hwm,Oracle 之HWM
  7. IOC原理之IoC容器的初始化过程
  8. MySQL 多表联合查询有何讲究?
  9. HTTP 协议中 Vary 的一些研究 转自https://www.imququ.com/post/vary-header-in-http.html
  10. 2009年上海中医药大学博士拟录取名单暨公、自费公示