Linux内存知识理解buffer和cached
这篇⽂章写得⾮常好,但是已经不到原⽂出处了。
经常遇到⼀些刚接触 Linux 的新⼿会问:内存占⽤怎么那么多?
在 Linux 中经常发现空闲内存很少,似乎所有的内存都被系统占⽤了,表⾯感觉是内存不够⽤了,其实不然。这是 Linux 内存管理的⼀个优秀特性,在这⽅⾯,区别于 Windows 的内存管理。主要特点是,⽆论物理内存有多⼤,Linux 都将其充份利⽤,将⼀些程序 调⽤过的硬盘数据读⼊内存,利⽤内存读写的⾼速特性来提⾼ Linux 系统的数据访问性能。⽽ Windows是只在需要内存时,才为应⽤程序分配内存,并不能充分利⽤⼤容量的内存空间。换句话说,每增加⼀些物理内存,Linux 都将能充分利⽤起来,发挥了硬件投资带来的好处,⽽Windows 只将其做为摆设,即使增加8GB甚⾄更⼤。
Linux 的这⼀特性,主要是利⽤空闲的物理内存,划分出⼀部份空间,做为cache、buffers ,以此提⾼数据访问性能。
页⾼速缓存(cache)是 Linux 内核实现的⼀种主要磁盘缓存。它主要⽤来减少对磁盘的 I/O 操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。
磁盘⾼速缓存的价值在于两个⽅⾯:第⼀,访问磁盘的速度要远远低于访问内存的速度,因此,从内存访
问数据⽐从磁盘访问速度更快。第⼆,数据⼀旦被访问,就很有可能在短期内再次被访问到。
下⾯来了解下 Linux 内存管理机制:
⼀、物理内存和虚拟内存
我们知道,直接从物理内存读写数据要⽐从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写⼊都在内存完成,⽽内存是有限的,这样就引出了物理内存与虚拟内存的概念。
物理内存就是系统硬件提供的内存⼤⼩,是真正的内存,相对于物理内存,在 Linux 下还有⼀个虚拟内存的概念,虚拟内存就是为了满⾜物理内存的不⾜⽽提出的策略,它是利⽤磁盘空间虚拟出的⼀块逻辑内存,⽤作虚拟内存的磁盘空间被称为交换空间(Swap Space)。
作为物理内存的扩展,Linux 会在物理内存不⾜时,使⽤交换分区的虚拟内存,更详细的说,就是内核会将暂时不⽤的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以⽤于其它⽬的,当需要⽤到原始的内容时,这些信息会被重新从交换空间读⼊物理内存。
Linux 的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利⽤,内核会在适当的时候将物理内存中不经常使⽤的数据块⾃动交换到虚拟内存中,⽽将经常使⽤的信息保留到物理内存。
要深⼊了解 Linux 内存运⾏机制,需要知道下⾯提到的⼏个⽅⾯:
1. Linux 系统会不时的进⾏页⾯交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事情需要内存,Linux 也会交换出暂时不
linux怎么读取文件⽤的内存页⾯。这可以避免等待交换所需的时间。
2. Linux 进⾏页⾯交换是有条件的,不是所有页⾯在不⽤时都交换到虚拟内存,Linux内核根据”最近最经常使⽤“算法,仅仅将⼀些不
经常使⽤的页⾯⽂件交换到虚拟内存,有时我们会看到这么⼀个现象:Linux 物理内存还有很多,但是交换空间也使⽤了很多。其实,这并不奇怪,例如,⼀个占⽤很⼤内存的进程运⾏时,需要耗费很多内存资源,此时就会有⼀些不常⽤页⾯⽂件被交换到虚拟内存中,但后来这个占⽤很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页⾯⽂件并不会⾃动的交换进物理内存,除⾮有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也在被使⽤,就出现了刚才所说的现象了。关于这点,不⽤担⼼什么,只要知道是怎么⼀回事就可以了。
3. 交换空间的页⾯在使⽤时会⾸先被交换到物理内存,如果此时没有⾜够的物理内存来容纳这些页⾯,它们⼜会被马上交换出去,如此
以来,虚拟内存中可能没有⾜够空间来存储这些交换页⾯,最终会导致 Linux 出现假死机、服务异常等问题,Linux 虽然可以在⼀段时间内⾃⾏恢复,但是恢复后的系统已经基本不可⽤了。
因此,合理规划和设计 Linux 内存的使⽤,是⾮常重要的。
⼆、内存的监控
作为⼀名 Linux 系统管理员,监控内存的使⽤状态是⾮常重要的,通过监控有助于了解内存的使⽤状态,⽐如内存占⽤是否正常,内存是否紧缺等等,监控内存最常使⽤的命令有 free、top 等,下⾯是某个系统 free 的输出:
[root@linuxeye ~]# free
total      used      free    shared    buffers    cached
Mem:      3894036    3473544    420492          0      72972    1332348
-/+ buffers/cache:    2068224    1825812
Swap:      4095992    906036    3189956
每个选项的含义:
第⼀⾏:
total:物理内存的总⼤⼩;
used:已经使⽤的物理内存⼤⼩;
free:空闲的物理内存⼤⼩;
shared:多个进程共享的内存⼤⼩;
buffers/cached:磁盘缓存的⼤⼩;
第⼆⾏Mem:代表物理内存使⽤情况;
第三⾏(-/+ buffers/cached):代表磁盘缓存使⽤状态;
第四⾏:Swap表⽰交换空间内存使⽤状态。
free 命令输出的内存状态,可以通过两个⾓度来查看:⼀个是从内核的⾓度来看,⼀个是从应⽤层的⾓度来看的。
从内核的⾓度来查看内存的状态
就是内核⽬前可以直接分配到,不需要额外的操作,即为上⾯ free 命令输出中第⼆⾏ Mem 项的值,可以看出,此系统物理内存有3894036K,空闲的内存只有420492K,也就是40M多⼀点,我们来做⼀个这样的计算:
3894036 – 3473544 = 420492
其实就是总的物理内存减去已经使⽤的物理内存得到的就是空闲的物理内存⼤⼩,注意这⾥的可⽤内存值420492并不包含处于 buffers 和 cached 状态的内存⼤⼩。
如果你认为这个系统空闲内存太⼩,那你就错了,实际上,内核完全控制着内存的使⽤情况,Linux 会在需要内存的时候,或在系统运⾏逐步推进时,将 buffers 和 cached 状态的内存变为 free 状态的内存,以供系统使⽤。
从应⽤层的⾓度来看系统内存的使⽤状态
也就是 Linux 上运⾏的应⽤程序可以使⽤的内存⼤⼩,即 free 命令第三⾏ -/+ buffers/cached 的输出,可以看到,此系统已经使⽤的内存才2068224K,⽽空闲的内存达到1825812K,继续做这样⼀个计算:
420492+(72972+1332348)=1825812
通过这个等式可知,应⽤程序可⽤的物理内存值是 Mem 项的 free 值加上 buffers 和 cached 值之和,也就是说,这个 free 值是包括buffers 和 cached 项⼤⼩的,对于应⽤程序来说,buffers/cached 占有的内存是可⽤的,因为 buffers/cached 是为了提⾼⽂件读取的性能,当应⽤程序需要⽤到内存的时候,buffers/cached 会很快地被回收,以供应⽤程序使⽤。
buffers 与 cached 的异同
在 Linux 操作系统中,当应⽤程序需要读取⽂件中的数据时,操作系统先分配⼀些内存,将数据从磁盘读⼊到这些内存中,然后再将数据分发给应⽤程序;当需要往⽂件中写数据时,操作系统先分配内存接收⽤户数据,然后再将数据从内存写到磁盘上。然⽽,如果有⼤量数据需要从磁盘读取到内存或者由内存写⼊磁盘时,系统的读写性能就变得⾮常低下,因为⽆论是从磁盘读数据,还是写数据到磁盘,都是⼀个很消耗时间和资源的过程,在这种情况下,Linux 引⼊了 buffers 和 cached 机制。
buffers 与 cached 都是内存操作,⽤来保存系统曾经打开过的⽂件以及⽂件属性信息,这样当操作系统需要读取某些⽂件时,会⾸先在buffers 与 cached 内存区查,如果到,直接读出传送给应⽤程序,如果没有到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,⼤⼤提⾼了操作系统的性能。但 buffers 与 cached 缓冲的内容却是不同的。
buffers 是⽤来缓冲块设备做的,它只记录⽂件系统的元数据(metadata)以及 tracking in-flight pages,
⽽ cached 是⽤来给⽂件做缓冲。更通俗⼀点说:buffers 主要⽤来存放⽬录⾥⾯有什么内容,⽂件的属性以及权限等等。⽽ cached 直接⽤来记忆我们打开过的⽂件和程序。
为了验证我们的结论是否正确,可以通过 vi 打开⼀个⾮常⼤的⽂件,看看 cached 的变化,然后再次 vi 这个⽂件,感觉⼀下两次打开的速度有何异同,是不是第⼆次打开的速度明显快于第⼀次呢?
接着执⾏下⾯的命令:
find /* -name  *.conf
看看 buffers 的值是否变化,然后重复执⾏ find 命令,看看两次显⽰速度有何不同。
Linux 操作系统的内存运⾏原理,很⼤程度上是根据服务器的需求来设计的,例如系统的缓冲机制会把经常使⽤到的⽂件和数据缓存在cached 中,Linux 总是在⼒求缓存更多的数据和信息,这样再次需要这些数据时可以直接从内存中取,⽽不需要有⼀个漫长的磁盘操作,这种设计思路提⾼了系统的整体性能。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。