bcache 사용하기

Posted on 04/18/2018 in tech

bcache 는 ssd와 hdd를 조합해서 sshd(hybrid drive)를 소프트웨어 적으로 구현하는 리눅스 커널의 기능입니다.

일반적으로 ssd는 hdd보다 전송 속도 및 반응 속도가 빨라서 입출력이 많은 작업에 사용하기 좋지만, 가격이 비싸기 때문에 대용량의 데이터를 보관하는데 적합하지 않습니다. 하지만 빠른 반응속도를 가진 용량 작은 ssd(Intel Optane Memory등)와 적당한 가격의 큰 hdd를 bcache로 엮어주면 가성비가 괜찮은 sshd를 임의로 만들 수 있습니다.

먼저 bcache를 구성하려면 데이터가 비어있는 ssd 파티션과 마찬가지로 데이터가 비어있는 hdd 파티션이 필요합니다.

먼저 ssd 파티션을 bcache의 cache 장치로 등록합니다.

$ sudo make-bcache -C --block 512 --bucket 2M --wipe-bcache /dev/nvme0n1p3
UUID:            29373e97-cb10-4474-8ab2-2d99917da727
Set UUID:        7701c988-810e-4603-be15-a122c670975e
version:         0
nbuckets:        141280
block_size:      1
bucket_size:     4096
nr_in_set:       1
nr_this_dev:     0
first_bucket:    1

—block 옵션은 연동할 hdd의 블럭단위크기로 설정하고, —bucket 옵션은 ssd의 작업단위크기로 설정하면 됩니다.

단 —bucket 옵션의 크기를 너무 크게 주면 등록이 되지 않기 때문에 오류가 발생하면 dmesg 명령으로 커널 메세지를 확인하시기 바랍니다.

위와 같이 cache 장치로 등록하면 “Set UUID”를 주의깊게 기억하고 있다가 hdd를 등록할 때 사용하면 됩니다.

이미 등록된 ssd의 set uuid는 다음과 같이 확인해볼 수 있습니다.

$ ls -l /sys/fs/bcache
drwxr-xr-x 7 root root    0  4월 18 15:34 7701c988-810e-4603-be15-a122c670975e
--w------- 1 root root 4096  4월 18 14:36 register
--w------- 1 root root 4096  4월 18 14:36 register_quiet

또는 다음 명령의 출력 결과 중 cset.uuid 를 확인해도 됩니다.

$ sudo bcache-super-show /dev/nvme0n1p3
sb.magic           ok
sb.first_sector    8 [match]
sb.csum            268D099BA966DCC6 [match]
sb.version         3 [cache device]

dev.label          (empty)
dev.uuid           29373e97-cb10-4474-8ab2-2d99917da727
dev.sectors_per_block     8
dev.sectors_per_bucket    8192
dev.cache.first_sector    8192
dev.cache.cache_sectors   578674688
dev.cache.total_sectors   578682880
dev.cache.ordered    yes
dev.cache.discard    no
dev.cache.pos        0
dev.cache.replacement 0 [lru]

cset.uuid          7701c988-810e-4603-be15-a122c670975e

ssd가 구성되면, backing partition으로 사용될 hdd 를 초기화 합니다. 다음 옵션중 —cset-uuid 의 인자는 위에서 확인했던 set uuid를 입력하면 됩니다.

$ export CSET_UUID=7701c988-810e-4603-be15-a122c670975e
$ sudo make-bcache -B  --writeback --cset-uuid $CSET_UUID /dev/sdb2

이렇게 명령을 수행하면 bcache0 장치가 등록되는데, 커널 메세지로 확인이 가능합니다.

bcache: register_cache() registered cache device nvme0n1p3
bcache: register_bdev() registered backing device sdb2
bcache: bch_cached_dev_attach() Caching sdb2 as bcache0 on set 7701c988-810e-4603-be15-a122c670975e

이렇게 생성된 bcache 장치에 파일시스템을 구성 후 mount 하고 사용하면 됩니다.

$ sudo mkfs.ext4 -L BUILD_OUT /dev/bcache0
$ sudo mount /dev/bcache0 /srv/build/out

그리고 용도에 따라서 cache mode를 변경할 수 있습니다.

  • writeback : write 에 대해 cache 가 됩니다. 시스템이 비정상적으로 종료되거나, 갑작스런 전원공급 중단이 발생할 경우 데이터가 유실될 가능성이 있습니다만, 빠른 write속도가 제공됩니다.

  • writethrough: ssd와 hdd에 동시에 write를 합니다.

  • writearound: write cache가 동작하지 않습니다.

아래 2가지 모드에서는 writeback보다 write속도가 떨어지지만, 그만큼 안정성은 올라갑니다. 저장장치의 용도에 따라 적합한 cache mode를 선택해서 사용하면 됩니다.

$ cat /sys/block/bcache0/bcache/cache_mode
writethrough writeback [writearound] none
$ echo writeback | sudo tee /sys/block/bcache0/bcache/cache_mode
writeback
$ cat /sys/block/bcache0/bcache/cache_mode
writethrough [writeback] writearound none

참고: