Linux LVM2 -testausta muistitikuilla
Viikonloppuna hackasin hieman Linuxin LVM2:n kanssa. LVM2 tarkoittaa ”Logical Volume Management version 2” eli loogisia taltioita. LVM2 on korvaamaton työkalu hallitsemaan ns. pinottuja lohkolaitteita. LVM2 mahdollistaa näköisvedokset (snapshot), datan peilauksen (RAID1-10), pysyvän levyvälimuistin ja kryptauksen. Halusin kokeilla, olisiko järkevää käyttää USB3-muistitikkua hitaan kovalevyn pysyvänä välimuistina (lvmcache). Syy tähän kokeiluun oli se, että sain haltuuni käsittämättömän halvat kappaleet SanDisk Ultra 32GB -muistitikkuja. Molemmat maksoivat yhteensä vain 20 euroa. Kumpikin tikku lukee luvatut huimat +100 megatavua sekunnissa, ja tarjous alkoi vaikuttaa liian hyvältä, kunnes testasin tikkujen kirjoitusnopeuden: surkeat 5–30 Mt/s.
En saanut kirjoitusnopeutta paranemaan millään keinolla. Lisäksi huomasin, että tikku on ikävästi FAT32-misoptimoitu eli tikun alussa on noin 2–32 Mt hyvin nopeaa flashmuistia ja loput tikusta on hitaampaa kirjoittaa. Satunnaisluku- ja -kirjoitusnopeudet olivat myös huonot. SanDiskin tikku löi myös heti hanskat pöytään, jos tikun meni osioimaan uudelleen fdiskillä. Kirjoitusnopeus putosi alle puoleen alkuperäisestä, kun tein näin. Lisäksi mikäli ensimmäisellä osiolla ei ollut oikeaa FAT32-tiedostojärjestelmää, nopeus kärsi myös hieman.
Olen ottanut tavaksi testata kaikki USB-muistitikut ja SD-muistikortit Linuxilla flashbench- sekä dd-ohjelmalla. Flashbench auttaa löytämään kokeellisesti flashmuistien erase-block- koon sekä sen, kuinka monta Allocation Groupia voi olla auki yhtaikaa. Tarkemmin asiasta löytyy osoitteesta https://wiki.linaro.org/WorkingGroups/KernelArchived/Projects/FlashCardSurvey
Käytännössä flashmuistit pystyvät oikeasti kirjoittamaan nopeasti vain erase-block-kokoja, mikä on kahdesta kahdeksaan megatavun luokkaa.
Varsinainen LVM2-cachen luonti on varsin helppo operaatio, kun tiedostojärjestelmä on jo valmiina LVM2:n päällä. Koska USB-tikkuja on kaksi, ajattelin kokeilla myös LVM2-raid0- tilaan tällä kertaa, jotta välimuistin nopeus paranisi hieman.
USB3-RAID0 luodaan seuraavasti. Ensin tavalliset USB-tikkujen osiot alustetaan LVM2- fyysisiksi taltioiksi:
# pvcreate alustaa osion LVM2 fyysiseksi taltioksi ja tuhoaa kaiken datan osiolta.
pvcreate /dev/sde1 /dev/sdf1
# vgextend lisää fys-taltiot voluumiryhmän ’vghyper’ nippuun.
vgextend vghyper /dev/sde1 /dev/sdf1
Ole siis erittäin tarkkana, mitä annat pvcreatelle argumentiksi. Voit tarkistaa, että kirjoitat oikean lohkolaitteen lsblk-komennolla.
lvcreate on laaja komento joka luo loogisia taltioita. –type määrittää, mitä joukkoa LVM2:n () toiminoista käytetään: tässä tapauksessa raid0. Ensimmäiseksi luodaan pieni raid0 usb3CacheMeta -taltio ja toinen suurempi usb3Cache alla olevilla komennoilla. -stripesize-optio on hyvin tärkeä: 2 M:n blokki koko saatiin testaamalla flashbenchilla sekä muutamalla kokeiluyrityksellä. Eli kun raid0-pakkaan kirjoitetaan tai luetaan, vaihdetaan levyä 2 Mt:n välein.
lvcreate –-type raid0 –-stripes 2 –-stripesize 2M -L32M -n usb3CacheMeta vghyper /dev/sde1 /dev/sdf1
# lopuksi varsinainen radi0 cache-data ’usb3Cache’ taltio:
lvcreate –-type raid0 –-stripes 2 –-stripesize 2M -L8G -n usb3Cache vghyper /dev/sde1 /dev/sdf1
Tässä vaiheessa on hyvä testata dd-ohjelmalla usb3-raid0 /dev/mapper/vghyper-usb3Cache-taltion nopeutta, että kaikki toimii OK.
dd if=/dev/zero of=/dev/mapper/vghyper-usb3Cache bs=4M status=progress
dd:n antoi noin +35 Mt/s kirjoitusnopeudeksi, mikä tarkoittaa että USB3-RAID0 toimii. Vaihtamalla if=/dev/mapper/vghyper-usbCache ja of=/dev/null lukunopeus oli noin +200Mt/s luokkaa.
Varsinainen pysyvän levyvälimuistin toteuttaminen on vain kaksi komentoa:
lvconvert –-type cache-pool –poolmetadata vghyper/usb3CacheMeta vghyper/usb3Cache
lvconvert –-type cache –-cachepool vghyper/usb3Cache vghyper/ArchDataTwo
Ensimmäinen komento luo itse LVM2-cachen ja toinen linkittää usb3Cachen ArchDataTwo taltioon. Ihmeellisintä tässä on se, että Linuxin LVM2 sallii vghyper/ArchDataTwo-taltion olevan käytössä, kun kyseiset komennot ajetaan – ei tarvitse irrottaa taltioita tai käynnistää uudelleen konetta.
LVM2-levyvälimuistin liittäminen taltioon ei näy heti. Kestää jonkun aikaa riippuen siitä, kuinka paljon taltiolta luetaan tai kirjoitetaan, että data päätyy LVM2-levyvälimuistiin. Lisäksi USB-tikkujen ongelmana on surkea kirjoitusnopeus, joten lvmcache saattaa jättää datan levylle tai välimuisti voi itse asiassa jopa hidastaa järjestelmää, kuten tässä tarinassa kävi. Huomasin lisäksi, että cachetetulle ArchDataTwo-osiolle kirjoitettaessa saattoi järjestelmä ajoittain pysähtyä kokonaan odottamaan USB3-tikkujen tokenemista.
Kokeilin myös nopeuttaa datan päätymistä välimuistiin komennolla:
dmsetup message /dev/mapper/vghyper-ArchDataTwo 0 migration_threshold 32
Oikeasti LVM2-levyvälimuisti luodaan sisäiselle SSD-levypakalle, joka on vähintään raid1-peilattu ja lvconvert-komennolle annetaan lisäparametri ”–cachemode writeback”
LVM2 + ArchLinux myös muistaa tämän kokoonpanon ja USB3+LVM2+RAID0+Cache+Data-laitepino kasataan seuraavan käynnistyksen yhteydessä automaattisesti.