| ================= |
| Writecache target |
| ================= |
| |
| The writecache target caches writes on persistent memory or on SSD. It |
| doesn't cache reads because reads are supposed to be cached in page cache |
| in normal RAM. |
| |
| When the device is constructed, the first sector should be zeroed or the |
| first sector should contain valid superblock from previous invocation. |
| |
| Constructor parameters: |
| |
| 1. type of the cache device - "p" or "s" |
| |
| - p - persistent memory |
| - s - SSD |
| 2. the underlying device that will be cached |
| 3. the cache device |
| 4. block size (4096 is recommended; the maximum block size is the page |
| size) |
| 5. the number of optional parameters (the parameters with an argument |
| count as two) |
| |
| start_sector n (default: 0) |
| offset from the start of cache device in 512-byte sectors |
| high_watermark n (default: 50) |
| start writeback when the number of used blocks reach this |
| watermark |
| low_watermark x (default: 45) |
| stop writeback when the number of used blocks drops below |
| this watermark |
| writeback_jobs n (default: unlimited) |
| limit the number of blocks that are in flight during |
| writeback. Setting this value reduces writeback |
| throughput, but it may improve latency of read requests |
| autocommit_blocks n (default: 64 for pmem, 65536 for ssd) |
| when the application writes this amount of blocks without |
| issuing the FLUSH request, the blocks are automatically |
| committed |
| autocommit_time ms (default: 1000) |
| autocommit time in milliseconds. The data is automatically |
| committed if this time passes and no FLUSH request is |
| received |
| fua (by default on) |
| applicable only to persistent memory - use the FUA flag |
| when writing data from persistent memory back to the |
| underlying device |
| nofua |
| applicable only to persistent memory - don't use the FUA |
| flag when writing back data and send the FLUSH request |
| afterwards |
| |
| - some underlying devices perform better with fua, some |
| with nofua. The user should test it |
| |
| Status: |
| 1. error indicator - 0 if there was no error, otherwise error number |
| 2. the number of blocks |
| 3. the number of free blocks |
| 4. the number of blocks under writeback |
| |
| Messages: |
| flush |
| flush the cache device. The message returns successfully |
| if the cache device was flushed without an error |
| flush_on_suspend |
| flush the cache device on next suspend. Use this message |
| when you are going to remove the cache device. The proper |
| sequence for removing the cache device is: |
| |
| 1. send the "flush_on_suspend" message |
| 2. load an inactive table with a linear target that maps |
| to the underlying device |
| 3. suspend the device |
| 4. ask for status and verify that there are no errors |
| 5. resume the device, so that it will use the linear |
| target |
| 6. the cache device is now inactive and it can be deleted |