###背景 只要工做上涉及到Linux机器,基本上都会有这样一个需求,查看内存使用状况,可是怎么看才正确呢?以前使用的是top命令,后来各类baidugoogle,问了osc各路大神,才知道本身一直存在一个误区。html
###为何top命令看内存会有误区? top是个很好用的系统分析工具,能够实时查看进程,cpu使用率,内存使用率等状况,有点像windows下的任务管理器。我之前一直觉得top看到的就是真正的内存使用状况,后来baidugoogle很久,才发现本身图样。= =|| 首先看下top命令后展现出来的内存使用状况,我用本身一台搬瓦工vps作示范:node
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的内存管理机制了。windows
###Linux中的Cache Memory 什么是Cache Memory(缓存内存):缓存
当你读写文件的时候,Linux内核为了提升读写性能与速度,会将文件在内存中进行缓存,这部份内存就是Cache Memory(缓存内存)。即便你的程序运行结束后,Cache Memory也不会自动释放。这就会致使你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会不多。 其实这缓存内存(Cache Memory)在你须要使用内存的时候会自动释放,因此你没必要担忧没有内存可用。 只有当 free 减去 cached 剩下的这部份内存状况紧张时,才有可能出现应用程序没有足够内存使用的状况。tomcat
因此其实刚才top看到的内存使用状况,有一部分是缓存,那个缓存有多少呢?注意看最后有个mem那行后面有个buffers ,swap那行后面有个cached,这两个就是缓存大小。因此若是要计算应用程序真正使用物理内存的状况,应该是used-cached-buffers才对,因此刚才top看到的物理内存使用状况为70048k-64716k=5332k。因此也才没用多少嘛!bash
另外,若是单纯想要看内存使用状况,用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
行信息。性能
###本文引用测试