Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.4 264 lines 14 kB view raw
1========= 2Frontswap 3========= 4 5Frontswap provides a "transcendent memory" interface for swap pages. 6In some environments, dramatic performance savings may be obtained because 7swapped pages are saved in RAM (or a RAM-like device) instead of a swap disk. 8 9.. _Transcendent memory in a nutshell: https://lwn.net/Articles/454795/ 10 11Frontswap is so named because it can be thought of as the opposite of 12a "backing" store for a swap device. The storage is assumed to be 13a synchronous concurrency-safe page-oriented "pseudo-RAM device" conforming 14to the requirements of transcendent memory (such as Xen's "tmem", or 15in-kernel compressed memory, aka "zcache", or future RAM-like devices); 16this pseudo-RAM device is not directly accessible or addressable by the 17kernel and is of unknown and possibly time-varying size. The driver 18links itself to frontswap by calling frontswap_register_ops to set the 19frontswap_ops funcs appropriately and the functions it provides must 20conform to certain policies as follows: 21 22An "init" prepares the device to receive frontswap pages associated 23with the specified swap device number (aka "type"). A "store" will 24copy the page to transcendent memory and associate it with the type and 25offset associated with the page. A "load" will copy the page, if found, 26from transcendent memory into kernel memory, but will NOT remove the page 27from transcendent memory. An "invalidate_page" will remove the page 28from transcendent memory and an "invalidate_area" will remove ALL pages 29associated with the swap type (e.g., like swapoff) and notify the "device" 30to refuse further stores with that swap type. 31 32Once a page is successfully stored, a matching load on the page will normally 33succeed. So when the kernel finds itself in a situation where it needs 34to swap out a page, it first attempts to use frontswap. If the store returns 35success, the data has been successfully saved to transcendent memory and 36a disk write and, if the data is later read back, a disk read are avoided. 37If a store returns failure, transcendent memory has rejected the data, and the 38page can be written to swap as usual. 39 40Note that if a page is stored and the page already exists in transcendent memory 41(a "duplicate" store), either the store succeeds and the data is overwritten, 42or the store fails AND the page is invalidated. This ensures stale data may 43never be obtained from frontswap. 44 45If properly configured, monitoring of frontswap is done via debugfs in 46the `/sys/kernel/debug/frontswap` directory. The effectiveness of 47frontswap can be measured (across all swap devices) with: 48 49``failed_stores`` 50 how many store attempts have failed 51 52``loads`` 53 how many loads were attempted (all should succeed) 54 55``succ_stores`` 56 how many store attempts have succeeded 57 58``invalidates`` 59 how many invalidates were attempted 60 61A backend implementation may provide additional metrics. 62 63FAQ 64=== 65 66* Where's the value? 67 68When a workload starts swapping, performance falls through the floor. 69Frontswap significantly increases performance in many such workloads by 70providing a clean, dynamic interface to read and write swap pages to 71"transcendent memory" that is otherwise not directly addressable to the kernel. 72This interface is ideal when data is transformed to a different form 73and size (such as with compression) or secretly moved (as might be 74useful for write-balancing for some RAM-like devices). Swap pages (and 75evicted page-cache pages) are a great use for this kind of slower-than-RAM- 76but-much-faster-than-disk "pseudo-RAM device". 77 78Frontswap with a fairly small impact on the kernel, 79provides a huge amount of flexibility for more dynamic, flexible RAM 80utilization in various system configurations: 81 82In the single kernel case, aka "zcache", pages are compressed and 83stored in local memory, thus increasing the total anonymous pages 84that can be safely kept in RAM. Zcache essentially trades off CPU 85cycles used in compression/decompression for better memory utilization. 86Benchmarks have shown little or no impact when memory pressure is 87low while providing a significant performance improvement (25%+) 88on some workloads under high memory pressure. 89 90"RAMster" builds on zcache by adding "peer-to-peer" transcendent memory 91support for clustered systems. Frontswap pages are locally compressed 92as in zcache, but then "remotified" to another system's RAM. This 93allows RAM to be dynamically load-balanced back-and-forth as needed, 94i.e. when system A is overcommitted, it can swap to system B, and 95vice versa. RAMster can also be configured as a memory server so 96many servers in a cluster can swap, dynamically as needed, to a single 97server configured with a large amount of RAM... without pre-configuring 98how much of the RAM is available for each of the clients! 99 100In the virtual case, the whole point of virtualization is to statistically 101multiplex physical resources across the varying demands of multiple 102virtual machines. This is really hard to do with RAM and efforts to do 103it well with no kernel changes have essentially failed (except in some 104well-publicized special-case workloads). 105Specifically, the Xen Transcendent Memory backend allows otherwise 106"fallow" hypervisor-owned RAM to not only be "time-shared" between multiple 107virtual machines, but the pages can be compressed and deduplicated to 108optimize RAM utilization. And when guest OS's are induced to surrender 109underutilized RAM (e.g. with "selfballooning"), sudden unexpected 110memory pressure may result in swapping; frontswap allows those pages 111to be swapped to and from hypervisor RAM (if overall host system memory 112conditions allow), thus mitigating the potentially awful performance impact 113of unplanned swapping. 114 115A KVM implementation is underway and has been RFC'ed to lkml. And, 116using frontswap, investigation is also underway on the use of NVM as 117a memory extension technology. 118 119* Sure there may be performance advantages in some situations, but 120 what's the space/time overhead of frontswap? 121 122If CONFIG_FRONTSWAP is disabled, every frontswap hook compiles into 123nothingness and the only overhead is a few extra bytes per swapon'ed 124swap device. If CONFIG_FRONTSWAP is enabled but no frontswap "backend" 125registers, there is one extra global variable compared to zero for 126every swap page read or written. If CONFIG_FRONTSWAP is enabled 127AND a frontswap backend registers AND the backend fails every "store" 128request (i.e. provides no memory despite claiming it might), 129CPU overhead is still negligible -- and since every frontswap fail 130precedes a swap page write-to-disk, the system is highly likely 131to be I/O bound and using a small fraction of a percent of a CPU 132will be irrelevant anyway. 133 134As for space, if CONFIG_FRONTSWAP is enabled AND a frontswap backend 135registers, one bit is allocated for every swap page for every swap 136device that is swapon'd. This is added to the EIGHT bits (which 137was sixteen until about 2.6.34) that the kernel already allocates 138for every swap page for every swap device that is swapon'd. (Hugh 139Dickins has observed that frontswap could probably steal one of 140the existing eight bits, but let's worry about that minor optimization 141later.) For very large swap disks (which are rare) on a standard 1424K pagesize, this is 1MB per 32GB swap. 143 144When swap pages are stored in transcendent memory instead of written 145out to disk, there is a side effect that this may create more memory 146pressure that can potentially outweigh the other advantages. A 147backend, such as zcache, must implement policies to carefully (but 148dynamically) manage memory limits to ensure this doesn't happen. 149 150* OK, how about a quick overview of what this frontswap patch does 151 in terms that a kernel hacker can grok? 152 153Let's assume that a frontswap "backend" has registered during 154kernel initialization; this registration indicates that this 155frontswap backend has access to some "memory" that is not directly 156accessible by the kernel. Exactly how much memory it provides is 157entirely dynamic and random. 158 159Whenever a swap-device is swapon'd frontswap_init() is called, 160passing the swap device number (aka "type") as a parameter. 161This notifies frontswap to expect attempts to "store" swap pages 162associated with that number. 163 164Whenever the swap subsystem is readying a page to write to a swap 165device (c.f swap_writepage()), frontswap_store is called. Frontswap 166consults with the frontswap backend and if the backend says it does NOT 167have room, frontswap_store returns -1 and the kernel swaps the page 168to the swap device as normal. Note that the response from the frontswap 169backend is unpredictable to the kernel; it may choose to never accept a 170page, it could accept every ninth page, or it might accept every 171page. But if the backend does accept a page, the data from the page 172has already been copied and associated with the type and offset, 173and the backend guarantees the persistence of the data. In this case, 174frontswap sets a bit in the "frontswap_map" for the swap device 175corresponding to the page offset on the swap device to which it would 176otherwise have written the data. 177 178When the swap subsystem needs to swap-in a page (swap_readpage()), 179it first calls frontswap_load() which checks the frontswap_map to 180see if the page was earlier accepted by the frontswap backend. If 181it was, the page of data is filled from the frontswap backend and 182the swap-in is complete. If not, the normal swap-in code is 183executed to obtain the page of data from the real swap device. 184 185So every time the frontswap backend accepts a page, a swap device read 186and (potentially) a swap device write are replaced by a "frontswap backend 187store" and (possibly) a "frontswap backend loads", which are presumably much 188faster. 189 190* Can't frontswap be configured as a "special" swap device that is 191 just higher priority than any real swap device (e.g. like zswap, 192 or maybe swap-over-nbd/NFS)? 193 194No. First, the existing swap subsystem doesn't allow for any kind of 195swap hierarchy. Perhaps it could be rewritten to accommodate a hierarchy, 196but this would require fairly drastic changes. Even if it were 197rewritten, the existing swap subsystem uses the block I/O layer which 198assumes a swap device is fixed size and any page in it is linearly 199addressable. Frontswap barely touches the existing swap subsystem, 200and works around the constraints of the block I/O subsystem to provide 201a great deal of flexibility and dynamicity. 202 203For example, the acceptance of any swap page by the frontswap backend is 204entirely unpredictable. This is critical to the definition of frontswap 205backends because it grants completely dynamic discretion to the 206backend. In zcache, one cannot know a priori how compressible a page is. 207"Poorly" compressible pages can be rejected, and "poorly" can itself be 208defined dynamically depending on current memory constraints. 209 210Further, frontswap is entirely synchronous whereas a real swap 211device is, by definition, asynchronous and uses block I/O. The 212block I/O layer is not only unnecessary, but may perform "optimizations" 213that are inappropriate for a RAM-oriented device including delaying 214the write of some pages for a significant amount of time. Synchrony is 215required to ensure the dynamicity of the backend and to avoid thorny race 216conditions that would unnecessarily and greatly complicate frontswap 217and/or the block I/O subsystem. That said, only the initial "store" 218and "load" operations need be synchronous. A separate asynchronous thread 219is free to manipulate the pages stored by frontswap. For example, 220the "remotification" thread in RAMster uses standard asynchronous 221kernel sockets to move compressed frontswap pages to a remote machine. 222Similarly, a KVM guest-side implementation could do in-guest compression 223and use "batched" hypercalls. 224 225In a virtualized environment, the dynamicity allows the hypervisor 226(or host OS) to do "intelligent overcommit". For example, it can 227choose to accept pages only until host-swapping might be imminent, 228then force guests to do their own swapping. 229 230There is a downside to the transcendent memory specifications for 231frontswap: Since any "store" might fail, there must always be a real 232slot on a real swap device to swap the page. Thus frontswap must be 233implemented as a "shadow" to every swapon'd device with the potential 234capability of holding every page that the swap device might have held 235and the possibility that it might hold no pages at all. This means 236that frontswap cannot contain more pages than the total of swapon'd 237swap devices. For example, if NO swap device is configured on some 238installation, frontswap is useless. Swapless portable devices 239can still use frontswap but a backend for such devices must configure 240some kind of "ghost" swap device and ensure that it is never used. 241 242* Why this weird definition about "duplicate stores"? If a page 243 has been previously successfully stored, can't it always be 244 successfully overwritten? 245 246Nearly always it can, but no, sometimes it cannot. Consider an example 247where data is compressed and the original 4K page has been compressed 248to 1K. Now an attempt is made to overwrite the page with data that 249is non-compressible and so would take the entire 4K. But the backend 250has no more space. In this case, the store must be rejected. Whenever 251frontswap rejects a store that would overwrite, it also must invalidate 252the old data and ensure that it is no longer accessible. Since the 253swap subsystem then writes the new data to the read swap device, 254this is the correct course of action to ensure coherency. 255 256* Why does the frontswap patch create the new include file swapfile.h? 257 258The frontswap code depends on some swap-subsystem-internal data 259structures that have, over the years, moved back and forth between 260static and global. This seemed a reasonable compromise: Define 261them as global but declare them in a new include file that isn't 262included by the large number of source files that include swap.h. 263 264Dan Magenheimer, last updated April 9, 2012