| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 1 | ========================== | 
|  | 2 | General Filesystem Caching | 
|  | 3 | ========================== | 
|  | 4 |  | 
|  | 5 | ======== | 
|  | 6 | OVERVIEW | 
|  | 7 | ======== | 
|  | 8 |  | 
|  | 9 | This facility is a general purpose cache for network filesystems, though it | 
|  | 10 | could be used for caching other things such as ISO9660 filesystems too. | 
|  | 11 |  | 
|  | 12 | FS-Cache mediates between cache backends (such as CacheFS) and network | 
|  | 13 | filesystems: | 
|  | 14 |  | 
|  | 15 | +---------+ | 
|  | 16 | |         |                        +--------------+ | 
|  | 17 | |   NFS   |--+                     |              | | 
|  | 18 | |         |  |                 +-->|   CacheFS    | | 
|  | 19 | +---------+  |   +----------+  |   |  /dev/hda5   | | 
|  | 20 | |   |          |  |   +--------------+ | 
|  | 21 | +---------+  +-->|          |  | | 
|  | 22 | |         |      |          |--+ | 
|  | 23 | |   AFS   |----->| FS-Cache | | 
|  | 24 | |         |      |          |--+ | 
|  | 25 | +---------+  +-->|          |  | | 
|  | 26 | |   |          |  |   +--------------+ | 
|  | 27 | +---------+  |   +----------+  |   |              | | 
|  | 28 | |         |  |                 +-->|  CacheFiles  | | 
|  | 29 | |  ISOFS  |--+                     |  /var/cache  | | 
|  | 30 | |         |                        +--------------+ | 
|  | 31 | +---------+ | 
|  | 32 |  | 
|  | 33 | Or to look at it another way, FS-Cache is a module that provides a caching | 
|  | 34 | facility to a network filesystem such that the cache is transparent to the | 
|  | 35 | user: | 
|  | 36 |  | 
|  | 37 | +---------+ | 
|  | 38 | |         | | 
|  | 39 | | Server  | | 
|  | 40 | |         | | 
|  | 41 | +---------+ | 
|  | 42 | |                  NETWORK | 
|  | 43 | ~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 44 | | | 
|  | 45 | |           +----------+ | 
|  | 46 | V           |          | | 
|  | 47 | +---------+      |          | | 
|  | 48 | |         |      |          | | 
|  | 49 | |   NFS   |----->| FS-Cache | | 
|  | 50 | |         |      |          |--+ | 
|  | 51 | +---------+      |          |  |   +--------------+   +--------------+ | 
|  | 52 | |           |          |  |   |              |   |              | | 
|  | 53 | V           +----------+  +-->|  CacheFiles  |-->|  Ext3        | | 
|  | 54 | +---------+                        |  /var/cache  |   |  /dev/sda6   | | 
|  | 55 | |         |                        +--------------+   +--------------+ | 
|  | 56 | |   VFS   |                                ^                     ^ | 
|  | 57 | |         |                                |                     | | 
|  | 58 | +---------+                                +--------------+      | | 
|  | 59 | |                  KERNEL SPACE                      |      | | 
|  | 60 | ~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~|~~~~ | 
|  | 61 | |                  USER SPACE                        |      | | 
|  | 62 | V                                                    |      | | 
|  | 63 | +---------+                                           +--------------+ | 
|  | 64 | |         |                                           |              | | 
|  | 65 | | Process |                                           | cachefilesd  | | 
|  | 66 | |         |                                           |              | | 
|  | 67 | +---------+                                           +--------------+ | 
|  | 68 |  | 
|  | 69 |  | 
|  | 70 | FS-Cache does not follow the idea of completely loading every netfs file | 
|  | 71 | opened in its entirety into a cache before permitting it to be accessed and | 
|  | 72 | then serving the pages out of that cache rather than the netfs inode because: | 
|  | 73 |  | 
|  | 74 | (1) It must be practical to operate without a cache. | 
|  | 75 |  | 
|  | 76 | (2) The size of any accessible file must not be limited to the size of the | 
|  | 77 | cache. | 
|  | 78 |  | 
|  | 79 | (3) The combined size of all opened files (this includes mapped libraries) | 
|  | 80 | must not be limited to the size of the cache. | 
|  | 81 |  | 
|  | 82 | (4) The user should not be forced to download an entire file just to do a | 
|  | 83 | one-off access of a small portion of it (such as might be done with the | 
|  | 84 | "file" program). | 
|  | 85 |  | 
|  | 86 | It instead serves the cache out in PAGE_SIZE chunks as and when requested by | 
|  | 87 | the netfs('s) using it. | 
|  | 88 |  | 
|  | 89 |  | 
|  | 90 | FS-Cache provides the following facilities: | 
|  | 91 |  | 
|  | 92 | (1) More than one cache can be used at once.  Caches can be selected | 
|  | 93 | explicitly by use of tags. | 
|  | 94 |  | 
|  | 95 | (2) Caches can be added / removed at any time. | 
|  | 96 |  | 
|  | 97 | (3) The netfs is provided with an interface that allows either party to | 
|  | 98 | withdraw caching facilities from a file (required for (2)). | 
|  | 99 |  | 
|  | 100 | (4) The interface to the netfs returns as few errors as possible, preferring | 
|  | 101 | rather to let the netfs remain oblivious. | 
|  | 102 |  | 
|  | 103 | (5) Cookies are used to represent indices, files and other objects to the | 
|  | 104 | netfs.  The simplest cookie is just a NULL pointer - indicating nothing | 
|  | 105 | cached there. | 
|  | 106 |  | 
|  | 107 | (6) The netfs is allowed to propose - dynamically - any index hierarchy it | 
|  | 108 | desires, though it must be aware that the index search function is | 
|  | 109 | recursive, stack space is limited, and indices can only be children of | 
|  | 110 | indices. | 
|  | 111 |  | 
|  | 112 | (7) Data I/O is done direct to and from the netfs's pages.  The netfs | 
|  | 113 | indicates that page A is at index B of the data-file represented by cookie | 
|  | 114 | C, and that it should be read or written.  The cache backend may or may | 
|  | 115 | not start I/O on that page, but if it does, a netfs callback will be | 
|  | 116 | invoked to indicate completion.  The I/O may be either synchronous or | 
|  | 117 | asynchronous. | 
|  | 118 |  | 
|  | 119 | (8) Cookies can be "retired" upon release.  At this point FS-Cache will mark | 
|  | 120 | them as obsolete and the index hierarchy rooted at that point will get | 
|  | 121 | recycled. | 
|  | 122 |  | 
|  | 123 | (9) The netfs provides a "match" function for index searches.  In addition to | 
|  | 124 | saying whether a match was made or not, this can also specify that an | 
|  | 125 | entry should be updated or deleted. | 
|  | 126 |  | 
|  | 127 | (10) As much as possible is done asynchronously. | 
|  | 128 |  | 
|  | 129 |  | 
|  | 130 | FS-Cache maintains a virtual indexing tree in which all indices, files, objects | 
|  | 131 | and pages are kept.  Bits of this tree may actually reside in one or more | 
|  | 132 | caches. | 
|  | 133 |  | 
|  | 134 | FSDEF | 
|  | 135 | | | 
|  | 136 | +------------------------------------+ | 
|  | 137 | |                                    | | 
|  | 138 | NFS                                  AFS | 
|  | 139 | |                                    | | 
|  | 140 | +--------------------------+                +-----------+ | 
|  | 141 | |                          |                |           | | 
|  | 142 | homedir                     mirror          afs.org   redhat.com | 
|  | 143 | |                          |                            | | 
|  | 144 | +------------+           +---------------+              +----------+ | 
|  | 145 | |            |           |               |              |          | | 
|  | 146 | 00001        00002       00007           00125        vol00001   vol00002 | 
|  | 147 | |            |           |               |                         | | 
|  | 148 | +---+---+     +-----+      +---+      +------+------+            +-----+----+ | 
|  | 149 | |   |   |     |     |      |   |      |      |      |            |     |    | | 
|  | 150 | PG0 PG1 PG2   PG0  XATTR   PG0 PG1   DIRENT DIRENT DIRENT        R/W   R/O  Bak | 
|  | 151 | |                                            | | 
|  | 152 | PG0                                       +-------+ | 
|  | 153 | |       | | 
|  | 154 | 00001   00003 | 
|  | 155 | | | 
|  | 156 | +---+---+ | 
|  | 157 | |   |   | | 
|  | 158 | PG0 PG1 PG2 | 
|  | 159 |  | 
|  | 160 | In the example above, you can see two netfs's being backed: NFS and AFS.  These | 
|  | 161 | have different index hierarchies: | 
|  | 162 |  | 
|  | 163 | (*) The NFS primary index contains per-server indices.  Each server index is | 
|  | 164 | indexed by NFS file handles to get data file objects.  Each data file | 
|  | 165 | objects can have an array of pages, but may also have further child | 
|  | 166 | objects, such as extended attributes and directory entries.  Extended | 
|  | 167 | attribute objects themselves have page-array contents. | 
|  | 168 |  | 
|  | 169 | (*) The AFS primary index contains per-cell indices.  Each cell index contains | 
|  | 170 | per-logical-volume indices.  Each of volume index contains up to three | 
|  | 171 | indices for the read-write, read-only and backup mirrors of those volumes. | 
|  | 172 | Each of these contains vnode data file objects, each of which contains an | 
|  | 173 | array of pages. | 
|  | 174 |  | 
|  | 175 | The very top index is the FS-Cache master index in which individual netfs's | 
|  | 176 | have entries. | 
|  | 177 |  | 
|  | 178 | Any index object may reside in more than one cache, provided it only has index | 
|  | 179 | children.  Any index with non-index object children will be assumed to only | 
|  | 180 | reside in one cache. | 
|  | 181 |  | 
|  | 182 |  | 
|  | 183 | The netfs API to FS-Cache can be found in: | 
|  | 184 |  | 
|  | 185 | Documentation/filesystems/caching/netfs-api.txt | 
|  | 186 |  | 
|  | 187 | The cache backend API to FS-Cache can be found in: | 
|  | 188 |  | 
|  | 189 | Documentation/filesystems/caching/backend-api.txt | 
|  | 190 |  | 
| David Howells | 36c9559 | 2009-04-03 16:42:38 +0100 | [diff] [blame] | 191 | A description of the internal representations and object state machine can be | 
|  | 192 | found in: | 
|  | 193 |  | 
|  | 194 | Documentation/filesystems/caching/object.txt | 
|  | 195 |  | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 196 |  | 
|  | 197 | ======================= | 
|  | 198 | STATISTICAL INFORMATION | 
|  | 199 | ======================= | 
|  | 200 |  | 
|  | 201 | If FS-Cache is compiled with the following options enabled: | 
|  | 202 |  | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 203 | CONFIG_FSCACHE_STATS=y | 
|  | 204 | CONFIG_FSCACHE_HISTOGRAM=y | 
|  | 205 |  | 
|  | 206 | then it will gather certain statistics and display them through a number of | 
|  | 207 | proc files. | 
|  | 208 |  | 
|  | 209 | (*) /proc/fs/fscache/stats | 
|  | 210 |  | 
|  | 211 | This shows counts of a number of events that can happen in FS-Cache: | 
|  | 212 |  | 
|  | 213 | CLASS	EVENT	MEANING | 
|  | 214 | =======	=======	======================================================= | 
|  | 215 | Cookies	idx=N	Number of index cookies allocated | 
|  | 216 | dat=N	Number of data storage cookies allocated | 
|  | 217 | spc=N	Number of special cookies allocated | 
|  | 218 | Objects	alc=N	Number of objects allocated | 
|  | 219 | nal=N	Number of object allocation failures | 
|  | 220 | avl=N	Number of objects that reached the available state | 
|  | 221 | ded=N	Number of objects that reached the dead state | 
|  | 222 | ChkAux	non=N	Number of objects that didn't have a coherency check | 
|  | 223 | ok=N	Number of objects that passed a coherency check | 
|  | 224 | upd=N	Number of objects that needed a coherency data update | 
|  | 225 | obs=N	Number of objects that were declared obsolete | 
|  | 226 | Pages	mrk=N	Number of pages marked as being cached | 
|  | 227 | unc=N	Number of uncache page requests seen | 
|  | 228 | Acquire	n=N	Number of acquire cookie requests seen | 
|  | 229 | nul=N	Number of acq reqs given a NULL parent | 
|  | 230 | noc=N	Number of acq reqs rejected due to no cache available | 
|  | 231 | ok=N	Number of acq reqs succeeded | 
|  | 232 | nbf=N	Number of acq reqs rejected due to error | 
|  | 233 | oom=N	Number of acq reqs failed on ENOMEM | 
|  | 234 | Lookups	n=N	Number of lookup calls made on cache backends | 
|  | 235 | neg=N	Number of negative lookups made | 
|  | 236 | pos=N	Number of positive lookups made | 
|  | 237 | crt=N	Number of objects created by lookup | 
|  | 238 | Updates	n=N	Number of update cookie requests seen | 
|  | 239 | nul=N	Number of upd reqs given a NULL parent | 
|  | 240 | run=N	Number of upd reqs granted CPU time | 
|  | 241 | Relinqs	n=N	Number of relinquish cookie requests seen | 
|  | 242 | nul=N	Number of rlq reqs given a NULL parent | 
|  | 243 | wcr=N	Number of rlq reqs waited on completion of creation | 
|  | 244 | AttrChg	n=N	Number of attribute changed requests seen | 
|  | 245 | ok=N	Number of attr changed requests queued | 
|  | 246 | nbf=N	Number of attr changed rejected -ENOBUFS | 
|  | 247 | oom=N	Number of attr changed failed -ENOMEM | 
|  | 248 | run=N	Number of attr changed ops given CPU time | 
|  | 249 | Allocs	n=N	Number of allocation requests seen | 
|  | 250 | ok=N	Number of successful alloc reqs | 
|  | 251 | wt=N	Number of alloc reqs that waited on lookup completion | 
|  | 252 | nbf=N	Number of alloc reqs rejected -ENOBUFS | 
|  | 253 | ops=N	Number of alloc reqs submitted | 
|  | 254 | owt=N	Number of alloc reqs waited for CPU time | 
|  | 255 | Retrvls	n=N	Number of retrieval (read) requests seen | 
|  | 256 | ok=N	Number of successful retr reqs | 
|  | 257 | wt=N	Number of retr reqs that waited on lookup completion | 
|  | 258 | nod=N	Number of retr reqs returned -ENODATA | 
|  | 259 | nbf=N	Number of retr reqs rejected -ENOBUFS | 
|  | 260 | int=N	Number of retr reqs aborted -ERESTARTSYS | 
|  | 261 | oom=N	Number of retr reqs failed -ENOMEM | 
|  | 262 | ops=N	Number of retr reqs submitted | 
|  | 263 | owt=N	Number of retr reqs waited for CPU time | 
|  | 264 | Stores	n=N	Number of storage (write) requests seen | 
|  | 265 | ok=N	Number of successful store reqs | 
|  | 266 | agn=N	Number of store reqs on a page already pending storage | 
|  | 267 | nbf=N	Number of store reqs rejected -ENOBUFS | 
|  | 268 | oom=N	Number of store reqs failed -ENOMEM | 
|  | 269 | ops=N	Number of store reqs submitted | 
|  | 270 | run=N	Number of store reqs granted CPU time | 
|  | 271 | Ops	pend=N	Number of times async ops added to pending queues | 
|  | 272 | run=N	Number of times async ops given CPU time | 
|  | 273 | enq=N	Number of times async ops queued for processing | 
|  | 274 | dfr=N	Number of async ops queued for deferred release | 
|  | 275 | rel=N	Number of async ops released | 
|  | 276 | gc=N	Number of deferred-release async ops garbage collected | 
|  | 277 |  | 
|  | 278 |  | 
|  | 279 | (*) /proc/fs/fscache/histogram | 
|  | 280 |  | 
|  | 281 | cat /proc/fs/fscache/histogram | 
| David Howells | 7394daa | 2009-04-03 16:42:37 +0100 | [diff] [blame] | 282 | JIFS  SECS  OBJ INST  OP RUNS   OBJ RUNS  RETRV DLY RETRIEVLS | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 283 | ===== ===== ========= ========= ========= ========= ========= | 
|  | 284 |  | 
|  | 285 | This shows the breakdown of the number of times each amount of time | 
|  | 286 | between 0 jiffies and HZ-1 jiffies a variety of tasks took to run.  The | 
|  | 287 | columns are as follows: | 
|  | 288 |  | 
|  | 289 | COLUMN		TIME MEASUREMENT | 
|  | 290 | =======		======================================================= | 
|  | 291 | OBJ INST	Length of time to instantiate an object | 
|  | 292 | OP RUNS		Length of time a call to process an operation took | 
|  | 293 | OBJ RUNS	Length of time a call to process an object event took | 
|  | 294 | RETRV DLY	Time between an requesting a read and lookup completing | 
|  | 295 | RETRIEVLS	Time between beginning and end of a retrieval | 
|  | 296 |  | 
|  | 297 | Each row shows the number of events that took a particular range of times. | 
| David Howells | 7394daa | 2009-04-03 16:42:37 +0100 | [diff] [blame] | 298 | Each step is 1 jiffy in size.  The JIFS column indicates the particular | 
|  | 299 | jiffy range covered, and the SECS field the equivalent number of seconds. | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 300 |  | 
|  | 301 |  | 
|  | 302 | ========= | 
|  | 303 | DEBUGGING | 
|  | 304 | ========= | 
|  | 305 |  | 
| David Howells | 7394daa | 2009-04-03 16:42:37 +0100 | [diff] [blame] | 306 | If CONFIG_FSCACHE_DEBUG is enabled, the FS-Cache facility can have runtime | 
|  | 307 | debugging enabled by adjusting the value in: | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 308 |  | 
|  | 309 | /sys/module/fscache/parameters/debug | 
|  | 310 |  | 
|  | 311 | This is a bitmask of debugging streams to enable: | 
|  | 312 |  | 
|  | 313 | BIT	VALUE	STREAM				POINT | 
|  | 314 | =======	=======	===============================	======================= | 
|  | 315 | 0	1	Cache management		Function entry trace | 
|  | 316 | 1	2					Function exit trace | 
|  | 317 | 2	4					General | 
|  | 318 | 3	8	Cookie management		Function entry trace | 
|  | 319 | 4	16					Function exit trace | 
|  | 320 | 5	32					General | 
|  | 321 | 6	64	Page handling			Function entry trace | 
|  | 322 | 7	128					Function exit trace | 
|  | 323 | 8	256					General | 
|  | 324 | 9	512	Operation management		Function entry trace | 
|  | 325 | 10	1024					Function exit trace | 
|  | 326 | 11	2048					General | 
|  | 327 |  | 
|  | 328 | The appropriate set of values should be OR'd together and the result written to | 
|  | 329 | the control file.  For example: | 
|  | 330 |  | 
|  | 331 | echo $((1|8|64)) >/sys/module/fscache/parameters/debug | 
|  | 332 |  | 
|  | 333 | will turn on all function entry debugging. |