-
Linux文件系统的缓存机制
2018-11-13 09:20:24Linux文件系统的缓存机制分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
Linux文件系统设计了三类的Cache以用来支持多类型的文件系统。
一、 VFS索引节点缓存 Inode Cache
VFS索引节点是一个Hash表,它不断地读取。VFS提供的索引节点缓存可以加快对文件系统的存取。每次从索引节点缓存中读取一个VFS索引节点,这样系统就可以节省读取物理设备的存取时间。
当VFS访问索引节点时,它首先查找VFS索引节点缓存。为了在VFS索引节点缓存中查找一个索引节点,系统首先计算它对应的哈希值,然后将其作为索引值进入索引节点哈希表。然后再通过读取这个拥有相同哈希值的索引节点链表逐个匹配索引节点,直到找到具有指定设备号和inode号的索引节点。如果从缓存中找到了索引节点,该索引节点的计数值加1。否则申请一空闲的索引节点。二、 目录缓存 Inode Directory Cache
为了加快对常用的目录的存取,由于是根据路径访问文件的,Linux维护了表达路径与索引节点对应关系的目录缓存,被文件系统使用过的目录将会存入到该目录缓存中。这样,同一目录被再次访问时,可直接从缓冲区得到,不必重复访问存储文件系统的设备。
当真实的文件系统读取一个目录时,目录的详细信息被添加到目录缓存中。这样,同一目录被再次访问时,可直接从缓冲区找到此目录的有关信息。只有短于15个字符的目录才能保存在目录缓存中。
目录缓存由一张哈希表组成,其中每个表项指向具有同样哈希值的目录缓存链表的一个指针,哈希函数使用文件系统的设备号和目录名来计算哈希值,以便快速地找到一个目录项。为了保持一个最新的、正确的缓冲,VFS使用基于LRU(Least Recently Used)算法的目录缓冲链表。三、 缓冲区缓存 Buffer Cache
当进程使用安装的文件系统时,它们产生很多对块设备数据块的读写请求,如下图所示。这些块读写请求会通过标准核心过程以Buffer_head数据结构的形式给出设备驱动程序需要的几乎全部信息。操作系统将设备块上的数据看作具有同样大小的数据块的线性列表。Buffer_head中的b_dev和b_blocknr属性值惟一指明了向什么设备读写第几个数据块。
(缓冲区缓存结构)见最下方的图为了加快物理块设备的存取,Linux维护一组块缓冲区的缓存,称作Buffer Cache。它被所有物理块设备所共享。在任一时刻,由若干缓冲区为若干设备工作。数据块一经使用,就会在Buffer Cache留下备份,而且经常使用的数据将一直留在Buffer Cache中,下次再访问该数据时,如果从缓冲区缓存中可以得到有效的数据,则将节省系统去访问物理设备的时间。Buffer Cache的性能直接影响文件系统的性能。
块缓冲区高速缓存由两个功能部分组成。第一部分是空闲的块缓冲区列表。第二部分则是缓存自身。一个散列表包含了指向具有同样散列表索引的缓冲区链的指针。散列索引是由设备标志符合数据块的块号产生的。一个块缓冲不是在空闲表中就是在缓存中。缓存中的块缓冲同时被插入到最近最少使用(LRU)列表中。对应于每一种缓冲区类型都有一个LRU列表。
目前Linux支持以下5种缓冲区类型:
Clean 未使用、新创建的缓冲区
Locked 被锁住、等待被回写
Dirty 包含最新的有效数据,但还没有被回写
Shared 共享的缓冲区
Unshared 原来被共享但现在不共享Buffer Cache独立于任何类型的文件系统。文件系统中凡涉及到磁盘读写,几乎都通过Buffer Cache,有些甚至直接利用Buffer Cache保存信息。Linux中精心设计的Buffer Cache系统,它是由一个hash表和若干个以Buffer_Cache结构为节点的链表构成。
像所有的缓存一样,必须高效地维护缓冲区缓存,以便它有效地、公平地为块设备分配缓存表项。Linux使用bdflush监控程序执行这些Cache的看护工作。
可见,这三类的Cache分别针对索引节点、目录和块设备数据块而设计的,它们可以有效地支持Linux的文件系统。这里Linux通过对索引节点、目录和块设备数据块等各个环节而设立cache,在各个环节上都立足于提高存取的速度,这使得linux有一个高效的文件系统了。
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/6_system/linux/linuxjq/20100105/186136.html给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
-
Linux系统清除缓存的方法总结
2020-09-14 21:06:01在本篇文章里小编给大家整理了关于Linux系统清除缓存的方法和实例内容,需要的朋友们参考下。 -
Linux文件系统的页缓存
2018-01-26 19:02:15Linux系统内核为文件提供了一个缓存,目的是将一些磁盘上的数据缓存到RAM中,这样可以加快文件数据的访问——给定inode索引节点和文件页面偏移量时,可以快速地找到RAM中相应的文件页内容。这个能在称为页缓存(page...Linux系统内核为文件提供了一个缓存,目的是将一些磁盘上的数据缓存到RAM中,这样可以加快文件数据的访问——给定inode索引节点和文件页面偏移量时,可以快速地找到RAM中相应的文件页内容。这个能在称为页缓存(page cache)。使用页缓存的I/O操作称为buffer I/O,默认情况下内核都使用的是buffer I/O,但是有的应用(如数据库)不希望使用内核缓存,而是由应用提供缓存,这种由应用提供缓存的I/O称为direct I/O。设置了
O_DIRECT
标志后,将跳过页缓存,直接写入用户缓部区。Linux的页调整缓存能存储的页面范围很广,它缓存任何基于页的数据,包括普通文件、块设备文件和内存映射文件。在本文内为了简单起见只讨论普通磁盘文件的页缓存。
一个页缓存对应了一个文件,准确地说是一个inode索引节点,这个页缓存包含了数个物理页,每个物理页都缓存了这个文件的一部分数据,这个页缓存就用一个
address_space
结构体来表示。不过address_space
不仅管理着这个文件的页缓存,也管理着这些缓存页(物理页)到进程空间的映射关系。address_space
结构体的定义如下://linux-3.13/include/linux/fs.h struct address_space { //该页缓存指向的文件的inode索引节点 struct inode *host; /* owner: inode, block_device */ //该页缓存中的所有缓存页通过一个由page结构体组成的基树组织在一直,目的是便于搜索 struct radix_tree_root page_tree; /* radix tree of all pages */ spinlock_t tree_lock; /* and lock protecting it */ unsigned int i_mmap_writable;/* count VM_SHARED mappings */ //指向一颗红黑树,节点是与这个文件有关的VMA结构体,这些VMA可以属于多个进程。如果文件没有被映射到内存空间,那么这个字段为空 struct rb_root i_mmap; /* tree of private and shared mappings */ struct list_head i_mmap_nonlinear;/*list VM_NONLINEAR mappings */ struct mutex i_mmap_mutex; /* protect tree, count, list */ /* Protected by tree_lock together with the radix tree */ //该页缓存中包含的缓存页数目 unsigned long nrpages; /* number of total pages */ pgoff_t writeback_index;/* writeback starts here */ //与address_space相关的操作函数,例如readpage()、writepage()等真正执行文件读写的函数 const struct address_space_operations *a_ops; /* methods */ unsigned long flags; /* error bits/gfp mask */ struct backing_dev_info *backing_dev_info; /* device readahead, etc */ spinlock_t private_lock; /* for use by the address_space */ struct list_head private_list; /* ditto */ void *private_data; /* ditto */ } __attribute__((aligned(sizeof(long))));
address_space
结构体和文件的对应关系:一个address_space
结构体和一个文件相对应,但是两个不同的address_space
上可能对应相同的磁盘数据,比如一个文件通过文件系统打开和使用块设备直接打开时。从address_space
可以知道一个文件“已被缓存的页帧”和“哪些进程的哪些VMA”包含了这些页帧。一个正在被访问的文件将拥有一个address_space
对象,即使这个文件暂时没有进程使用,页缓存也不会被回收,直到物理页帧不足的时候才被换出。既然页缓存是为了减少对物理磁盘的访问,那么就必须提供必要的方法来判断一次文件I/O是否能通过页缓存而得到快速处理,也就是说判断一次文件I/O需要操作的数据是否在页缓存中。Linux中的每个文件都通过其对应的
address_space
结构体中的基树page_tree
来有效地组织页缓存中的物理页,当指定文件及相应的偏移量的时候就能快速地判断该页是否已经存在于页缓存中。当一个文件载入内存的时候,其对应的页缓存是空的,随着文件的读写,磁盘中的数据被载入内存,并添加一个对应的缓存页到page_tree
对应的位置上。在回收页帧而解除其映射的时候,需要找到全部引用该页帧的项,也就是找到所有引用了该
address_space
的进程,这叫做反向映射(Reverse Mapping)。根据页帧用于匿名页还是文件映射页,反向映射的记录方式也有所不同。文件映射页相关的反向映射信息保存在address_space->i_mapp
中,匿名页的反向映射信息保存在vm_area_struct
结构体的anon_vma_node
和anon_vma
成员中。这里只介绍文件映射页,也就是该页缓存对应的是磁盘上的某个文件的情况。Linux使用优先查找树来建立文件中的一段数据到进程的地址空间的映射关系。具体来说,
address_space
使用i_mmap
维护一个优先树,该树包含了所有与此文件相关的vma,,而这些vma通过各自的mm_struct从而建立了到进程的联系。当需要解除一个页帧的映射时,先利用页帧的page->mapping
找到对应的address_space
,再利用address_space->i_mmap
字段找到这些vma优先搜索树的根,然后查找解除映射时哪些进程的哪个vma会受到影响,从而可以确定哪些进程的项需要修改。 -
Linux清除系统缓存
2018-03-09 14:25:111)缓存机制介绍在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则...1)缓存机制介绍
在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。
缓存机制优点:减少系统调用次数,降低CPU上下文切换和磁盘访问频率。
CPU上下文切换:CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与待运行进程的进程切换。2)查看缓存区及内存使用情况
12345[root@localhost ~]
# free -m
total used
free
shared buffers cached
Mem: 7866 7725 141 19 74 6897
-/+ buffers
/cache
: 752 7113
Swap: 16382 32 16350
从上面的命令结果显示中可以看出:内存总共8G,已使用7725M,剩余141M,不少的人都是这么看的。
但其实这样并不能作为实际的使用率。因为有了缓存机制,具体算法如下:
空闲内存=free(141)+buffers(74)+cached(6897)
已用内存=total(7866)-空闲内存
由此算出空闲内存是7112M,已用内存754M,这才是真正的使用率,也可参考-/+ buffers/cache这行信息也是内存正确使用率。3)缓存区分buffers和cached区别
内核在保证系统能正常使用物理内存和数据量读写情况下来分配缓冲区大小。
buffers用来缓存metadata及pages,可以理解为系统缓存,例如,vi打开一个文件。
cached是用来给文件做缓存,可以理解为数据块缓存,例如,dd if=/dev/zero of=/tmp/test count=1 bs=1G 测试写入一个文件,就会被缓存到缓冲区中,当下一次再执行这个测试命令时,写入速度会明显很快。4)Swap用途
Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。
swap清理:
swapoff -a && swapon -a
注意:这样清理有个前提条件,空闲的内存必须比已经使用的swap空间大5)释放缓存区内存的方法
a)清理pagecache(页面缓存)1# echo 1 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=1
b)清理dentries(目录缓存)和inodes
1# echo 2 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=2
c)清理pagecache、dentries和inodes
1# echo 3 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=3
上面三种方式都是临时释放缓存的方法,要想永久释放缓存,需要在/etc/sysctl.conf文件中配置:vm.drop_caches=1/2/3,然后sysctl -p生效即可!
另外,可以使用sync命令来清理文件系统缓存,还会清理僵尸(zombie)对象和它们占用的内存
1# sync
--------------------友情提示一下----------------------
上面操作在大多数情况下都不会对系统造成伤害,只会有助于释放不用的内存。
但是如果在执行这些操作时正在写数据,那么实际上在数据到达磁盘之前就将它从文件缓存中清除掉了,这可能会造成很不好的影响。那么如果避免这种事情发生呢?
因此,这里不得不提一下/proc/sys/vm/vfs_cache_pressure这个文件,告诉内核,当清理inoe/dentry缓存时应该用什么样的优先级。12345678910vfs_cache_pressure=100 这个是默认值,内核会尝试重新声明dentries和inodes,并采用一种相对于页面缓存和交换缓存比较”合理”的比例。
减少vfs_cache_pressure的值,会导致内核倾向于保留dentry和inode缓存。
增加vfs_cache_pressure的值,(即超过100时),则会导致内核倾向于重新声明dentries和inodes
总之,vfs_cache_pressure的值:
小于100的值不会导致缓存的大量减少
超过100的值则会告诉内核你希望以高优先级来清理缓存。
其实无论vfs_cache_pressure的值采用什么值,内核清理缓存的速度都是比较低的。
如果将此值设置为10000,系统将会将缓存减少到一个合理的水平。
释放内存前先使用sync命令做同步,以确保文件系统的完整性,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。
/proc是一个虚拟文件系统,可以通过对它的读写操作作为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。也就是说我们可以通过调整/proc/sys/vm/drop_caches来释放内存。
drop_caches的值可以是0-3之间的数字,代表不同的含义:
0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存释放完内存后改回去让系统重新自动分配内存。
echo 0 >/proc/sys/vm/drop_caches其他参考:
http://www.cnblogs.com/kevingrace/p/5991604.html
https://linux.cn/article-5627-weibo.html
http://www.cnblogs.com/focai/p/5829897.html
http://blog.csdn.net/u014227228/article/details/46848623
-
清空Linux系统的缓存
2012-09-19 15:55:16清空Linux系统的缓存 sync && echo 3 > /proc/sys/vm/drop_caches清空Linux系统的缓存
sync && echo 3 > /proc/sys/vm/drop_caches
-
5款最好的免费Linux缓存系统
2012-03-22 15:06:48缓存的重要性不言而喻,它被系统以多种不同的方式来运用,可能储存在内存、硬盘,或数据库中,也常被用于处理DNS请求。 ...这5款最好的免费/开源的Linux缓存系统,自然不能错过。 1.memcached me -
关于Linux系统缓存的一些测试
2018-05-06 15:19:33LRU缓存回收策略的验证 环境信息: 准备工作: 操作步骤: ...上一篇 Linux系统缓存知识整理 中提到几个测试用例,这里补充一下详细的测试数据和结论。 LRU缓存回收策略的验证 环境信息: [... -
linux系统读写缓存
2016-08-10 23:44:001. 操作系统缓存 在linux世界里,一切可读写设备都可看作是文件。文件cache设计的好坏直接影响着文件系统和磁盘的性能。最直观的是使用free命令...操作系统的cache是通过page的方式管理的,内从管理系统分配和回收c... -
Linux系统清除缓存
2018-07-21 10:16:46在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接... -
linux缓存系统学习之浏览器缓存
2014-09-22 23:47:25这里从缓存开始说起,好久都没有写什么博客了,内容有不对的地方欢迎指正好像大多问题都能通过加缓存解决,什么叫缓存呢,缓存就是把需要花费昂贵开销的计算结果保存起来,在之后访问直接取出,这个昂贵的开销可以是... -
Linux 系统缓存机制学习
2018-10-22 17:57:00理解linux的系统缓存机制有助于理解elasticsearch实时更新的原理。 一、缓存机制 为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区... -
linux系统缓存机制
2017-11-22 15:59:00为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。... -
释放Linux系统缓存
2018-04-02 17:48:00清理Linux缓存使用下面的命令 sync; echo 3 > /proc/sys/vm/drop_caches 需求与原理 下面介绍buffer与cache的差别: A buffer is something that has yet to be "written" to disk. A cache is something... -
Linux的文件系统及文件缓存知识点整理
2020-10-28 20:09:13Linux的文件系统 文件系统的特点 ext系列的文件系统的格式 inode与块的存储 inode位图和块位图 文件系统的格式 目录的存储格式 Linux中的文件缓存 ext4文件系统层 带缓存的写入操作 带缓存的读操作 Linux... -
清理linux 系统内存缓存的方法
2020-11-10 17:56:57发现是内存的缓存占用比率高,需要清除一下 清除方法 [root@guanli1 ~]#cat /proc/sys/vm/drop_caches查看 0 [root@guanli1 ~]#echo 1 > /proc/sys/vm/drop_caches清除缓存 [root@guanli1 ~]#to...
-
VsCode中对python代码进行debug
-
win_Eagle 1.8.2.zip
-
cpp内存管理.pdf
-
charles 弱网测试设置
-
高压H
-
虚拟机云服务管理教程截图
-
HTC shift 救砖头
-
Vm虚拟机创建raid5盘+热备盘
-
FastDFS 分布式文件系统部署
-
WinSCP连接虚拟机的Ubuntu,居然显示被拒绝
-
Unity 热更新技术-ILRuntime
-
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
-
粒子群算法工具箱
-
不用下载软件将优酷kux转码成mp4
-
CAD2021最新免费正版版本Windows版本
-
NET Framework 3.5的安装文件.zip
-
龙芯生态应用开发基础:C语言精要
-
RapidScada从入门到精通
-
用于百瓦级的连续激光功率计的研制
-
Linux基础入门系列课程