原文引自这里
FS Cache
FS-Cache是一种内核功能,网络文件系统或其他文件系统可以通过它来缓存数据到本地磁盘空间,减少网络传输的数据,从而提升性能。这在网络速度比较慢时会得到比较好的效果。
FS-Cache 可以被任何希望添加本地缓存的文件系统使用,例如:AFS、NFS、CIFS和Isofs。
FS-Cache 对于客户端文件系统是透明存在的,当这项功能开启的时候,透过缓存请求文件对于客户端是无感知的。可以参考下图,FS-Cache可以认为是网络文件系统和缓存后端的中间介质:
看一个更详细的图,FS-Cache为网络文件系统提供了一个缓存工具,从而让缓存对用户无感知
FS-Cache并不遵循在允许访问之前将所有完全打开的每个netfs文件完全加载到高速缓存中,主要有以下几个原因:
- 没有Cache 也应该能够正常操作
- 被访问的文件的大小不应该受限于Cache的空间大小
- 所有已经打开的文件大小不应该受限于Cache的空间大小
- 不应该强制用户为了一个文件操作(访问文件的一小部分)将整个文件全部进行下载缓存
FS-Cache提供的能力如下:
1 | 1. More than one cache can be used at once. Caches can be selected explicitly by use of tags. 一次可以使用多个Cache,不同的Cache使用不同的tag区分 |
FS-Cache维护了一个网络文件系统数据的全部索引,该信息可以位于一个或者多个cache中,如下图所示:
1 | In the example above, you can see two netfs’s being backed: NFS and AFS. These have different index hierarchies: |
Kernel 内部的Cache 管理
FS-Cache维护类内核形态的网络文件感兴趣的对象,这些对象使用fscache_cookie 结构体来表示,以cookie的方式被引用。
FS-Cache 也单独维护了内核形态的 缓存后端正在使用的对象cache
1 | FS-Cache maintains an in-kernel representation of each object that a netfs is currently interested in. Such objects are represented by the fscache_cookie struct and are referred to as cookies. |
对象管理状态机
1 | Within FS-Cache, each active object is managed by its own individual state machine. The state for an object is kept in the fscache_object struct, in object->state. A cookie may point to a set of objects that are in different states. |
Provision of CPU Time
The work to be done by the various states was given CPU time by the threads of the slow work facility. This was used in preference to the workqueue facility because:
Threads may be completely occupied for very long periods of time by a particular work item. These state actions may be doing sequences of synchronous, journalled disk accesses (lookup, mkdir, create, setxattr, getxattr, truncate, unlink, rmdir, rename).
Threads may do little actual work, but may rather spend a lot of time sleeping on I/O. This means that single-threaded and 1-per-CPU-threaded workqueues don’t necessarily have the right numbers of threads.
Locking Simplification
Because only one worker thread may be operating on any particular object’s state machine at once, this simplifies the locking, particularly with respect to disconnecting the netfs’s representation of a cache object (fscache_cookie) from the cache backend’s representation (fscache_object) - which may be requested from either end.
状态集合
1 | The Set of States |
CacheFiles介绍
CacheFiles,是属于Linux Kernel的一个模块,主要用于缓存已经挂载的文件系统,CacheFiles 是一个缓存后端,当一个文件系统挂载到本地时,可以基于CacheFiles做一个缓存目录,CacheFi 使用一个用户空间的守护进程进行cache管理,例如收割陈旧的节点和剔除,这个守护进程被称为cachefilesd
缓存的文件系统和数据完整性与后端服务的文件系统一样好,由于不同文件系统的日志记录接口都是特殊定义的,因此CacheFiles不会尝试记录任文件系统日志
CacheFiles 会创建一个混杂的字符设备”/dev/cachefiles”,用于与守护进程进行通信,这个设备一次打开只能做一次事情,当它打开时,至少存在部分缓存,守护进程打开 并发送指令用于控制缓存,CacheFiles目前只能用于一个单独的缓存
CacheFiles会尝试维护文件系统一定比例的空闲空间,可能会通过剔除部分cache用户缩小cache的大小,用于释放空间,这就意味着可以在同一介质上存放灵活的实时数据,可能会扩展来使用空闲的空间,也可能收缩
Requiremenets
使用CacheFiles 需要以下依赖
- dnotify: 对文件信号进行监听
- extended attribute(xattrs)
- openat() and friends
- bmap() support on files in the filesystem (FIBMAP ioctl)
- the use of bmap() to detect a partial page at the end of the file
配置
配置文件 /etc/cachefilesd.conf,配置文件的主要内容为:
1 | brun <N>%, bcull <N>%, bstop <N>%, frun <N>%, fcull <N>%, fstop <N>% |
启动服务
启动守护进程,该守护进程打开 cache 设备(/dev/cachefiles),配置cache,并开始进行cache,此时cache绑定fscache,cache开始运行。具体的启动命令和参数如下所示:
1 | The daemon is run as follows: |
缓存剔除
缓存偶尔需要进行清理,用于释放空间,这里主要将近期未被使用的cache进行清理,基于文件的访问时间进行判断,如果空目录没有在使用也会被清理。Cache的清理是基于配置的当前文件系统的block比例和文件比例,主要有6个限制,如下所示
1 | brun, frun |
通常配置是这样
1 | 0 <= bstop < bcull < brun < 100 |
需要注意,这些值是表示的可以使用的空间和文件,并不是100 减去使用df 查看的信息,用户空间的守护进程扫描cache,来建立一个需要提出的对象表,基于最少使用原则进行剔除。“ A new scan of the cache is started as soon as space is made in the table”,如果对象的atimes(最后访问时间)发生了变化,不会进行剔除,或者内核模块通知说该文件仍然在使用,也不会删除该cache
缓存结构
会存在两个目录
- cache/
- graveyard/
活动的cache 对象会存放在 cache/ 目录。CacheFile的内核模块会将不再使用或者剔除的对象移动到graveyard 目录,守护进程会在graveyard进行删除,守护进程使用dnotify来监控graveyard目录,然后会将graveyard存在的对象删除。
CacheFiles 模块将索引对象使用目录的方式进行表示,目录名称可能是”I….”或者”J….”
没有子对象的数据对象会以文件的方式进行表示,有子对象的数据对象会以目录的形式进行表示,文件名称可能是”D…”或者”E….”。如果表示目录,那么会有一个叫”data”的文件在该目录,用户真实的保存数据
- 特殊的对象,通数据对象类似,不过文件名是以”S….”或者”T…”的形式
如果一个对象有子对象,那么他会以目录的形式表示,在该目录下会有一系列子目录,子目录的名称以@+子对象的哈希值命名,如下所示
1 | /INDEX /INDEX /INDEX /DATA FILES |
如果文件名称太长,超过了NAME_MAX的大小,那么会被分成多分,第一份被用于创建嵌套目录,最后一份会位于最后一个目录,每个中间目录的名称会以”+”作为前缀,例如:
1 | J1223/@23/+xy...z/+kl...m/Epqr |
1 | Note that keys are raw data, and not only may they exceed NAME_MAX in size, they may also contain things like ‘/’ and NUL characters, and so they may not be suitable for turning directly into a filename. |
转载的阅读摘要
1 | yum install cachefilesd; |