zoukankan      html  css  js  c++  java
  • 如何正确查看Linux机器内存使用情况

    背景

    只要工作上涉及到Linux机器,基本上都会有这样一个需求,查看内存使用情况,但是怎么看才正确呢?之前使用的是top命令,一直存在一个误区。

    为什么top命令看内存会有误区?

    top是个很好用的系统分析工具,可以实时查看进程,cpu使用率,内存使用率等情况,有点像windows下的任务管理器。我以前一直以为top看到的就是真正的内存使用情况,后来baidugoogle好久,才发现自己图样。= =|| 
    首先看下top命令后展示出来的内存使用情况,我用自己一台`搬`瓦`工`vps做示范:

    Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:     73728k total,    70048k used,     3680k free,        0k buffers
    Swap:    16384k total,     4696k used,    11688k free,    64716k cached
    
    

    可以看到Mem: 73728k total, 70048k used, 3680k free, 0k buffers这一行,就是内存使用情况。一开始我也只看这一行。后来在公司的生产机子上看时,觉得很疑惑,只要是运行了一段时间的机子,内存的 total 和 used 总是非常的接近,free值很少,也就是说“内存使用率”非常高,哪怕我已经把各种服务都关掉了。但是就算这样,服务器也没有任何问题,再次启动 tomcat服务,做一些小的压测,表现的情况也很正常。那么问题就来了:明明内存情况这么紧张,怎么还能运行这么多服务,甚至做压力测试呢?—> 答案其实很简单,这些看起来used很多的内存中,一大部分是缓存,这就要说到Linux的内存管理机制了。

    Linux中的Cache Memory

    什么是Cache Memory(缓存内存):

    当你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。 
    其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。 
    只有当 free 减去 cached 剩下的这部分内存情况紧张时,才有可能出现应用程序没有足够内存使用的情况。

    所以其实刚才top看到的内存使用情况,有一部分是缓存,那个缓存有多少呢?注意看最后有个mem那行后面有个buffers ,swap那行后面有个cached,这两个就是缓存大小。所以如果要计算应用程序真正使用物理内存的情况,应该是used-cached-buffers才对,所以刚才top看到的物理内存使用情况为70048k-64716k=5332k。所以也才没用多少嘛!

    另外,如果单纯想要看内存使用情况,用free命令其实更直观:

    total       used       free     shared    buffers     cached
    Mem:         73728      70940       2788          0          0      64840
    -/+ buffers/cache:       6100      67628
    Swap:        16384       4500      11884
    
    

    这些信息的说明大致如下: 
    其中第一行用全局角度描述系统使用的内存状况: 
    total——总物理内存 
    used——已使用内存,一般情况这个值会比较大,因为这个值包括了cache+应用程序使用的内存 
    free——完全未被使用的内存 
    shared——应用程序共享内存 
    buffers——缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加) 
    cached——缓存,用于已打开的文件 
    注意-/+ buffers/cache: 6100 67628这行。 
    前个值表示-buffers/cache—–>不包括缓存,应用程序物理内存使用情况,即 -buffers/cache=used-buffers-cached ,所以此时应用程序才用了6100k内存 。 
    后个值表示+buffers/cache—–>所有可供应用程序使用的内存大小,free加上缓存值,即+buffers/cache=free+buffers+cached ,所以此时还有67628k 内存可供程序使用。 
    另外,free命令也可以使用”-m” 参数,这样显示的内存信息是用MB算,而不是KB,大内存情况下,这样更直观。

    free -m
    -----------
                 total       used       free     shared    buffers     cached
    Mem:            72         69          2          0          0         63
    -/+ buffers/cache:          5         66
    Swap:           16          4         11
    
    

    总结

     
    使用top命令或者free命令看到的内存使用率used中,包含了缓存,如果要查看应用程序真正的内存使用情况,应该是used-cached-buffers ,或者直接看free命令结果的-/+ buffers/cache行信息。 
  • 相关阅读:
    Spring Boot (十四): Spring Boot 整合 Shiro-登录认证和权限管理
    Spring Boot (十三): Spring Boot 小技巧
    救人一命是怎样的体验?
    如何做一个对账系统
    人工智能发展史-从图灵测试到大数据
    编程科普书籍推荐
    springcloud(十):服务网关zuul
    springcloud(九):配置中心和消息总线(配置中心终结版)
    springcloud(八):配置中心服务化和高可用
    springcloud(七):配置中心svn示例和refresh
  • 原文地址:https://www.cnblogs.com/insane-Mr-Li/p/10917262.html
Copyright © 2011-2022 走看看