在性能测试中关于Linux服务器,基本上都会有这样一个问题,服务器的内存使用率应该是多少? 服务器有足够的内存么?
我们首先使用top来实时查看进程,CPU使用率,内存使用率等等,类似于MS Window下的任务管理器,下图是一台Linux Server的运行结果:
可以看到 Mem: 33015148k total, 27321116k used, 5694032k free, 264136k buffers
那我们能不能得出一个结论,内存使用率=used/total=27321116k/33015148k=82.7%? 可是实际上运行的任务并不多,为什么会有这么高的内存使用率? 而且即使停止一些进程的服务器内存也不会释放太多,此时即使运行一些很占内存的应用也没有任何问题,这是为什么呢? 答案其实很简单,这些看起来used很多的内存中,相当一部分部分是缓存,这就要说到Linux的内存管理机制了。
Linux中的Cache Memory
Linux内存管理的一个原则就是尽量利用闲置的内存来提高系统整体性能。当读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致在Linux系统在使用一段时间后,可用物理内存会逐渐变少。实际上Cache Memory在需要使用内存的时候会自动释放,所以完全不必担心Cache占用太多内存,可以认为Cached=Free.
那缓存改怎么查看? 注意看在Top命令的输出结果中,Mem那行后面有个buffers ,Swap那行后面有个cached,这两个就是缓存大小。所以如果要计算应用程序真正使用物理内存的情况,应该是Used-Cached-buffers才对,所以刚才top看到的物理内存使用情况为27321116k-264136k-14474764=12582216。所以内存使用率也不过40%。
另外,如果单纯想要看内存使用情况,用free命令其实更直观,下图是在相同的机器上运行 free -m 的结果:
其中第一行用全局角度描述系统使用的内存状况:
total - 总物理内存
used - 已使用内存,一般情况这个值会比较大,因为这个值包括了cache+应用程序使用的内存
free - 完全未被使用的内存
shared - 应用程序共享内存
buffers - 缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)
cached - 缓存,用于已打开的文件
-buffers/cache - 不包括缓存,应用程序物理内存使用情况,即 -buffers/cache=used-buffers-cached ,所以此时应用程序才用了12288MB内存 。
+buffers/cache - 所有可供应用程序使用的内存大小,free加上缓存值,即+buffers/cache=free+buffers+cached ,所以此时还有19953MB内存可供程序使用。