关于内存的概念及其原理在任何一本介绍操作系统的书本中都可以查阅到。

  理论放一遍,在Linux操作系统中如何查看系统内存使用情况呢?看看内存统计信息有哪些维度。

  一、内存使用量

    

  详细使用方法,man free

    

  top命令,之前在研究cpu性能优化过程中已经用到,但是重点放在CPU相关的指标上。这里重点查看关于内存的指标:

    

    如果swap中used如果used不断在变化, 说明内核在不断进行内存和swap的数据交换,说明内存真的不够用了。

  二、缓存与缓冲区命中率

    这俩是啥意思?cache&&buffer。对于这两者的区别可以通过man free获得它们的说明:

      

    具体含义是什么呢?通过/proc文件系统确认他们的含义:

    /proc 是 Linux 内核提供的一种特殊文件系统,是用户跟内核交互的接口。比方说,用户可以从 /proc 中查询内核的运行状态和配置选项, 查询进程的运行状态、统计数据等,也可以通过 /proc 来修改内核的配置。proc 文件系统同时也是很多性能工具的最终数据来源。
    实际操作使用命令proc,如果无此命令通过yum安装man-pages相关内容。
      

    简而言之就是一个是buffer是针对磁盘的读写缓存,而cache是针对文件的读写页缓存。

    什么是缓存命中率:指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比。命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好。

    下面是查看缓存命中情况的工具:

      cachestat 提供了整个操作系统缓存的读写命中情况。
      cachetop 提供了每个进程的缓存命中情况。

    这俩工具有bcc工具包提供,如果系统无自带,使用yum进行安装。注意安装之后设置PATH环境变量,bcc 软件包默认不会把这些工具配置到系统的 PATH 路径中,所以你得自己手动配置。

    

    cachetop:

    

  三、内存性能指标

    已知如何查看内存相关性能了,那么为了分析内存的性能瓶颈,首先你要知道,怎样衡量内存的性能,也就是性能指标问题。
    首先,你最容易想到的是 系统内存使用情况 ,比如已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量等。
      已用内存和剩余内存很容易理解,就是已经使用和还未使用的内存。
      共享内存是通过 tmpfs (内存的文件系统 )实现的,所以它的大小也就是 tmpfs 使用的内存大小。tmpfs 其实也是一种特殊的缓存。
      可用内存是新进程可以使用的最大内存,它包括剩余内存和可回收缓存。
      缓存包括两部分,一部分是磁盘读取文件的页缓存,用来缓存从磁盘读取的数据,可以加快以后再次访问的速度。另一部分,则是 Slab 分配器中的可回收内存。
      缓冲区是对原始磁盘块的临时存储,用来缓存将要写入磁盘的数据。这样,内核就可以把分散的写集中起来,统一优化磁盘写入。
    第二类很容易想到的,应该是 进程内存使用情况 ,比如进程的虚拟内存、常驻内存、共享内存以及 Swap 内存等。
      虚拟内存,包括了进程代码段、数据段、共享内存、已经申请的堆内存和已经换出的内存等。这里要注意,已经申请的内存,即使还没有分配物理内存,也算作虚拟内存。
      常驻内存是进程实际使用的物理内存,不过,它不包括 Swap 和共享内存。
      共享内存,既包括与其他进程共同使用的真实的共享内存,还包括了加载的动态链接库以及程序的代码段等
      Swap 内存,是指通过 Swap 换出到磁盘的内存。
    第三类 缺页异常 ,系统调用内存分配请求后,并不会立刻为其分配物理内存,而是在请求首次访问时,通过缺页异常来分配。缺页异常又分为下面两种场景。
      可以直接从物理内存中分配时,被称为次缺页异常。
      需要磁盘 I/O 介入(比如 Swap)时,被称为主缺页异常。
    第四类重要指标就是 Swap 的使用情况 ,比如 Swap 的已用空间、剩余空间、换入速度和换出速度等。
      已用空间和剩余空间很好理解,就是字面上的意思,已经使用和没有使用的内存空间。
      换入和换出速度,则表示每秒钟换入和换出内存的大小。

    

    

  

  

      

  

  

最新文章

  1. IDEA设置代码大小以及菜单栏大小
  2. JAVA语言的本质优势
  3. solr多条件查询(一)
  4. 133. Clone Graph 138. Copy List with Random Pointer 拷贝图和链表
  5. oracle中如何指定表字段自增
  6. 让Laravel5支持memcache的方法
  7. winForm 中子窗体关闭但不释放对象,方便下次继续打开
  8. js触摸屏案例
  9. MyEclipse 2014去除derby
  10. 读书笔记 effective c++ Item3 在任何可能的时候使用 const
  11. Mac入门——快捷键
  12. CRM客户关系管理系统(十一)
  13. Fastjson反序列化漏洞研究
  14. W10激活
  15. 部署redis4.0-cluster
  16. 转://Oracle Golden Gate 概念和原理
  17. C#winform自定义控件大全
  18. CodeForces 570D - Tree Requests - [DFS序+二分]
  19. 微信小程序学习——框架视图层(view)
  20. 微信小程序——豆瓣电影——(2):小程序运行部署

热门文章

  1. What's The Next|Kube-OVN 社区线上 Meetup 预告!
  2. 彻彻底底地理解TCP三次握手和四次挥手的全部过程
  3. CVE-2020-0786(永恒之黑) GetShell
  4. 在 k8s 中的 jenkins 集成 sonarqube 实现代码质量检查
  5. BERT-Pytorch版本代码pipline梳理
  6. leetcode 46. 全排列 及 47. 全排列 II
  7. winform设置所有窗体统一图标
  8. C++多线程之互斥锁和超时锁
  9. 集合框架-工具类-JDK5.0特性-静态导入
  10. 沁恒CH32F103C8T6的开发和烧录配置说明