SSD as Cache (bcache)

最後更新: 2016-04-05

 

Bcache

Use an SSD as a cache for another blockdevice

HomePage: https://bcache.evilpiepirate.org/

* next generation: Bcachefs

* Bcache needs the backing device to be formatted as a bcache block device

* can be attached and detached at runtime, while mounted and in use

* Bcache is meant to be a superior alternative to battery backed up raid controllers, thus it must be reliable even if the power cord is yanked out.

* Detects and bypasses sequential IO (with a configurable threshold, and can be disabled) <= Backups and large file copies should thus entirely bypass the cache.

Operating mode:

read/write cache (in writeback mode)

read cache (writethrough or writearound)

Device:

/dev/bcacheN

 


Install

 

apt-get install bcache-tools

bin

  • /usr/sbin/make-bcache
  • /usr/sbin/bcache-super-show

 


Usage

 

# wipe partition

# wipe a filesystem signature from a device
# -a = Erase all available signatures.

wipefs -a /dev/sdy1

# Create a backing device

make-bcache -B /dev/sdx1

-B     Create a backing device

UUID:                   47d9e9b6-66dc-44c8-9569-2372589f4b15
Set UUID:               eb3c2c9a-0a22-4d63-b4ed-82a2a78d7c06
version:                1
block_size:             1
data_offset:            16

# Create a cache device

make-bcache -C /dev/sdy1

-C     Create a cache

UUID:                   84a2454f-eebe-416d-bd98-e5211dc890c8
Set UUID:               a77b7bf7-4dd6-4cf0-9f0e-c5ea61cac589
version:                0
nbuckets:               47694
block_size:             1
bucket_size:            1024
nr_in_set:              1
nr_this_dev:            0
first_bucket:           1

# More Info.

# The bucket size should match the erase block size of the caching device (SSD)

# cache hits are counted per bucket (thus a smaller bucket size will give better cache utilization,  but  poorer  write  performance.)

make-bcache -b 512 -C /dev/sdy2

# 當 bcache0 沒有在 /dev 出現時

# Without udev, you can manually register devices like this:

echo /dev/mapper/myvg-admin_data > /sys/fs/bcache/register

# 為 bcache0 加入 cache

# Register the cache device against your backing device
#  find the cache set UUID: bcache-super-show /dev/sdb1 | grep cset.uuid

echo cset.uuid > /sys/block/bcache0/bcache/attach

# 設定 cache mode

# Change your cache mode
# writethrough [writeback] writearound none

echo writeback > /sys/block/bcache0/bcache/cache_mode

# Check status

cat /sys/block/bcache0/bcache/state

Output :

no cache: this means you have not attached a caching device to your backing bcache device

clean: this means everything is ok. The cache is clean.

dirty: this means everything is setup fine and that you have enabled writeback and that the cache is dirty.

inconsistent: you are in trouble because the backing device is not in sync with the caching device

 


Stop cache

 

# Stop Cache

echo 1 > /sys/block/bcache0/bcache/stop

# Safely remove the cache device

echo <cache-set-uuid> > /sys/block/bcache0/bcache/detach

# Release backend devices

echo 1 > /sys/fs/bcache/<cache-set-uuid>/stop

# Remark - Checking Device

ll /dev/bcache*

 


/dev/bcacheN 沒有出現

 

If a backing device has data in a cache somewhere,
the /dev/bcache# device won't be created until the cache shows up
particularly important if you have writeback caching turned on.

If you're booting up and your cache device is gone and never coming back,
you can force run the backing device:

# disk

echo 1 > /sys/block/sdb/bcache/running

If there was dirty data in the cache, don't expect the filesystem to be recoverable
you will have massive filesystem corruption

# lvm backing device 找不到 cache device

echo 1  > /sys/devices/virtual/block/dm-6/bcache

 


統計

 

clear_stats

Writing to this file resets the running total stats (not the day/hour/5 minute decaying versions).

bypassed

Amount of IO (both reads and writes) that has bypassed the cache

cache_hits
cache_misses
cache_hit_ratio

cache_bypass_hits
cache_bypass_misses

dirty_data

Amount of dirty data is in the cache

 


Turning

 

readahead

Size of readahead that should be performed.  Defaults to 0.

If set to e.g. 1M, it will round cache miss reads up to that size, but without overlapping existing cache entries.

writeback_percent

If nonzero, bcache tries to keep around this percentage of the cache dirty by
throttling background writeback and using a PD controller to smoothly adjust the rate.

Remark: dirty data is data in the cache that has not been written to the backing device.

writeback_delay
  When dirty data is written to the cache and it previously did not contain
  any, waits some number of seconds before initiating writeback. Defaults to
  30.

writeback_rate

  Rate in sectors per second - if writeback_percent is nonzero, background
  writeback is throttled to this rate. Continuously adjusted by bcache but may
  also be set by the user.

sequential_cutoff

# 只 Cache 4M sequential IO

echo 4M > /sys/block/bcache0/bcache/sequential_cutoff

 


Other Opts

 

trigger_gc

Writing to this file forces garbage collection to run.

discard

Boolean; if on a discard/TRIM will be issued to each bucket before it is reused.

Defaults to off, since SATA TRIM is an unqueued command (and thus slow).

 


Other Usage

 

# Force flush of cache to backing device

echo 0 > /sys/block/bcache0/bcache/writeback_percent

echo 10 > /sys/block/bcache0/bcache/writeback_percent

 


Shutdown / Device removal

 

When the system is shut down the cache stays dirty.

That means that the backing device is not safe to be separated from the caching device unless they are first manually detached

or cache is switched to writethrough.

 


bcache-super-show

 

bcache-super-show /dev/myvg/thunder

sb.magic                ok
sb.first_sector         8 [match]
sb.csum                 8397886606A75AA0 [match]
sb.version              1 [backing device]

dev.label               (empty)
dev.uuid                c669f814-ade5-4955-974e-490156e13200
dev.sectors_per_block   1
dev.sectors_per_bucket  1024
dev.data.first_sector   16
dev.data.cache_mode     0 [writethrough]
dev.data.cache_state    0 [detached]

cset.uuid               92820d0f-3ca2-4b6f-bd8b-8511c43daaa0

 


找出 cache device 及 backend device

 

# bcache device 指向那 Backend device

ls -l /sys/block/bcache0/bcache

# output

/sys/block/bcache0/bcache -> ../dm-5/bcache

# 那 bcache device 的 Cache  device

ls -l /sys/block/bcache0/bcache/cache

# output

/sys/block/bcache0/bcache/cache -> ../../../../../fs/bcache/a77b7bf7-4dd6-4cf0-9f0e-c5ea61cac589

 


Tips

 

# 查看系統當前有幾多個 bcache device

lsmod | grep bcache

bcache                217088  1

 

 

 

Creative Commons license icon Creative Commons license icon