Disk Caching with SSDs on Linux

Olá a todos,

Desde as minha experiência em memory overcommit via swap num SSD tenho estado a investigar mais utilizações de combinação híbrida de SSD’s e discos mecânicos.

Sim, é verdade que já existem discos SSD’s de grande capacidade ou discos mecânicos híbridos. Ambas as opções, a meu ver ainda são demasiado caras.
A somar a isto, muitos de nós fizeram investimentos em armazenamento (alguns dentro de garantia) pelo que deitar fora o que existe não é aceitável.

Com isto em mente, andei a investigar a forma de hibridar um disco mecânico, utilizando para tal um SSD e cheguei a uma tecnologia emergente em Linux (existe equivalente para windows) chamado Bcache.

O bcache é um Linux kernel block layer cache e permite usar o SSD (e a sua velocidade superior) para fornecer cache a um disco mecânico.

No nosso exemplo especifico, iremos utilizar um sistema virtualizado em KVM, com um disco de 16GB em disco SSD (para cache) e um disco virtual de 200GB em disco mecânico:

Disk /dev/vda: 200 GiB, 214748364800 bytes, 419430400 sectors
Disk /dev/vdb: 16 GiB, 17179869184 bytes, 33554432 sectors

Em termos de velocidade testada via hdparm temos antes da configuração utilizando bcache:

HDD: Timing buffered disk reads: 288 MB in  3.00 seconds =  95.99 MB/sec
SSD: Timing buffered disk reads: 552 MB in  3.06 seconds = 180.28 MB/sec

(É importante lembrar que ambos os discos virtuais fazem parte de uma pool de discos que já estão a ser usados por várias máquinas virtuais, pelo que a velocidade pode estar longe da performance mais alta).

Primeiro inicializamos o SSD device (vdb) para responder como a cache:

fvlab03:~ # make-bcache -C /dev/vdb
UUID:            1470a21a-322f-45c7-9e5a-b2db3b3e838d
Set UUID:        456de471-e8fa-475e-bfcc-df2c85328f15

Em seguida o backing device (vda):

fvlab03:~ # make-bcache -B /dev/vda
UUID:            0c5fee8b-b269-4ca9-9e3f-299736bd7206
Set UUID:        0897dc1a-0796-4358-87d1-f96f188c36d5

Após a inicialização dos devices chega a altura de os registar como bcache devices:

root@fvlab03:~# echo /dev/vda  > /sys/fs/bcache/register
root@fvlab03:~# echo /dev/vdb > /sys/fs/bcache/register
root@fvlab03:~# echo 456de471-e8fa-475e-bfcc-df2c85328f15 > /sys/block/bcache0/bcache/attach
root@fvlab03:~# echo writeback > /sys/block/bcache0/bcache/cache_mode

Nota: o novo device criado com a união do SSD com o HDD é o /dev/bcache0 e os echos acima tornam-se persistentes após colocação.

Finalmente podemos testar novamente a velocidade obtida utilizando a configuração em bcache:

fvlab03:~ # hdparm -T /dev/bcache0:  Timing cached reads:   6780 MB in  2.00 seconds = 3391.91 MB/sec

Todos os dados do exemplo aqui apresentado, foram recolhidos dentro de um sistema virtualizado em KVM.
Nada vos impede de efetuar o mesmo, não dentro de um sistema KVM, mas no próprio virtualizador em si.

A alteração irá obrigar a várias alterações (lembrar que o bcache não é block cache dentro de LVM mas sim block cache a devices físicos – layer abaixo – e que a utilização do mesmo obriga sempre a migrações de dados).
No meu caso especifico, irei efetuar isto nos próximos builds de servidores KVM que venha a possuir. Para já e independentemente do piscar de olho que o ganho de velocidade me possa eventualmente fazer, simplesmente não tenho tempo para tal  😉

Abr

Higgs

 

Bibliografia: https://grepular.com/Disk_Caching_with_SSDs_Linux_and_Windows