诗和远方

Linux内存管理:Swap、Cache、Buffer

Linux

Swap:当有应用需要读写磁盘数据时,由系统把相关数据从磁盘读取到内存,如果物理内存不够,则把内存中的部分数据导入到磁盘,从而把磁盘的部分空间当作虚拟内存来使用,也称为Swap。


如果给所有应用分配足够内存后,物理内存还有剩余,linux会尽量再利用这些空闲内存,以提高整体I/O效率,其方法是把这部分剩余内存再划分为cache及buffer两部分加以利用。


cache:从磁盘读取到内存的数据在被相关应用程序读取后,如果有剩余内存,则这部分数据会存入cache,以备第2次读取时,避免重新读取磁盘。

当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。

cache中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。


buffer:根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。Linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。

当一个应用程序在内存中修改过数据后,因为写入磁盘速度相对较低,在有空闲内存的情况下,这些数据先存入buffer,在以后某个时间再写入磁盘,从而应用程序可以继续后面的操作,而不必等待这些数据写入磁盘的操作完成。

举例:一个ext2的U盘,往里面COPY一个3M的文件,但U盘的灯没有闪烁,过了一会儿(或者手动输入sync)U盘的灯就闪烁起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。


buffer是即将要批量写入磁盘的,而cache是被从磁盘中预先读出来的。两者都是RAM中的数据。

缓存机制优点:减少系统调用次数,降低CPU上下文切换和磁盘访问频率。


如果系统需要更多的内存,则会把cache部分擦除,并把buffer中的内容写入磁盘,从而把这两部分内存释放给系统使用。

总结:空闲物理内存不多,不一定表示系统运行状态很差,因为内存的cache及buffer部分可以随时被重用,在某种意义上,这两部分内存也可以看作诗额外的空闲内存。swap如果被频繁调用,bi,bo长时间不为0,则才是内存资源是否紧张的依据。

如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小。


cache是高速缓存,用于CPU和内存之间的缓冲,文件系统的cache;buffer是I/O缓存,用于内存和硬盘的缓冲,是块设备的读写缓冲区。

cache用于 cpu 与 memory ;buffer用于 memory 与 disk 。


CPU的cache:位于CPU与主内存间的一种容量较小但速度很高的存储器(高速缓存)。CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。


CPU上下文切换:CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与待运行进程的进程切换。


释放缓存区内存的方法:

echo 1 > /proc/sys/vm/drop_caches #清理pagecache(页面缓存)
echo 2 > /proc/sys/vm/drop_caches #清理dentries(目录缓存)和inodes
echo 3 > /proc/sys/vm/drop_caches #清理pagecache、dentries和inodes

可以使用sync命令来清理文件系统缓存,还会清理僵尸(zombie)对象和它们占用的内存

上面操作在大多数情况下都不会对系统造成伤害,只会有助于释放不用的内存。

但是如果在执行这些操作时正在写数据,那么实际上在数据到达磁盘之前就将它从文件缓存中清除掉了,这可能会造成很不好的影响。


避免上述情况,/proc/sys/vm/vfs_cache_pressure文件告诉内核,当清理inoe/dentry缓存时应该用什么样的优先级。vfs_cache_pressure=100 是默认值。

减少vfs_cache_pressure的值,会导致内核倾向于保留dentry和inode缓存。

增加vfs_cache_pressure的值,(即超过100时),则会导致内核倾向于重新声明dentries和inodes

总之,vfs_cache_pressure的值:小于100的值不会导致缓存的大量减少;超过100的值则会告诉内核你希望以高优先级来清理缓存。

无论vfs_cache_pressure的值采用什么值,内核清理缓存的速度都是比较低的。如果将vfs_cache_pressure值设置为10000,系统将会将缓存减少到一个合理的水平。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Catalog
标签列表
最新
最热
常用网站
站点信息
  • 文章总数:2016
  • 页面总数:1
  • 分类总数:17
  • 标签总数:518
  • 评论总数:0
  • 浏览总数:592287
Archives
Copyright © 2017-2019 www.my889.com Some Rights Reserved.
推荐使用 Chrome 浏览器浏览本站
沪ICP备17052342号
Sitemap XML