rkoski Mahdollisesti hyödyllistä tietoa

ZFS:n evaluointia - 1. 1. 2012

Vihdoin tulokset ja johtopäätelmät. Eilen tuli tieto miten paljon blokkitason deduplikoinnilla säästäisi levytilaa. zdb teki töitä yli 40 tuntia sen laskemiseksi. Ilman huippunopeaa SSD-levyä aikaa olisi kulunut moninverroin enemmän. Muistia zdb tarvitsi yli 28 Gt. Analysoitavan tiedostojärjestelmän tiedot zdb luki ja esikäsitteli noin 17 tunnin aikana, jonka jälkeen se ei enää varannut lisää muistia.

Täytyy tunnustaa, että tämä on eräs tyhmimmistä jutuista, joita olen tietokoneella tehnyt. OpenSolaris-koneeni emolevy tukee korkeintaan 4 Gt keskusmuistia ja sen verran sitä jo on. Silti halusin ajaa ohjelmaa, joka vaati 28 Gt muistia. Se oli tietysti hidasta. Toisaalta virheistä oppii ja tämä oli myös mielenkiintoinen kokeilu, miten SSD-levyllä pystyy melko tyydyttävästi jatkamaan keskusmuistia.

Jaarittelut sikseen, zdb:n ja time:n tulosteet:

Simulated DDT histogram:

bucket              allocated                       referenced         
______   ______________________________   ______________________________
refcnt   blocks   LSIZE   PSIZE   DSIZE   blocks   LSIZE   PSIZE   DSIZE
------   ------   -----   -----   -----   ------   -----   -----   -----
     1    54.5M   6.75T   6.75T   6.74T    54.5M   6.75T   6.75T   6.74T
     2    2.22M    257G    257G    256G    4.79M    554G    554G    553G
     4    66.6K   5.20G   5.20G   5.21G     323K   25.9G   25.9G   25.9G
     8    15.2K   1.10G   1.10G   1.11G     141K   9.93G   9.93G   9.97G
    16    4.48K    494M    494M    494M    99.7K   10.9G   10.9G   10.9G
    32      309   5.75M   5.75M   6.01M    12.9K    259M    259M    270M
    64      279   26.0M   26.0M   26.0M    20.6K   1.81G   1.81G   1.81G
   128       34    498K    498K    523K    5.68K   78.5M   78.5M   82.8M
   256       14    434K    434K    442K    4.78K    134M    134M    137M
   512        5    148K    148K    150K    3.17K   81.3M   81.3M   83.0M
    1K       12   6.50K   6.50K   17.1K    15.7K   8.53M   8.53M   22.4M
    2K        4      2K      2K   5.27K    9.48K   4.74M   4.74M   12.5M
    1M        1    128K    128K    128K    1.65M    211G    211G    211G
 Total    56.8M   7.01T   7.01T   6.99T    61.6M   7.55T   7.55T   7.53T

dedup = 1.08, compress = 1.00, copies = 1.00, dedup * compress / copies = 1.08


real 40:31:11.9
user    20:58.7
sys   1:00:19.5

Tuloksen saamista ei hidastanut pelkästään keskusmuistin vähyys. Tapaninpäivän myrsky aiheutti sähkökatkoja ja zdb piti käynnistää uudelleen alusta. Vielä senkin jälkeen tuli lyhyt sähkökatko ilmeisesti sähköverkon korjaustöiden takia ja silloin zdb oli ehtinyt tehdä töitä jo 31 tunnin ajan. Tästä suivaantuneena laitoin uudet akut niitä jo jonkin aikaa odottaneeseen UPS:iin ja kytkin OpenSolaris-koneen siihen. Vähän sen jälkeen, kun olin antanut käskyn "nohup time zdb -S tank" ssh-sessiossa, tuli taas lyhyt sähkökatko, mutta silloin siitä ei enää ollut haittaa. Kaiken kaikkiaan vaatimattoman tuloksen saamiseen meni yli 5 päivää.

Deduplikoinnin käyttöä suositellaan, jos sen avulla saadaan levytilan käyttö vähintään puolitettua eli deduplikointisuhde on vähintään kaksi. Testiaineistolla se olisi vain 1,08 ja levytilaa säästyisi 0,5 teraa. Jos kiintolevyjen hinnat olisivat normaalilla tasolla eikä Thaimaan tulvien nostamat, maksaisi 0,5 teraa noin 50 Euroa. Niin pienen summan takia ei kovin suurta vaivaa kannata nähdä tai kärsiä huomattavasta hidastumisesta.

Jos levytilaa kuitenkin haluttaisiin säästää, on muitakin keinoja kuin ZFS:n deduplikointi. Kuten jo tämän kirjoitussarjan ensimmäisessä osassa todettiin, voidaan käyttää myös tiedostotason deduplikointia, joka on käytännössä pakko toteuttaa off-line-tyyppisesti, josta seuraa se etu, että se voidaan käynnistää silloin, kun koneen kuormitus on vähäisintä. Lisäksi samaa keinoa voidaan käyttää myös muissa käyttöjärjestelmissä ja tiedostojärjestelmissä, jotka tukevat kovia linkkejä.


Kovat linkit aiheuttavat tosin pieniä ongelmia tiedostoja kopioitaessa. Jos niitä ei ota huomioon, kirjoittuu useasti linkitetty tiedosto kohteeseen niin monta kertaa kuin siihen on linkkejä. Tavallaan tämä ei ole ongelma, levytilaa vain kuluu enemmän. Toinen ongelma on, että sellaisia ohjelmia, jotka ottavat kovat linkit huomioon, on vähän. Esimerkiksi vakio kopiointikäsky "cp" kopioi tiedostojen sisällön eikä tee kovia linkkejä. rsync on parempi, mutta sekin kopioi ensin tiedostot ja vasta sen jälkeen korvaa useasti linkitetyt kovilla linkeillä (tämä käytös riippuu todennäköisesti versiosta).

Entä sitten tiedostotason deduplikoinnin tilan säästö. Tein jo aikaisemmin siitä laskelman, mutta myös hardlink-ohjelma osaa antaa arvion säästöstä:

# hardlink -cnv /mirrors
Directories 165197
Objects 1799681
IFREG 1495295
Mmaps 549385
Comparisons 30348943
Would link 515368
Would save 294944960512

Säästöä tulisi siis 275 Gt, jos vertaillaan vain tiedostojen sisältöä, ei oikeuksia, omistajuutta tai muita eroja. Jos myös tiedostojen metadatojen pitää olla samoja, antaa tuloksen komento:

# hardlink -nv /mirrors
Directories 97075
Objects 924214
IFREG 737291
Mmaps 302969
Comparisons 344861
Would link 293144
Would save 59131146240

55 Gt on ehdottomasti liian vähän aiheuttamaan mitään toimenpiteitä, eikä edes 275 Gt innosta.


Minkä tyyppiset tiedostot deduplikoituvat parhaiten?

Testiaineistosta lähes 7 Tt on videotiedostoja. Useat ovat TV-lähetyksien tallenteita, myös kaupallisilta kanavilta. Niistä olisi teoriassa poistettavissa esimerkiksi mainosten duplikaatit, mutta ZFS ei siihen pysty. Se missä kohtaa tiedostoa mainos on, on lähes sattumanvarainen eikä se käytännössä koskaan osu blokkirajalle. Sama ongelma on ohjelmien uusinnoissa. Vaikka tallentava kone olisi lähes atomikellon tarkkuudella oikeassa ajassa ntp-palvelimien ansiosta, eivät lähetysajat ole tarkkoja. DVD-levyiltä kopioitujen elokuvien duplikaatit varmaankin deduplikoituisivat, mutta niitä tuskin samaan päähakemistoon kertyy, jos nimeämiskäytäntö on säännönmukainen. Videot eivät siis deduplikoidu.

Musiikkitiedostoista voi sanoa samaa kuin videoista lähes samoin perustein, ne eivät deduplikoidu.

Testiaineistossa oli vielä noin teratavu muita kuin video- ja musiikkitiedostoja. Se koostuu pääasiassa muiden Linux-koneiden ja kiintolevyjen varmuuskopioista. Tämä selittää melko valtaisan tiedostomäärän. Kyseiset hakemistot voisi pakata myös arkistoihin, mutta niin suurten arkistojen käsittely on melko hankalaa. Näiden hakemistopuiden yhteiskoko on 457 Mt ja hardlink sanoi niistä seuraavaa:

[root@rk7 mirrors]# hardlink -cnv laptop c52 fc12 Fedora-10-i386 hda3 hdg1 rk22bak rk22root rk22usrsrc rk22usrsrc2 rk4root rk4usrlocal www.raimokoski.com
Directories 159188
Objects 1712714
IFREG 1417217
Mmaps 536803
Comparisons 30336535
Would link 503470
Would save 93539250176

Säästö olisi 87 Mt eli reilu 20 %. Oikeastaan tämä on varsin hyvin huomioon ottaen sen, että käytetyt Linux-versiot ovat hyvin eri ajoilta. Täytyy kuitenkin todeta, että testiaineistossa ei ole mitään runsaasti deduplikoituvaa kokonaisuutta.


Mitkä sitten olisivat hyvin deduplikoituvia kokonaisuuksia? Jo mainitut varmuuskopiot, mutta enemmän saman sisältöisistä koneista. Vielä parempi esimerkki on chroot-hakemistopuut ja chroot-tyyppisten virtualisointijärjestelmien hakemistopuut. Niissä uniikkia sisältöä voi olla voi olla hyvinkin vähän ja lähes identtisiä hakemistopuita kymmenittäin. Helpoimpia esimerkkejä on rpm-paketti bind-chroot, jossa on jo hyödynnetty kaikki mahdollinen tilansäästö. Fedora 13:n versiossa sen tiedostojen yhteenlaskettu koko on 0 tavua!

# rpm -qi bind-chroot-9.7.0-10.P2.fc13.x86_64
Name        : bind-chroot                  Relocations: /var/named/chroot
Version     : 9.7.0                             Vendor: Fedora Project
Release     : 10.P2.fc13                    Build Date: to 20. toukokuuta 2010 15.07.16
Install Date: la 19. kesäkuuta 2010 16.16.42      Build Host: x86-04.phx2.fedoraproject.org
Group       : System Environment/Daemons    Source RPM: bind-9.7.0-10.P2.fc13.src.rpm
Size        : 0                                License: ISC
...


Miten deduplikoinnin edut saadaan parhaiten käyttöön ja haitat minimoidaan?

Deduplikointi voidaan ottaa käyttöön vain osassa poolia. Komennolla "zpool create .." luodaan samalla poolin (ja zfs:n) juurihakemisto, mutta sen alle voidaan luoda dataset-tyyppisiä hakemistopuita, joiden ominaisuuksista osa voi poiketa juurihakemistosta. Uusi dataset perii oletusominaisuudet joko juuresta tai ylemmältä datasetiltä. Uusi dataset luodaan käskyllä "zfs create <juuri>[/väli-dataset]/<uusi_dataset>" ja esimerkiksi deduplikoinnin käyttöä ohjataan komennolla "zfs set dedup=on|off <dataset>".

Paras käytäntö on siis luoda oma dataset eli alihakemisto joko ei-deduplikoituvalle tai deduplikoituvalle materiaalille tai molemmille ja asettaa dedup-arvo tarpeen mukaan. Lisäksi olisi hyvä etukäteen arvioida melko tarkkaan duduplikoituvan osuuden koko, koska se vaikuttaa rajusti muistivaatimuksiin ja muihin resurssivaatimuksiin, joita edellä olemme nähneet.


Johtopäätelmät

Deduplikointi tarjoaa jotain taianomaista: ilmaista, runsasta ja automaattista säästöä. Tarkemmassa tarkastelussa ilmaisuus kuitenkin häviää hyvin nopeasti eikä automaattisuuskaan ole kovin kaukana käsikäyttöisyydestä. Runsaus on tapauskohtaista ja aika harvinaista.

 

Piditkö tästä kirjoituksesta? Näytä se!

0Suosittele

Kukaan ei vielä ole suositellut tätä kirjoitusta.

NäytäPiilota kommentit (1 kommentti)

Käyttäjän rkoski kuva
Raimo Koski

Deduplikointi oli muutama tai pari vuotta sitten erittäin kova sana tallennuspiireissä. Niihin käsittämättömän kalliisiin systeemeihin EMC:ltä, NetAppilta ja Hitachilta myytiin lisuketta tai uutta softaversiota ja niillä saisi tallennuskustannukset tippumaan merkittävästi ja tämä kiitos maagisen deduplikoinnin. Taisi olla jostain noiden mainosmatskuista kun löysin liukuvablokkisen deduplikoinnin. Se löytäisi ne ei uniikit mainospätkätkin videoista. Voi vain kuvitella miten kalliiksi se tulisi RAM-vaatimusten ja CPU-ajan suhteen, myyntimies harvemmin kertoo.

Deduplikoinnin käsittää, jos käsittää linkin. Linkkejä voi tehdä eri tasoilla. Kova linkki on kai helpoin. Kun tiedosto luodaan, sille tehdään metadataan ensimmäinen linkki. Niitä voi tehdä lisääkin, mutta tiedostoa ei kirjoiteta. Tiedosto poistuu tavallaan, kun linkkejä ei enää ole. Pehmeä linkki on tiedosto, jonka sisältö on linkin kohteen polkunimi. Esim:
[root@rk7 mirrors]# ls -l /usr/bin/awk
lrwxrwxrwx 1 root root 14 19.6.2010 /usr/bin/awk -> ../../bin/gawk
Tiedoston koko on 14 tavua ja merkkijonossa "../../bin/gawk" on 14 merkkiä.

Deduplikoinnilla ei ole suoraa vaikutusta hakunopeuteen, mutta ZFS:ssä se taitaa vähentää hieman metadatan määrää ja sitä kautta haettavaa olisi vähemmän.

Vaikka lopputulokseksi sain sen, että deduplikointi ei olekaan niin hyvä juttu, se oli halpa toteuttaa ZFS:ään. Sen tarvitsemat tarkistussummat lasketaan ja tallennetaan datan integriteetin takaamiseksi, lue http://en.wikipedia.org/wiki/ZFS#Data_Integrity

Tämän blogin suosituimmat

Mainos

Netin kootut tarjoukset ja alennukset