今天有发现一个奇怪的问题,同样的两台机器,运行同样的程序,通过top命令发现,内存使用情况差别很大:
A:
top - 19:04:40 up 2 days, 22:12, 3 users, load average: 0.02, 0.02, 0.00
Tasks: 148 total, 1 running, 147 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.5%us, 0.2%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8061376k total, 7223040k used, 838336k free, 207700k buffers
Swap: 4194296k total, 7352k used, 4186944k free, 4147704k cached
B:
top - 19:04:57 up 7:45, 4 users, load average: 0.09, 0.02, 0.01
Tasks: 154 total, 1 running, 153 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.7%us, 0.3%sy, 0.0%ni, 98.9%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 8061376k total, 3090516k used, 4970860k free, 111888k buffers
Swap: 4194296k total, 0k used, 4194296k free, 307852k cached
使用free -m发现:
A:
[root@halove-release ~]# free -m
total used free shared buffers cached
Mem: 7872 7053 818 0 202 4050
-/+ buffers/cache: 2800 5072
Swap: 4095 7 4088
B:
[root@halove-release2 ~]# free -m
total used free shared buffers cached
Mem: 7872 3017 4854 0 109 300
-/+ buffers/cache: 2607 5264
Swap: 4095 0 4095
发现差别在cache上
以前对这几个参数没有深入分析,今天系统的查了一下:
分析内存的使用情况,需要从两个角度分析:
1. 从系统内核的角度出发:对应free -m命令的第二行(mem)
2. 从应用程序的角度出发:对应free -m命令的第三行(buffers/cache)
也就是说,分析的重点在2;从上图看2的内存使用情况差别不大。
那为什么造成1中差别2倍呢?原因是:
buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,大大提高了操作系统的性能。但buffers与cached缓冲的内容却是不同的。
buffers是用来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及 tracking in-flight pages,而cached是用来给文件做缓冲。更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。
为了验证我们的结论是否正确,可以通过vi打开一个非常大的文件,看看cached的变化,然后再次vi这个文件,感觉一下两次打开的速度有何异同,是不是第二次打开的速度明显快于第一次呢?
可以看出或许是因为A机器上打开了某个大文件导致cache很大。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于