Obsolete English site
Uutiset
Linux - Tehokas hallinta -kirjan tukisivu
Vanha sivusto


Esipuhe

ZFS eli Zettabyte File System on 128-bittisenä käsittämättömän skaalautuva. Linuxin vakiotiedostojärjestelmässä ext4:ssä raja on surkea 16 Tt. ZFS:ssä kiinnostaa se, ettei se lopu kesken ja lisäksi sen muut hienot ominaisuudet, kuten deduplikointi.

Tämä kirjoitus on koottu Uuden Suomen vapaavuoro-blogiin kirjoittamistani jutuista. Tekstiä ei ole juurikaan muutettu, mutta järjestystä on muutettu loogisemmaksi. Osa eroista johtuu siitä, että vapaavuorossa on rajoitetut keinot käyttää esimerkiksi otsikkotasoja ja sijoitella kuvia.

Otsikoiden jälkeen usein esiintyvä päiväys tarkoittaa alkuperäistä julkaisupäivämäärää.



ZFS:n dokumentointi

12. 2011

Tänään arvioin ZFS:n dokumentointia käyttäen esimerkkinä kysymystä: onko deduplikointi järkevää, jos se voi hidastaa levylle kirjoitusta dramaattisesti.

Olen jo aikaisemmin kertonut, että olen tehnyt samantapaista ZFS:n testausta ennenkin. Silloin deduplikoinnin käyttö alkoi hidastaa ZFS:n toimintaa lähes eksponentiaalisesti, kun oltiin ylitetty tietty levyn täyttöaste.

Ensin ajattelin kirjoittaa OpenSolarikseen ja erityisesti ZFS:ään liittyvästä dokumentaatiosta. Kehuin jo wikipedian ZFS-artikkelia ( http://en.wikipedia.org/wiki/ZFS#Deduplication ) ja ajattelin, että juuri tuo deduplikoinnin muistivaatimusta koskeva kysymys olisi hyvä pistokoe vertailla dokumentaatiota.

Niinhän se olikin. 310-sivuisessa kirjassa Oracle Solaris Administration: ZFS File Systems ( http://docs.oracle.com/cd/E23824_01/html/821-1448/index.html ) asia kyllä kerrotaan ( http://docs.oracle.com/cd/E23824_01/html/821-1448/gazss.html#gjhav ), mutta melko koukeroisesti eikä anneta selkeää esimerkkiä tai nyrkkisääntöä, kuten wikipedian artikkelissa. Wikipedian artikkelissa deduplikoinnin kohdalla oli myös viitteitä. Seurasin niitä ja ketju Summary: Dedup memory and performance (again, again) ( http://mail.opensolaris.org/pipermail/zfs-discuss/2011-July/049209.html ) zfs-discuss-postituslistalla antaa aika synkän kuvan deduplikoinnin vaikutuksesta suorituskykyyn. Edes runsas keskusmuisti ei riitä ja vaikka sitä olisi, pitää OpenSolariksen ytimen asetuksia muokata debuggerilla. OpenSolariksessa ei ole Linuxin tapaan /proc-tiedostojärjestelmää, jota kautta ytimen asetuksia voi tarkistaa ja muuttaa, joten aika hurjalta tuo näyttää. Ohje sivulla http://mail.opensolaris.org/pipermail/zfs-discuss/2011-May/048244.html ja testinä nykyisen arvon tarkistus:


root@rk6:~# echo "::arc" | mdb -k | grep meta_limit
arc_meta_limit            =       766 MB


Postituslistojen lukeminen jätti minut lähinnä hämmentyneeksi. SSD-levyn lisääminen cache-laitteeksi auttaisi, samoin ytimen asetusten säätö. Oraclen dokumentaatiosta löytyi kuitenkin tapa lähestyä samaa ongelmaa toiselta suunnalta. Komento:


root@rk6:~# zdb -S tank
Simulated DDT histogram:

bucket              allocated                       referenced         
______   ______________________________   ______________________________
refcnt   blocks   LSIZE   PSIZE   DSIZE   blocks   LSIZE   PSIZE   DSIZE
------   ------   -----   -----   -----   ------   -----   -----   -----
  512K        1    128K    128K    128K     640K     80G     80G   79.8G
 Total        1    128K    128K    128K     640K     80G     80G   79.8G

dedup = 655360.00, compress = 1.00, copies = 1.00, dedup * compress / copies = 656943.82


kertoo kuinka paljon tilaa voitaisiin säästää, jos olisi käytetty deduplikointia ja/tai pakkausta ja kuinka paljon tiedoston ylimääräisten kopioiden tallennus sitä lisää. Yllä oleva tulos kertoo huikeasta säästöstä. Kaksi pelkkiä nollia sisältävää 40 Gt kokoista tiedostoa ei veisi juuri yhtään levytilaa, jos deduplikointi olisi käytössä.

Palataan dokumentoinnin arviointiin. Sivulla http://docs.oracle.com/cd/E23824_01/html/821-1448/gaypw.html#gfxtd on lause "Cache devices cannot be mirrored or be part of a RAID-Z configuration.", jonka voisi tulkita niin, että raidz-pooliin ei voi lisätä cache-laitetta. http://www.solarisinternals.com/wiki/index.php/ZFS_Best_Practices_Guide#... kuitenkin rauhoittaa: "it is not possible to mirror or use raidz on cache devices, nor is it necessary. If a cache device fails, the data will simply be read from the main pool storage devices instead."

Minun mielestäni wikipedian ZFS-sivu on paras. Se on melko lyhyt, mutta se kertoo olennaisen selkeästi. Sivustolla http://www.solarisinternals.com/wiki/index.php/Solaris_Internals_and_Per... on useita wiki-tyyppisiä ZFS:ää käsitteleviä oppaita. Minun tuntumani on, että sekin olisi parempi kuin Oraclen oma dokumentointi. Syvällisintä tietoa löytyy kuitenkin Oraclen työntekijöiden blogeista, kuten http://blogs.oracle.com/roch/entry/dedup_performance_considerations1 .

ZFS kyllä, mutta mikä käyttöjärjestelmä?

20.12. 2011

ZFS:ää voisi käyttää Linuxissakin, mutta Solaris on tullut tutuksi työelämässä ja OpenSolariksessa on muitakin hyviä ominaisuuksia. OpenSolariksesta ei kuitenkaan tule enää uusia versioita. Entä Oracle Solaris Express tai OpenIndiana tai sittenkin Debianin ja Illumosin ytimen yhdistävät Nexentastor ja Illumian?

Solariksen ehkä suosituin ominaisuus on virtualisointitekniikka, josta käytetään nimitystä zones ja aiemmin containers. Se on kaikkein tehokkain virtualisointitapa, koska se ei oikeastaan ole virtualisointia vaan vahvistettu chroot. Kaikki "virtuaalikoneet" käyttävät samaa ydintä, mutta eivät näe muiden muisti- ja prosessiavaruutta. Erikoistapauksena ovat ns. branded zones ja yksi niistä on Linux. OpenSolariksessa (en tiedä, onko sama mahdollista Solariksessa ja missä versiossa) on emulointikerros, jonka avulla sen ydin näyttää Linuxin ytimeltä. Varsin vahva ominaisuus siis.

Täytyy kuitenkin heti huomauttaa, että zones on jo vanha tekniikka ja vastaavia löytyy muillekin käyttöjärjestelmille. BSD:n jails pitäisi olla samanlainen ja Linuxille kaupallinen Parallels Virtuozzo Containers tai sen ilmaisversio OpenVZ. Wikipedian sivu  http://en.wikipedia.org/wiki/Operating_system-level_virtualization listaa luultavasti kaikki.

Crossbow on tavallaan virtualisoinnin jatke. Se on virtuaalinen verkkoympäristö. Sen avulla voi yhdessä koneessa rakentaa lähiverkon virtuaalikoneiden ja virtuaalikytkinten avulla.

ZFS:n deduplikointi sopii erittäin hyvin yhteen tämän tapaisen virtualisoinnin kanssa. Virtuaalikoneiden hakemistot pitää vain laittaa samaan levypooliin, jotta deduplikointi toimisi.

No, tarkastellaan eri käyttöjärjestelmävaihtoehtoja. Oracle Solaris Expressissä kiinnostavin on lisenssiehdot. Kun niitä etsii huomaa, että Oracle Solaris Expressiä ei enää mainita erillisenä tuotteena. Se on Oracle Solaris 11 sovelluskehittäjille tarkoitetulla OTN-lisenssillä: http://www.oracle.com/technetwork/licenses/solaris-cluster-express-licen... , jonka keskeisin kohta on:

"LICENSE RIGHTS
Except for any included software package or file that is licensed to you by Oracle under different license terms, we grant you a perpetual (unless terminated as provided in this agreement), nonexclusive, nontransferable, limited License to use the Programs only for the purpose of developing, testing, prototyping and demonstrating your applications, and not for any other purpose."

Tosin muualla lisätään ( http://www.oracle.com/technetwork/indexes/downloads/index.html#servers ):
"Developers:
All software downloads are free, and most come with a Developer License that allows you to use full versions of the products at no charge while developing and prototyping your applications, or for strictly self-educational purposes."

Huomaa lisäys "or for strictly self-educational purposes." Ehkä minun käyttötarkoitukseni laajasti tai vapaasti määritellen voisi käsittää täyttävän lisenssiehdot, mutta kun vaihtoehtoja on, jätän väliin. Tuote on kuitenkin ladattavissa sivulla http://www.oracle.com/technetwork/server-storage/solaris11/downloads/ind... , jos hyväksyy lisenssiehdot.

OpenIndianasta ei ole vielä valmista versiota. Tällä hetkellä uusin kehitysversio on 151a. Se on jaettu Desktop- ja Server-versioihin ja molemmat voi ladata sivun http://openindiana.org/ kautta. Desktop-version arvostelu löytyy sivulta http://www.linuxbsdos.com/2011/10/15/openindiana-151a-desktop-review/ . Vakaa versio on luvattu vielä tämän vuoden aikana eli ihan pian :)

OpenIndianan suurin uutuus on KVM, joka voi olla tuttu Linuxista. Se on "aito" virtualisointituote, jolla voi ajaa esimerkiksi Windowsia. Kuitenkaan aivan kaikkea toiminnallisuutta, joka on OpenSolariksessa, ei vielä ole valmiina OpenIndianan käyttämässä illumos-projektin tuottamassa ytimessä. Ei siis vielä ehkä kannata päivittää. Päivitysohjeet OpenSolariksesta OpenIndianaan löytyvät ( http://wiki.openindiana.org/oi/Upgrading+from+OpenSolaris ) ja niiden perusteella voisin vaihtaa OpenSolariksen käyttämän pkg-paketinhallintajärjestelmän ohjelmalähteeksi OpenIndianan ylläpitämän OpenSolaris snv_134 dev repositoryn. Oracle ei nimittäin enää tarjoa alkuperäistä, joten sieltä en voi asentaa lisäohjelmia OpenSolarikseen.

Johtopäätös on, että odotan vähintään vakaata OpenIndianan versiota ja tarkistan puuttuuko illumosin ytimestä tärkeitä ominaisuuksia.

Entä sitten NexentaStor ( http://www.nexentastor.org/ )? Suurimmat syyt minulle, miksi ei, ovat ilmaisen version 18 Tt kokorajoitus levytilalle, Debian-pohjaisuus ja tuotteen rajoittuneisuus yleensä. Sen verran olen tutustunut NextentaStorin dokumentaatioon, että voin sanoa sen käytön näyttävän helpolta. Jos haluaisin vain luotettavaa tallennustilaa, 18 Tt riittäisi enkä välittäisi tutustua aiheeseen syvemmin, valitsisin sen. En kuitenkaan halua luopua säätämisen hauskuudesta, joten ei.

Illumian on myös Nexentan projekti, joka ilmeisesti korvaa Nexenta Coren, joka on täysi käyttöjärjestelmä eikä pelkkä "storage appliancen" rajoitettu käyttöjärjestelmä kuten NexentaStor. Asensin kerran NexentaStorin ja ymmärsin käyttäjän pääsevän vain virtuaalikoneelle, ei "hardware noodiin" tai "global zonelle". Illumian ei ole julkaissut vielä mitään.



Laitteistosta – Kotelot, SATA/SAS-adapterit, port multiplier, SAS expander

12. 2011

ZFS antaa mahdollisuuden yhdistää vaikka kuinka monta levyä, mutta jossain vaiheessa fyysiset rajat tulevat vastaan. Tavalliseen täysimittaiseen tornikoteloon saa mahtumaan 12 kiintolevyä ilman kikkailua, mutta suunnilleen samankokoiseen koteloon on saatu mahtumaan jopa 48 kappaletta isoja 3,5 tuuman levyjä.

Konesaleissa kiintolevyt ovat perinteisesti olleet kelkassa, joka on ulosvedettävissä laitteen etuosassa. Sen tyyppiseen 4U korkuiseen räkkikoteloon mahtuu 24 isoa levyä. Sun esitteli kuitenkin vuonna 2007 toisen tyyppisen 4U kotelon, jossa levyt "tiputettiin" pystyssä kotelon päältä. Tietokoneen jutussa http://www.tietokone.fi/lehti/tietokone_4_2007/sun_fire_x4500_1352 väitettiin virheellisesti kotelon korkeuden olevan 2U. Siihen mahtui peräti 48 levyä. Tallennustilaa verkossa myyvä Backblaze suunnitteli saman tyyppisen kotelon ja julkisti sen piirustukset ohjeineen syksyllä 2009. Nyt siitä on julkaistu jo toinen paranneltu versio http://blog.backblaze.com/2011/07/20/petabytes-on-a-budget-v2-0revealing... . Pari vuotta sitten Sunin "Stomper" oli saanut muitakin matkivia seuraajia. Konesaleissa tila on kallista ja mitä pienempään tilaan levyt saadaan ahdettua, sitä edullisemmaksi se tulee. Tällä hetkellä päältä ladattavat kotelot ovat kuitenkin lähes kaikki hävinneet ja niiden tilalle on tulleet kotelot, joissa levykelkat ovat sekä edessä että takana. Supermicron SuperChassis 847E26-R1400UB:n ( http://www.supermicro.nl/products/chassis/4U/847/SC847E26-R1400U.cfm ) tyyppiset kotelot, joissa takaosan pinnasta puolet on varattu levykelkoille tulivat kuitenkin ensin. Niihin mahtui 36 kiintolevyä. Uudempaan SuperChassis 847E26-RJBOD1:een ( http://www.supermicro.nl/products/chassis/4U/847/SC847E26-RJBOD1.cfm ) on taakse jätetty kolmen levykelkan verran tilaa virtalähteille, joten levymäärä kasvoi 45:een. Päältä ladattava kotelo on sen takia hankala, että sen pitää olla kiskoilla ja tukevilla sellaisilla, koska esimerkiksi täyteen ladattu Backblaze painaa lähes 70 kiloa. Kiskot taas edellyttävät, että johdoissa on liikkumavaraa.

Ensimmäinen Backblazen ohjeiden mukaan itselleen koonnut oli harrastelija, jonka "Extreme Media Server" korvasi neljä aikaisempaa levypalvelinta. Backblazen avulla hän pystyy katsomaan 16:tta videota samaan aikaan! ( http://blog.backblaze.com/2009/10/12/user-builds-extreme-media-server-ba... ). Harrastelijoille on kuitenkin tarjolla kaikenlaista erilaista ulkoista koteloa ja kotelon lisuketta, kuten kehikkoja, joihin mahtuu lappeellaan neljä kiintolevyä ja kehikko taas mahtuu kolmeen 5 1/4" leveään levypaikkaan. Sillä saa yhden levypaikan lisää!

Backblazessa se ongelma, että moniporttiset SATA-adapterit ovat hävyttömän hintaisia ja halvempia käytettäessä lisäkorttipaikat loppuvat kesken, on ratkaistu kayttämällä port multiplier -piirejä. Moniporttiset SATA-adaperit ovat myös usein RAID-kortteja, joka taas ZFS:ää käytettäessä on täysin turha ominaisuus. Port multiplier -piirien avulla yhteen SATA-porttiin voidaan liittää Backblazessa 5 SATA-levyä. Jos käytetään SAS-väylää, on vastaava laajennustapa SAS expander. Esimerkiksi Supermicron AOC-USAS2-L8i tukee 63:a laitetta SAS expander -piirien avulla.  Suoraan AOC-USAS2-L8i:hin voidaan kytkeä 8 levyä ja koska se on niin halpa ( http://www.eco-finder.com :ssa alle 1000 Kr eli noin 100 €), kannattaa ennemmin hankkia niitä useampi niin kauan kuin pitkät PCI-e-paikat emolla riittävät. Suoraan kytkemisessä on myös se etu, että useampi levy samassa portissa tukkisi pian väylän. ZFS:n luontivaiheessa ei sentään välittömästi aleta laskea pariteettia, kuten Linuxin pariteetillisiä RAID-tasoja käytettäessä, mutta sille suositellaan viikottaiseksi huoltotoimenpiteeksi scrub-operaatiota, joka vertaa tarkistussummia tallennettuihin tiedostoihin ja tämä operaatio voi olla hyvinkin hidas tukkoisilla väylillä.





Supermicron 8-porttinen SAS-kortti. Suoja/kiinnityspelti, joka näkyisi oikealla, on poistettu, koska se on oikeassa paikassa vain AOC-tyyppisissä koteloissa - Supermicron ikioma standardi. AOC-kortit sopivat silti normaaliin PCI-e-väylään. Vasemmalla on kaksi SFF8087-liitintä. Niihin sopiva kaapeli haarautuu neljäksi normaaliksi SAS/SATA-kaapeliksi. Suomessa ainoa ostospaikka on Damicon Kraa ( http://www.damicon.fi ), mutta itse olen tilannut Ruotsista ( http://eco-finder.com/shop/ ). Kannattaa tilata kaapelit samalla, niitä ei joka paikasta löydy.


10/100-megainen verkkokortti ja AOC-kortti, johon on kiinnitetty toisesta verkkokortista suojapelti. Alla on OpenSolaris-koneen emolevyn manuaali.

Surffaillessa löytyi tieto, että Supermicro USAS2-L8i:lle löytyy suoja/kiinnityspelti, joka sopii tavalliseen PC-koteloon. Hinta on vain 1,3 €, mutta postitus maksaa pari kymppiä. Kaupan sivu on http://nz.mouser.com/ProductDetail/Keystone-Electronics/9203/?qs=sGAEpiM... . Onneksi tutkin hieman tarkemmin minkälainen pelti on kyseessä ja huomasin, että se onkin tarkoitettu verkkokorteille. No, minulla on vanhoja 10/100-megaisia verkkokortteja ja 3comin 595:ssa on reiät juuri oikeassa kohdassa ja niitä löysin heti kaksi kappaletta. Ainoa ongelma oli, että se kieleke, johon ruuvi kiinnitetään oli noin millin verran liian lyhyt, mutta se sai taivuttamalla pidemmäksi. Leatherman vyöllä on käytännöllisen nörtin eräs tuntomerkki.


Jos olet jatkanut lukemista tänne asti, tiedät varmaan jo miten tärkeää kunnollinen jäähdytys ja riittävän iso virtalähde ovat, joten ei niistä enempää.

ZFS:n suorituskyvyn säätö

12. 2011

ZFS:n suorituskykyä voi säätää ja parantaa monin tavoin. Tänään esittelen niitä ja niistä löytyvää dokumentaatiota, mutta en esitä vielä mittaustuloksia.

Yleensä ZFS:n säätämisen sanotaan olevan vahingollista, mutta nyt siltä vaaditaan vain tietyntyyppistä suorituskykyä usean päivän ajan. Kopioinnin tultua valmiiksi, säädöt voidaan palauttaa oletuksiin.

Paras kirjoitus aiheesta, jonka löysin on http://constantin.glez.de/blog/2010/04/ten-ways-easily-improve-oracle-so... . Ensimmäiset ja tärkeimmät kolme ohjetta ovat 1. Lisää keskusmuistia, 2 Lisää keskusmuistia, 3. Lisää keskusmuistia. Levylle kirjoituksen nopeuteen keskusmuistin määrällä on kuitenkin hyvin vähäinen vaikutus. Kirjoituksessa viitataan perl-skriptiin ( http://www.cuddletech.com/arc_summary.pl ), jolla saa koosteen välimuistin tehokkuudesta:


root@rk6:~# ./arc_summary.pl
System Memory:
         Physical RAM:  4087 MB
         Free Memory :  442 MB
         LotsFree:      63 MB

ZFS Tunables (/etc/system):

ARC Size:
         Current Size:             1131 MB (arcsize)
         Target Size (Adaptive):   1511 MB (c)
         Min Size (Hard Limit):    383 MB (zfs_arc_min)
         Max Size (Hard Limit):    3065 MB (zfs_arc_max)

ARC Size Breakdown:
         Most Recently Used Cache Size:          84%    1284 MB (p)
         Most Frequently Used Cache Size:        15%    227 MB (c-p)

ARC Efficency:
         Cache Access Total:             125933583
         Cache Hit Ratio:      95%       119676699      [Defined State for buffer]
         Cache Miss Ratio:      4%       6256884        [Undefined State for Buffer]
         REAL Hit Ratio:       89%       112380122      [MRU/MFU Hits Only]

         Data Demand   Efficiency:    99%
         Data Prefetch Efficiency:    55%

        CACHE HITS BY CACHE LIST:
          Anon:                        5%        6626703                [ New Customer, First Cache Hit ]
          Most Recently Used:          9%        11756017 (mru)         [ Return Customer ]
          Most Frequently Used:       84%        100624105 (mfu)        [ Frequent Customer ]
          Most Recently Used Ghost:    0%        313300 (mru_ghost)     [ Return Customer Evicted, Now Back ]
          Most Frequently Used Ghost:  0%        356574 (mfu_ghost)     [ Frequent Customer Evicted, Now Back ]
        CACHE HITS BY DATA TYPE:
          Demand Data:                82%        98388052
          Prefetch Data:               5%        7041894
          Demand Metadata:            11%        13881029
          Prefetch Metadata:           0%        365724
        CACHE MISSES BY DATA TYPE:
          Demand Data:                 1%        88580
          Prefetch Data:              88%        5547588
          Demand Metadata:             8%        559729
          Prefetch Metadata:           0%        60987
---------------------------------------------


Tärkeimmät arvot ovat "Most Recently Used Ghost" ja "Most Frequently Used Ghost". Ne kertovat kuinka usein välimuistista on etsitty tietoa, joka on jo poistettu muistin vähyyden takia. Yllä olevasta tulostuksesta voidaan päätellä, että nyt ei muistin lisäämisellä olisi parannettu nopeutta käytännössä yhtään.

Toinen työkalu, jolla voi seurata juuri sen hetkistä välimuistin suoriutumista on http://blogs.oracle.com/realneel/entry/zfs_arc_statistics . arc_summary kertoo tilastot viimeisimmän käynnistyskerran jälkeen ja jos siitä on jo kauan aikaa, ne voivat olla melko hyödyttömiä.

Vasta kirjoituksen loppuosasta ( http://constantin.glez.de/blog/2010/04/ten-ways-easily-improve-oracle-so... ) löytyi asetuksia, jotka eivät vaatineet muutoksia laitekokoonpanoon. Komennolla:


root@rk6:/tank/mirrors# zfs set primarycache=metadata tank


Säädetään keskusmuistia käyttävää ensisijaista välimuistia niin, että se ei tallenna tiedostojen sisältöä lainkaan, vaan metadataa. Jos levyoperaatiot ovat pelkkää kirjoittamista, tämä on järkevää, mutta normaalitilanteessa näin ei kannata tehdä kuin keskusmuistin vähyyden takia. Koska nyt muistista ei ollut pulaa, oli säätö lähinnä varotoimenpide.

Toinen asetus, jolla jo todennäköisesti oli pienehköä vaikutusta oli:


root@rk6:~# zfs set logbias=throughput tank


Tämä asetus pyrkii ryhmittämään useampien tiedostojen kirjaamista lokiin, jotta ne yhdessä käsiteltäisiin nopeammin. Toisella arvolla, "latency" yksittäinen tiedosto käsitellään mahdollisimman nopeasti, mutta keskimääräinen nopeus kärsii.

Lopuksi vielä yksi hieman hankalampi kirjoitusnopeutta lisäävä muutos. http://constantin.glez.de/blog/2010/04/ten-ways-easily-improve-oracle-so... kertoo vain osan tarinasta. ZIL eli Zfs Intention Log voidaan ottaa myös kokonaan pois käytöstä. Se vaatii kuitenkin uudelleenkäynnistystä eikä se muutenkaan ole suositeltavaa. Se on kuin ottaisi journaloinnin pois käytöstä. Ihan näin rajuun operaatioon en ollut valmis. Yksi mahdollisuus olisi ollut käyttää uutta SSD-levyä, jonka olin tilannut toissijaiseksi lukuvälimuistiksi ja joka oli jo saapunut. Se ei olisi kuitenkaan voinut olla pysyvä ratkaisu, koska pooliin lisättäessä sekä loki että välimuistilaitteiden pitää olla koko levy, niitä ei voi osioida tai muuten jakaa. Helppo ratkaisu oli käyttää USB-muistitikkua. Minulla sattui olemaan USB 3.0 -liitäntäinen sellainen ja vaikka OpenSolaris-koneessa ei ole USB 3 -portteja, on muistitikku ainakin hieman tavanomaista nopeampi. Suorituskyvyn kannalta kuitenkin tärkeintä on IO-operaatioiden nopeus, IOPS (IO Operations Per second), ei siirtonopeus ja se flash-laitteissa on hyvä.

OpenSolaris tukee hieman huonosti USB-muistitikkuja. Jos sellaisen kytkee Linux-koneessa, käynnistyy automatiikka, joka näyttää uuden laitteen kuvakkeen työpöydällä tai ehkä avaa sen, sen mukaan miten järjestelmä on konfiguroitu. Linuxissa automatiikan taustalla on udev-järjestelmä, joka luo uusille laitteille automaattisesti sopivat laitetiedostot ja loppu riippuu asetuksista. Sen jälkeen, kun USB-tikku on paikalla, sen tiedot näkee komennolla rmformat:


root@rk6:~# rmformat
Looking for devices...
     1. Logical Node: /dev/rdsk/c0t0d0p0
        Physical Node: /pci@0,0/pci1043,815a@2,1/storage@1/disk@0,0
        Connected Device: JetFlash Transcend 8GB    1.00
        Device Type: Removable
        Bus: USB
        Size: 7,5 GB
        Label: <Unknown>
        Access permissions: Medium is not write protected.
     2. Logical Node: /dev/rdsk/c5t1d0p0
        Physical Node: /pci@0,0/pci-ide@6/ide@1/sd@1,0
        Connected Device: TSSTcorp CD/DVDW SH-S162A TS02
        Device Type: DVD Reader/Writer
        Bus: IDE
        Size: <Unknown>
        Label: <Unknown>
        Access permissions: <Unknown>


Jos sen haluaa liittää, on komento (laitetiedosto poimittiin edellisestä listauksesta):


rmmount /dev/rdsk/c0t0d0p0


Liitoskohta syntyy automaattisesti ja tikun sisältöä voi listata:


ls -l /media/Transcend\ 8GB/


Jonka jälkeen liitos poistetaan komennolla:


rmumount /dev/rdsk/c0t0d0p0


ZFS:n loki tarvitsee kokonaisen laitteen, joten yllä olevaa liittämistä ei pitäisi tarvita, mutta jostain syystä tikkua ei voinut heti suoraan ottaa lokilaitteeksi komennolla:


root@rk6:~# zpool add tank log /dev/dsk/c0t0d0p0


Mitään dramaattista kopioinnin nopeutumista en havainnut, mutta nopeutumista kuitenkin. Täytyy vielä mitata tuo myöhemmin.

Deduplikoinnin evaluontia

Ajatus on, että tämä olisi jonkinlainen päiväkirja, mutta keskittyisi vain yhteen aiheeseen. Täydennän kirjoitusta, kun uutta asiaa tulee ja laitan uuden tekstin alkuun päiväyksen. Todennäköisesti jotain kirjoituksista päätyy seuraavaan Linux-kirjaani, mutta ei samassa muodossa. Yritän kertoa välillä sen verran taustaa, että muutkin voivat tätä seurata, jos tekninen tietämys riittää.

Deduplikoinnin taustaa

ZFS:n deduplikointi tapahtuu blokkitasolla. Tiedostojen nimillä ei esimerkiksi ole mitään vaikutusta. Vaihtoehtoinen tapa on tiedostotaso, jolloin tiedoston on oltava kokonaisuudessaan samanlainen. ZFS:n Deduplikointi tehdään on-line. Vaihtoehtoinen tapa on off-line, joka tarkoittaa, että deduplikointi tehdään joko ajastetusti öisin tai viikonloppuisin tai sitä tehdään aina tarvittaessa, kun järjestelmää ei kuormiteta liikaa.

Myös Linuxissa voidaan hyödyntää deduplikointia millä tahansa tiedostojärjestelmällä, joka tukee kovia linkkejä. Siihen on olemassa jo valmis ohjelma, nimeltä hardlink:


NAME
       hardlink - Consolidate duplicate files via hardlinks

SYNOPSIS
       hardlink [-c] [-n] [-v] [-vv] [-h] directory1 [ directory2 ... ]

DESCRIPTION
       This  manual  page  documents  hardlink,  a  program which consolidates
       duplicate files in one or more directories using hardlinks.

       hardlink traverses one or  more  directories  searching  for  duplicate
       files.   When it finds duplicate files, it uses one of them as the mas-
       ter.  It then removes all other duplicates and places  a  hardlink  for
       each  one pointing to the master file.  This allows for conservation of
       disk space where multiple directories on a  single  filesystem  contain
       many duplicate files.

       Since  hard  links  can only span a single filesystem, hardlink is only
       useful when all directories specified are on the same filesystem.

OPTIONS
       -c        Compare only the contents of the files being  considered  for
                 consolidation.   Disregards  permission,  ownership and other
                 differences.

       -n        Do not perform the consolidation; only print  what  would  be
                 changed.

       -v        Print summary after hardlinking.

       -vv       Print  every hardlinked file and bytes saved. Also print sum-
                 mary after hardlinking.

       -h        Show help.

AUTHOR
       hardlink was written by Jakub Jelinek <jakub@redhat.com>.

       Man page written by Brian Long.

       Man page updated by Jindrich Novy <jnovy@redhat.com>


hardlink:in mainetta on pilanneet aikaisemmat viritelmät, jotka eivät ole tarkistaneet, että tiedostojen sisältö on sama. Muistelen erään sellaisen olleen perl-skripti. Jelinekin versio vaikuttaa hyvältä, mutta en kokeile sitä vielä.


Evaluointiympäristön esittelyä


# df
Tiedostojärjestelmä  1K-lohkot  Käytetty   Vapaana Käy% Liitospiste
/dev/md0             15382877564 8019410656 6582160904  55% /mirrors
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 sdi[10](S) sdf[0] sdb[9] sdk[8] sdg[7] sdc[6] sdl[5] sde[4] sdd[3] sdh[2] sdj[1]
      15628115968 blocks level 6, 64k chunk, algorithm 2 [10/10] [UUUUUUUUUU]


RAID-6 pakka, jossa on 11 fyysistä 2 Tt levyä yhden ollessa varalla. Käyttöön jää 8:n levyn kapasiteetti, joka kymmenjärjestelmän teroina on 16 eli juuri hieman alle ext4:n ylärajan.

OpenSolaris SVN 134 -koneessa on lähes identtinen kokoonpano.


Tiedostotasoinen deduplikointi off-linenä Linuxissa ext4-tiedostojärjestelmällä

Haluan saada ensiksi hieman lukuja siitä, miten paljon deduplikointi voisi vapauttaa levytilaa. Haluan myös kontrolloida, miten statistiikkaa generoidaan enkä sen takia käytä hardlink-ohjelmaa. Ensimmäinen vaihe on kerätä md5-summat:


[root@rk7 mirrors]# find . -exec md5sum "{}" >> mirrors.md5sum4 \;


Tässä on pieni ongelma. Jos oletetaan, että levyä käsitellään nopeudella 100 Mt/s, menee komennon suorittamiseen 22 tuntia aikaa. Onneksi olin keväällä tehnyt samanlaisen tiedoston. Tiedostojärjestelmä on sen jälkeen muuttunut melko vähän, joten vanhasta tilanteestakin saadaan melko käyttökelpoisia lukuja. Kun uusi tiedosto valmistuu, sille voidaan tehdä samat operaatiot kuin nyt harjoitellessa.


# ls -lh /mirrors/mirrors.md5sum*
-rw-r--r-- 1 root root 155M  1.5.2011 /mirrors/mirrors.md5sum

# cd /mirrors/
[root@rk7 mirrors]# time sort mirrors.md5sum > mirrors.md5sum.srt

real    0m12.162s
user    0m9.621s
sys     0m0.634s


Tiedoston koko ja sorttausaika ovat sen takia mielenkiintoisia, että ne antavat viitteitä siitä, miten paljon deduplikointi vaatii resursseja. Tässä tiedostossa on tiedostojen md5-summat, ei blokkien. Blokkien md5-summien kokonaiskoko voidaan laskea, mikään työkalu OpenSolariksessa ei tietääkseni sitä kerro. ZFS:n tarkistussumma on 256-bittinen eli 32-tavuinen. Blokkikoko vaihtelee, mutta käytämme maksimia, joka on 128 kt.


# echo | awk '{print 8019410656/128*32/1024/1024/1024" Gt"}'
1.86716 Gt


Tuo on tietysti minimi, ja vain käytetylle levylle. http://en.wikipedia.org/wiki/ZFS#Deduplication sanookin:


Effective use of deduplication requires additional hardware. ZFS designers recommend 2 GB of RAM for every 1 TB of storage. Example: at least 32 GB of memory is recommended for 20 TB of storage. [31] If RAM is lacking, consider adding an SSD as a cache, which will automatically handle the large de-dupe tables. This can speed up de-dupe performance 8x or more. Insufficient physical memory or lack of ZFS cache results in virtual memory thrashing, which lowers performance.


Tuo tarkoittaa kaupassa käyntiä. OpenSolaris-koneessani on vain 4 Gt fyysistä muistia. Corsair SSD Drive 60GB ForceGT SATA III 6Gb/s 555MB/s Read 495MB/s Write pitäisi riittää.


[root@rk7 mirrors]# uniq --check-chars=32 mirrors.md5sum.srt > mirrors.md5sum.unq
# Luotiin uniikkien md5-summien lista
[root@rk7 mirrors]# diff mirrors.md5sum.srt mirrors.md5sum.unq | wc -l
940891


Melkein miljoona samanlaista tiedostoa, mutta kun katsotaan rivejä tarkemmin, eivät ne kaikki olekaan tiedostorivejä.


[root@rk7 mirrors]# diff mirrors.md5sum.srt mirrors.md5sum.unq | head
3d2
< 000028f474c0173a208ca0e3b052521f  ./hda3/var/cache/ccache/d/5/d834c2972ad5db91121b589819f9d7-285692
8,10d5
< 0000acdabe87d48a6fcceccf0d17d6a0  ./hda3/root/Linuxkurssi-3/fc8/firstboot-1
[root@rk7 mirrors]# diff mirrors.md5sum.srt mirrors.md5sum.unq | \

     awk '{if ($1 == "<") {$1="";$2="";print $0}}' > mirrors.md5sum.fls
# tiedostoon tulostettiin vain duplikaattien tiedostonimet
[root@rk7 mirrors]# du --summarize `cat mirrors.md5sum.fls`
bash: /usr/bin/du: Argumenttilista on liian pitkä
[root@rk7 mirrors]# wc -l mirrors.md5sum.fls
630719 mirrors.md5sum.fls
# Tuo oli tiedostojen määrä.
[root@rk7 mirrors]# awk '{sub("^  ","");system("du \""$0"\" >> mirrors.md5sum.fs")}' \
      mirrors.md5sum.fls


Tämä komento on hidas. Awk:ta käytettiin, jotta jokaiselle riville saadaan lainausmerkit, jolloin tiedostonimissä voi olla väliluontejä ja muuta rivoa. Tiedostoon mirrors.md5sum.fs tulostuu sen käyttämä levytila ja tiedostonimi. Seuraavaksi voimme laskea koot yhteen jo käsitellyistä riveistä:


[root@rk7 mirrors]#  awk '{SUM+=$1};END{print SUM/1024/1024" Gt"}' mirrors.md5sum.fs ;  wc -l mirrors.md5sum.fs
735.982 Gt
397883 mirrors.md5sum.fs


Hieman yli puolet käsitelty. Olisiko joku 1,2 Tt mahdollisuus säästää. On se aika paljon 8 terasta. Tänään ei enää enempää voi tehdä..


16. 12. 2011

Kone sai valmiiksi tiedostojen koon laskemisen. Ei ollutkaan niin paljon varaa säästää:


[root@rk7 mirrors]#  awk '{SUM+=$1};END{print SUM/1024/1024" Gt"}' mirrors.md5sum.fs
819.485 Gt


Olin yöllä vielä huomannut, että uusien md5-summien laskeminen ei ollutkaan ihan järkevästi toteutettu. Tapoin vanhan ja uusi etsii vain tiedostoja, niin ei tule herjaa hakemistoista tai rikkinäisistä soft linkeistä, alla uusi:


find . -type f -exec md5sum "{}" >> mirrors.md5sum4 \;


Käynnistin tuon 01:31 ja nyt


#  ls -lh mirrors.md5sum*
-rw-r--r-- 1 root root 155M  1.5.2011 mirrors.md5sum
-rw-r--r-- 1 root root 6,6M 16.12. 07:31 mirrors.md5sum4


Melkein päässälasku, reilu mega tunnissa ja vajaa 150 pitäisi vielä tulla, noin 6 päivää jäljellä. Sitä SSD-levyäkään ei ollut hyllyssä vaan maahantuojan varastossa. Ei taida tapahtua vähään aikaan mitään..

Tarkistetaan kuitenkin, mistä hitaus johtuu, atop auttaa


PRC | sys   7.52s | user  26.00s | #proc    303 | #zombie    1 | #exit      8 |
CPU | sys     63% | user    260% | irq      14% | idle     51% | wait     12% |
cpu | sys     28% | user     67% | irq       2% | idle      4% | cpu000 w  0% |
cpu | sys     14% | user     66% | irq       3% | idle     13% | cpu002 w  5% |
cpu | sys     14% | user     62% | irq       4% | idle     14% | cpu001 w  5% |
cpu | sys      7% | user     64% | irq       6% | idle     20% | cpu003 w  2% |
CPL | avg1   2.56 | avg5    2.81 | avg15   2.84 | csw    98525 | intr   99574 |
MEM | tot    7.8G | free   51.9M | cache 956.8M | buff   66.8M | slab  113.5M |
SWP | tot   14.9G | free   14.7G |              | vmcom  10.2G | vmlim  18.8G |
PAG | scan 704996 | stall      0 |              | swin       0 | swout      0 |
DSK |         sdk | busy     50% | read    4460 | write      5 | avio    1 ms |
DSK |         sdl | busy     49% | read    4339 | write      6 | avio    1 ms |
DSK |         sdf | busy     42% | read    4476 | write      4 | avio    0 ms |
DSK |         sde | busy     40% | read    4472 | write      6 | avio    0 ms |
DSK |         sdb | busy     31% | read    4234 | write      7 | avio    0 ms |
DSK |         sdj | busy     30% | read    4231 | write      4 | avio    0 ms |
DSK |         sdc | busy     20% | read    4465 | write      5 | avio    0 ms |
DSK |         sdh | busy     19% | read    4475 | write      4 | avio    0 ms |
DSK |         sdd | busy     19% | read    4357 | write      4 | avio    0 ms |
DSK |         sdg | busy     19% | read    4259 | write      4 | avio    0 ms |
DSK |         sda | busy      1% | read      35 | write     40 | avio    1 ms |


Yksi ydin on selvästi rasitetuin eli se ajaa md5sum:ia ja levyt ovat korkeintaan puolityöllistettyjä. Ei se kovin suuri homma olisi tehdä ensin tiedostolistaus find:lla ja sitten skripti, joka varaa käsiteltävän tiedoston semafori- eli lukitustiedostolla. Skriptin voisi hyvin käynnistää kolmeen  kertaan. Jää iltaan, pitää käydä lääkärissä ja muuta triviaa..


16. 12. 2011 iltapäivä

Olikin odotettua nopeampaa se md5-summien laskeminen. Suurin osa tiedostoista lukumääräisesti on varmaan mp3:ia. Yli tuhat albumia ja vielä toiseen kertaan piukemmin pakattuna kannettavaa mp3-soitinta varten. Tilaa vievät kuitenkin eniten TV-tallenteet ja kopioidut DVD-levyt, yhteensä melkein 7 teraa.


[root@rk7 mirrors]# du -sh avi/
6,5T    avi/
[root@rk7 mirrors]# find avi -type f | wc -l
10429
[root@rk7 mirrors]# du -sh mp3/
176G    mp3/
[root@rk7 mirrors]# find mp3 -type f | wc -l
63402


No, joka tapauksessa syntyi


-rw-r--r-- 1 root root 163M 16.12. 12:46 mirrors.md5sum4
[root@rk7 mirrors]# wc -l mirrors.md5sum4
1620736 mirrors.md5sum4


Ja sille samat operaation kuin keväällä tehdylle tiedostolle. Ensin kuitenkin selitystä, että miten se noin nopeasti meni:


[root@rk7 mirrors]# hdparm -tT /dev/md0

/dev/md0:
 Timing cached reads:   6914 MB in  2.00 seconds = 3458.65 MB/sec
 Timing buffered disk reads:  994 MB in  3.00 seconds = 330.87 MB/sec


Periaatteessa voisi olla nopeampikin, mutta kun sen SAS-kortin joutui korvaamaan, piti tilalle laittaa yksi PCI-korttikin. Emolla on jo hieman ikää eikä montaa pitkää PCI-e slottia ja useampiporttiset SATA-adapterit hävyttömän kalliita. SAS-adapteriin voi laittaa myös SATA-levyjä, mutta se ei Linuxissa oikein toimi. Jatkossa OpenSolariksessa rääkätään sen verran, että nähdään toimiiko siellä. (kauhea määrä selittelyä..)

Sitten vaan copy pastea, mutta tiedostonimissä pientä eroa:


[root@rk7 mirrors]# time sort mirrors.md5sum4 > mirrors.md5sum4.srt

real    0m12.463s
user    0m10.473s
sys     0m0.464s
# sortataan, jotta uniq toimisi
[root@rk7 mirrors]# uniq --check-chars=32 mirrors.md5sum4.srt > mirrors.md5sum4.unq
# uniikit md5-summat
[root@rk7 mirrors]#  diff mirrors.md5sum4.srt mirrors.md5sum4.unq | \
       awk '{if ($1 == "<") {$1="";$2="";print $0}}' > mirrors.md5sum4.fls
# Duplikaattien tiedostonimet
[root@rk7 mirrors]#  wc -l mirrors.md5sum4.fls
665046 mirrors.md5sum4.fls
# Duplikaattinen määrä
root@rk7 mirrors]# time awk '{sub("^  ","");system("du \""$0"\" >> mirrors.md5sum4.fs")}' \
      mirrors.md5sum4.fls
real    94m17.791s
user    8m0.077s
sys     14m55.389s
# Duplikaattien koot. Ajoaika selvästi lyhyempi kuin eilen, jolloin laskettiin samaan aikaan myös md5-summia.
[root@rk7 mirrors]#  awk '{SUM+=$1};END{print SUM/1024/1024" Gt"}' mirrors.md5sum4.fs
812.031 Gt
# Ja yhteiskoko.


Jatkon osalta suunnitelma on seuraava: Odotan SSD-levyä, jotta koko rsyncillä peilattava mirrors:in kopio voidaan deduplikoida OpenSolariksessa. Nyt tiedetään, miten paljon deduplikoitavaa olisi tiedostotasolla, noin 10 %. En poista duplikaatteja, vaan annan ZFS:n automatiikan hoitaa sen. Blokkitasolla pystyy poistamaan kaikki tiedostotasolla esiintyvät duplikaatit ja sen lisäksi vielä hiukan lisää. Kuinka paljon enemmän, on mielenkiintoista. Ennen SSD-levyn saapumista voisi olla hyvä esitellä OpenSolarikselle annettua laitteistoa ja testata levyjärjestelmän nopeus uudemmalla SAS2-adapterilla. Kiintolevyt ovat SATA-II-tyyppisiä, joten levyjen ja adapterin väli ei nopeudu, mutta väli adapterista PCI-e-väylälle ja eteenpäin voi nopeutua.

Sitten tietysti kopiointi rsyncillä, joka vie ainakin vuorokauden. Nyt tehtyä md5-summatiedostoa voi lisäksi käyttää paranoian lievittämiseksi. Olen jo aikaisemmin yrittänyt samaa, mutta silloin deduplikointi hidasti ihan älyttömästi. Wikipedian ZFS-sivu, http://en.wikipedia.org/wiki/ZFS on todella hyvä. Sunin tai nykyään Oraclen tuottama materiaali on niin laajaa, että sen kahlaamiseen menee paljon aikaa. Lisäksi tärkeää tietoa, kuten missä muissa käyttöjärjestelmissä ZFS toimii, ei Oraclen dokumentaatiosta varmaankaan löydy. Vastaavaa vertailua kuin nyt olen tekemässä, tuskin ainakaan pienellä hakemisella kuitenkaan löytyy.

Aikaisemmalla kerralla rinnakkaisprojektina oli verkon nopeuden lisääminen Ethernet bonding -tekniikalla, mutta kahden koneen väliä en saanut nopeutettua. Se kyllä onnistui, että yksi kone oli "serveri" kolmella yhteensidotulla 1 Gbps kortilla ja kolme "asiakasta" imivät parhaimmillaan yhteensä 2,6 Gbps.



17. 12. 2011

Vilkaistaan OpenSolaris-konetta ja sen levyjä:


root@rk6:~# format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c4d0 <DEFAULT cyl 19454 alt 2 hd 255 sec 63>
          /pci@0,0/pci-ide@6/ide@0/cmdk@0,0
       1. c6t0d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /pci@0,0/pci1043,815a@8/disk@0,0
       2. c6t1d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /pci@0,0/pci1043,815a@8/disk@1,0
       3. c7t0d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /pci@0,0/pci10de,5d@e/pci15d9,a580@0/sd@0,0
       4. c7t1d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /pci@0,0/pci10de,5d@e/pci15d9,a580@0/sd@1,0
       5. c7t2d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /pci@0,0/pci10de,5d@e/pci15d9,a580@0/sd@2,0
       6. c7t3d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /pci@0,0/pci10de,5d@e/pci15d9,a580@0/sd@3,0
       7. c7t4d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /pci@0,0/pci10de,5d@e/pci15d9,a580@0/sd@4,0
       8. c7t5d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /pci@0,0/pci10de,5d@e/pci15d9,a580@0/sd@5,0
       9. c8t1d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /pci@0,0/pci1043,815a@7/disk@1,0
Specify disk (enter its number): ^C


Systeemilevy ja 9 kpl 2-teraisia ja niille on luotu:


root@rk6:/tank# zpool history tank | grep create
2011-04-22.11:20:51 zpool create tank raidz3 c6t0d0 c6t1d0 c7t0d0 c7t1d0 c7t2d0 c7t3d0 c7t4d0 c7t5d0 c8t1d0
2011-04-22.11:21:20 zfs create tank/mirrors
2011-04-22.11:21:28 zfs create tank/mirrors/avi
2011-04-22.11:22:31 zfs create tank/mirrors/mp3


Kolminkertainen pariteetti. Muistaakseni hidasti aika paljon, joten nopeustesteissä ei kannata odottaa liikoja.

/tank on varmaan oletuksilla eikä esim. deduplikointia ole käytössä, mutta tarkistetaan:


zfs get all tank
NAME  PROPERTY               VALUE                        SOURCE
tank  type                   filesystem                   -
tank  creation               pe huhtikuuta 22 11:20 2011  -
tank  used                   7,43T                        -
tank  available              3,36T                        -
tank  referenced             57,9K                        -
tank  compressratio          1.00x                        -
tank  mounted                yes                          -
tank  quota                  none                         default
tank  reservation            none                         default
tank  recordsize             128K                         default
tank  mountpoint             /tank                        default
tank  sharenfs               off                          default
tank  checksum               on                           default
tank  compression            off                          default
tank  atime                  on                           default
tank  devices                on                           default
tank  exec                   on                           default
tank  setuid                 on                           default
tank  readonly               off                          default
tank  zoned                  off                          default
tank  snapdir                hidden                       default
tank  aclmode                groupmask                    default
tank  aclinherit             restricted                   default
tank  canmount               on                           default
tank  shareiscsi             off                          default
tank  xattr                  on                           default
tank  copies                 1                            default
tank  version                4                            -
tank  utf8only               off                          -
tank  normalization          none                         -
tank  casesensitivity        sensitive                    -
tank  vscan                  off                          default
tank  nbmand                 off                          default
tank  sharesmb               off                          default
tank  refquota               none                         default
tank  refreservation         none                         default
tank  primarycache           all                          default
tank  secondarycache         all                          default
tank  usedbysnapshots        0                            -
tank  usedbydataset          57,9K                        -
tank  usedbychildren         7,43T                        -
tank  usedbyrefreservation   0                            -
tank  logbias                latency                      default
tank  dedup                  off                          default
tank  mlslabel               none                         default
tank  com.sun:auto-snapshot  true                         local


Joo, mennään sinne ja testataan kirjoitus- ja lukunopeudet:


root@rk6:/tank/mirrors# cd ..
root@rk6:/tank# sync ; time ( dd if=/dev/zero of=test40G bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 313,683 s, 137 MB/s

real    5m14.170s
user    0m0.128s
sys     1m4.100s
root@rk6:/tank# sync ; time ( dd if=/dev/zero of=test40-2G bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 374,068 s, 115 MB/s

real    6m16.188s
user    0m0.138s
sys     1m3.264s


Kirjoitusnopeuden keskiarvo on 126 Mt/s.


root@rk6:/tank# sync ; time ( dd if=test40G of=/dev/null bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 197,585 s, 217 MB/s

real    3m18.187s
user    0m0.125s
sys     1m15.852s
root@rk6:/tank# sync ; time ( dd if=test40-2G of=/dev/null bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 203,741 s, 211 MB/s

real    3m24.431s
user    0m0.163s
sys     1m20.102s


Lukunopeuden keskiarvo on 214 Mt/s. Nyt kun nopeudet on testattu, voidaan vaihtaa adapteri. Kun kone on käynnistetty uudelleen, on hyvä tarkistaa, miten OpenSolaris näkee levyt:


rk@rk6:~$ su - root
Password:
Sun Microsystems Inc.   SunOS 5.11      snv_134 February 2010
root@rk6:~# format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c4d0 <DEFAULT cyl 19454 alt 2 hd 255 sec 63>
          /pci@0,0/pci-ide@6/ide@0/cmdk@0,0
       1. c6t0d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /pci@0,0/pci1043,815a@8/disk@0,0
       2. c6t1d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /pci@0,0/pci1043,815a@8/disk@1,0
       3. c8t1d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /pci@0,0/pci1043,815a@7/disk@1,0
       4. c12t50024E90049E53C0d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /scsi_vhci/disk@g50024e90049e53c0
       5. c12t50024E90049E5373d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /scsi_vhci/disk@g50024e90049e5373
       6. c12t50024E90049E5393d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /scsi_vhci/disk@g50024e90049e5393
       7. c12t50024E90049E5399d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /scsi_vhci/disk@g50024e90049e5399
       8. c12t50024E90049E5531d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /scsi_vhci/disk@g50024e90049e5531

       9. c12t50024E90049E5533d0 <ATA-SAMSUNG HD204UI-0001-1.82TB>
          /scsi_vhci/disk@g50024e90049e5533
Specify disk (enter its number): ^C


Nyt näkee selvemmin, että 3 kpl isoista levyistä on emolevyn liitännöissä ja SAS2-adapterissa vain 6 kpl, eli kaksi mahtuisi vielä. Tämä sopii hyvin muistaen SSD-levyvalintani, joka oli SATA-3-levy. SAS2:n ja SATA-3:n nopeudet ovat samat eli SSD-levyn nopeus saadaan täysin käyttöön.

Sitten vain samat testit:



root@rk6:~# cd /tank/
root@rk6:/tank#  sync ; time ( dd if=/dev/zero of=test40G bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 254,775 s, 169 MB/s

real    4m22.302s
user    0m0.182s
sys     1m13.054s
root@rk6:/tank#  sync ; time ( dd if=/dev/zero of=test40-2G bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 255,2 s, 168 MB/s

real    4m22.170s
user    0m0.185s
sys     1m10.778s
root@rk6:/tank# sync ; time ( dd if=test40G of=/dev/null bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 167,601 s, 256 MB/s


real    2m47.610s
user    0m0.096s
sys     1m9.250s
root@rk6:/tank#  sync ; time ( dd if=test40-2G of=/dev/null bs=1G count=4096 ; sync )
40+0 records in
40+0 records out
42949672960 bytes (43 GB) copied, 160,6 s, 267 MB/s

real    2m41.112s
user    0m0.002s
sys     1m11.027s


Aika hyvä. Lukunopeuteen n. 20 % lisää ja kirjoitusnopeuteen vielä enemmän.

Luvut ovat itse asiassa yllättävän hyviä. Kyse on raidz3:sta ja lisäksi levytilaa on jo käytetty yli 2/3-osaa ja levyn loppuosan nopeus on tyypillisesti vain puolet alkuosan nopeudesta. Näillä vehkeillä voisi saada reilusti yli 500 Mt/s lukunopeutta tyhjällä RAID-0-tyyppisellä levyllä, mutta katsotaan..



18. 12. 2011


root@rk6:~# zpool destroy tank


11 teran hukkaaminen on varsin nopeaa. Nyt voidaan tarkistaa yksittäisten levyjen kirjoitusnopeus:


root@rk6:~# for i in c6t0d0 c6t1d0 c8t1d0 c12t50024E90049E53C0d0 c12t50024E90049E5373d0 c12t50024E90049E5393d0 c12t50024E90049E5399d0 c12t50024E90049E5531d0 c12t50024E90049E5533d0 ; do sync ; time (dd if=/dev/zero of=/dev/dsk/$i bs=1M count=4096 ; sync ) ; done
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 48,5737 s, 88,4 MB/s

real    0m49.405s
user    0m0.023s
sys     0m14.388s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 50,3224 s, 85,3 MB/s

real    0m51.241s
user    0m0.024s
sys     0m13.862s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 49,0358 s, 87,6 MB/s

real    0m50.002s
user    0m0.025s
sys     0m13.913s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 31,7972 s, 135 MB/s

real    0m31.818s
user    0m0.020s
sys     0m13.402s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 31,6148 s, 136 MB/s

real    0m31.636s
user    0m0.025s
sys     0m14.058s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 31,5836 s, 136 MB/s

real    0m31.605s
user    0m0.021s
sys     0m13.412s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 32,2201 s, 133 MB/s

real    0m32.241s
user    0m0.020s
sys     0m13.261s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 31,2773 s, 137 MB/s

real    0m31.299s
user    0m0.026s
sys     0m14.236s

4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 31,4172 s, 137 MB/s

real    0m31.438s
user    0m0.021s
sys     0m13.514s


Emolevyn liitännät hidastelee. Lukunopeus vielä:


root@rk6:~# for i in c6t0d0 c6t1d0 c8t1d0 c12t50024E90049E53C0d0 c12t50024E90049E5373d0 c12t50024E90049E5393d0 c12t50024E90049E5399d0 c12t50024E90049E5531d0 c12t50024E90049E5533d0 ; do dd  if=/dev/dsk/$i of=/dev/null bs=1M count=4096  ; done
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 31,816 s, 135 MB/s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 31,6488 s, 136 MB/s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 31,693 s, 136 MB/s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 29,5684 s, 145 MB/s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 30,719 s, 140 MB/s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 30,6342 s, 140 MB/s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 32,1607 s, 134 MB/s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 30,6668 s, 140 MB/s
4096+0 records in
4096+0 records out
4294967296 bytes (4,3 GB) copied, 30,7123 s, 140 MB/s


Nyt tuli pieni epäilys. Niin lähellä SATA-1:n maksiminopeutta, että voisiko se rajoittaa. Samsungin speksit sanoo: "Data Transfer Rate / Media to/from Buffer(Max.) - 250MB/sec", mutta googlaamalla löytyy, että muutkin ovat saaneet vain 140 Mt/s tason tuloksia. Levyn pyörimisnopeus on vain 5400 RPM - ei pitäisi lämmetä pahasti ja virtapihi.

Hidastavatko emolevylle liitetyt kokonaisuutta? Katsotaas..


zpool create tank c12t50024E90049E53C0d0 c12t50024E90049E5373d0 c12t50024E90049E5393d0 c12t50024E90049E5399d0 c12t50024E90049E5531d0 c12t50024E90049E5533d0
root@rk6:~# sync ; time (dd if=/dev/zero of=/tank/test40G bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 96,1818 s, 447 MB/s

real    1m36.980s
user    0m0.187s
sys     1m20.047s
root@rk6:~# sync ; time (dd if=/dev/zero of=/tank/test40G-2 bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 92,8227 s, 463 MB/s

real    1m33.711s
user    0m0.188s
sys     1m16.480s
root@rk6:~# dd if=/tank/test40G of=/dev/null bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 89,9848 s, 477 MB/s
root@rk6:~# dd if=/tank/test40G-2 of=/dev/null bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 87,7636 s, 489 MB/s


Sitten taas sileäksi ja yksi emolle liitetty lisää. Käy muuten sekunneissa nuo kaksi ensimmäistä operaatiota.


root@rk6:~# zpool destroy tank
root@rk6:~# zpool create tank c8t1d0 c12t50024E90049E53C0d0 c12t50024E90049E5373d0 c12t50024E90049E5393d0 c12t50024E90049E5399d0 c12t50024E90049E5531d0 c12t50024E90049E5533d0
root@rk6:~# sync ; time (dd if=/dev/zero of=/tank/test40G bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 95,2147 s, 451 MB/s

real    1m35.777s
user    0m0.208s
sys     1m17.020s
root@rk6:~# sync ; time (dd if=/dev/zero of=/tank/test40G-2 bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 95,244 s, 451 MB/s

real    1m35.904s
user    0m0.203s
sys     1m16.810s
root@rk6:~# dd if=/tank/test40G of=/dev/null bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 88,8623 s, 483 MB/s
root@rk6:~# dd if=/tank/test40G-2 of=/dev/null bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 85,859 s, 500 MB/s


Pienoista nopeutumista ehkä. Voi olla, että emonkin kyvyt ovat rajoite. Prosessorina siinä on 2-ytiminen 2,2 GHz Athlon64 4200+. Täysi setti peliin:


root@rk6:~# time zpool destroy tank

real    0m1.093s
user    0m0.004s
sys     0m0.096s
root@rk6:~# time zpool create tank c6t0d0 c6t1d0 c8t1d0 c12t50024E90049E53C0d0 c12t50024E90049E5373d0 c12t50024E90049E5393d0 c12t50024E90049E5399d0 c12t50024E90049E5531d0 c12t50024E90049E5533d0

real    0m5.160s
user    0m0.164s
sys     0m0.687s
root@rk6:~# sync ; time (dd if=/dev/zero of=/tank/test40G bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 97,8711 s, 439 MB/s

real    1m38.371s
user    0m0.205s
sys     1m14.232s
root@rk6:~# sync ; time (dd if=/dev/zero of=/tank/test40G-2 bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 97,4733 s, 441 MB/s

real    1m38.154s
user    0m0.199s
sys     1m14.006s
root@rk6:~# dd if=/tank/test40G of=/dev/null bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 89,9894 s, 477 MB/s
root@rk6:~# dd if=/tank/test40G-2 of=/dev/null bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 87,1675 s, 493 MB/s


Pienoista hidastumista. Melkeinpä veikkaan, että saman tavaran jakaminen useampaan osaan rasittaa sen verran, että emo se on joka on hidaste, Loistavia lukuja silti. Entäs eri raidz-tasot?


root@rk6:~# zpool destroy tank
root@rk6:~# time zpool create tank raidz c6t0d0 c6t1d0 c8t1d0 c12t50024E90049E53C0d0 c12t50024E90049E5373d0 c12t50024E90049E5393d0 c12t50024E90049E5399d0 c12t50024E90049E5531d0 c12t50024E90049E5533d0

real    0m5.362s
user    0m0.164s
sys     0m0.677s


Tässä vaiheessa pysähdytään sen takia, että tarkistetaan, palaako levyjen valo. Ei pala. Linuxissa mdadm:n kanssa palaisi. Melkein vuorokauden. Ei kun eteenpäin.


root@rk6:~# sync ; time (dd if=/dev/zero of=/tank/test40G bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 196,92 s, 218 MB/s

real    3m17.659s
user    0m0.167s
sys     1m7.422s
root@rk6:~#  sync ; time (dd if=/dev/zero of=/tank/test40G-2 bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 198,025 s, 217 MB/s

real    3m18.869s
user    0m0.157s
sys     1m7.614s
root@rk6:~#  dd if=/tank/test40G of=/dev/null bs=1M count=40960

40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 145,183 s, 296 MB/s
root@rk6:~# dd if=/tank/test40G-2 of=/dev/null bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 140,84 s, 305 MB/s


Pariteetin laskeminen ja tarkistaminen tietysti hidastaa. Epämiellyttävän paljon. Entä seuraava taso?


root@rk6:~# zpool destroy tank
root@rk6:~# time zpool create tank raidz2 c6t0d0 c6t1d0 c8t1d0 c12t50024E90049E53C0d0 c12t50024E90049E5373d0 c12t50024E90049E5393d0 c12t50024E90049E5399d0 c12t50024E90049E5531d0 c12t50024E90049E5533d0

real    0m5.292s
user    0m0.165s
sys     0m0.677s
root@rk6:~# sync ; time (dd if=/dev/zero of=/tank/test40G bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 220,58 s, 195 MB/s

real    3m41.502s
user    0m0.170s
sys     1m10.078s
root@rk6:~# sync ; time (dd if=/dev/zero of=/tank/test40G-2 bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 223,302 s, 192 MB/s

real    3m44.439s
user    0m0.179s
sys     1m11.085s
root@rk6:~# dd if=/tank/test40G of=/dev/null bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 162,568 s, 264 MB/s
root@rk6:~# dd if=/tank/test40G-2 of=/dev/null bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 154,673 s, 278 MB/s


Kun pariteetti on kerran laskettu, ei sen tallennus toiseen kertaan enää paljon maksa. Entä kolmas kerta?


root@rk6:~# zpool destroy tank
root@rk6:~# zpool create tank raidz3 c6t0d0 c6t1d0 c8t1d0 c12t50024E90049E53C0d0 c12t50024E90049E5373d0 c12t50024E90049E5393d0 c12t50024E90049E5399d0 c12t50024E90049E5531d0 c12t50024E90049E5533d0
root@rk6:~# sync ; time (dd if=/dev/zero of=/tank/test40G bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 272,916 s, 157 MB/s

real    4m34.261s
user    0m0.180s
sys     1m13.341s
root@rk6:~#  sync ; time (dd if=/dev/zero of=/tank/test40G-2 bs=1M count=40960 ; sync )
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 264,459 s, 162 MB/s

real    4m26.056s
user    0m0.180s
sys     1m11.160s
root@rk6:~#  dd if=/tank/test40G of=/dev/null bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 158,863 s, 270 MB/s
root@rk6:~# dd if=/tank/test40G-2 of=/dev/null bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 152,234 s, 282 MB/s


Nyt onkin sitten mietintämyssyn paikka. Mikä raidz-taso halutaan? Se on selvää, että pariteetti pitää olla. Lukunopeus kaikissa on lähes sama. Ero on alle 10 %. Kirjoitusnopeudella ei ole yhtä paljon väliä. Tämä johtuu siitä, että kirjoitettava data tulee pääasiassa Ethernetin kautta ja vaikka miten olen yrittänyt, ei Ethernet bondingilla ole saanut kahden koneen välistä yhteyttä nopeammaksi.

Yksi tärkeä tekijä, joka tällä kertaa vaikuttaa sopivaan raidz-tasoon on se, kuinka paljon tallennustilaa tarvitaan ja kuinka monta levyä koteloon saa mahtumaan. Oikeastaan minimivaatimus on, että tallennustilaa pitää olla yhtä paljon kuin aiemmin mainitussa Linux-koneessa eli 16 Tt ja koska levyjä on niin paljon alin taso on raidz2. Se tarkoittaa vähintään yhtä lisälevyä. Kotelossa on kuitenkin käytetty kaikki normaalit levyjen ripustuspaikat.

DVD-aseman voisi poistaa ja se olisi kaikkein helpoin ratkaisu. Toinen mahdollisuus olisi siirtää DVD-asema ylimmäksi 5 1/2-tuumaisten osastossa ja kun siellä olevat kiintolevyt ovat jo nytkin vain toisessa reunassa kiinni, niin niiden sivuun mahtuisi yksi pystyyn. Se voisi kuitenkin vaatia askartelua ja jos sille linjalle lähdetään, minulla olisi pari vapaata täystorniakin..

DVD-asema pois ja jos sellaista tarvitaan, USB-liitäntäinen Blu-Ray-asema kiinni.

SSD-levy on 2,5-tuumainen eli läppärin kiintolevyn kokoinen. Se mahtuu vaikka minne ja kuluttaa 0,6 - 2,5 wattia eli ei lämpene. Eikä myöskään tärise, joten kiinnityksen ei tarvitse olla tukeva, kätevä riittää.

Tarvitaan siis yksi 2 Tt kokoinen levy lisää ja se löytyy sieltä Linux-koneelta, jossa saattuu olemaan yksi ylimääräinen (spare). Katsotaas:


[root@rk7 Kuvat]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 sdi[10](S) sdf[0] sdb[9] sdk[8] sdg[7] sdc[6] sdl[5] sde[4] sdd[3] sdh[2] sdj[1]
      15628115968 blocks level 6, 64k chunk, algorithm 2 [10/10] [UUUUUUUUUU]


Spare on sdi, mikä levy?


[root@rk7 Kuvat]# hdparm -i /dev/sdi

/dev/sdi:

 Model=SAMSUNG HD204UI, FwRev=1AQ10001, SerialNo=S2H7J9EZC06046
...


Juuri sopiva. Siellä on useampi tuota mallia, mikä niistä, ei viitsi kaikkia ottaa irti, että näkisi sarjanumeron, idea!


[root@rk7 Kuvat]# hddtemp /dev/sd?
/dev/sda: WDC WD2500JS-00NCB1: 44°C
/dev/sdb: SAMSUNG HD204UI: 29°C
/dev/sdc: Hitachi HDS722020ALA330: 32°C
/dev/sdd: Hitachi HDS722020ALA330: 30°C
/dev/sde: Hitachi HDS722020ALA330: 31°C
/dev/sdf: Hitachi HDS722020ALA330: 31°C
/dev/sdg: WDC WD2001FASS-00W2B0: 40°C
/dev/sdh: Hitachi HDS722020ALA330: 31°C
/dev/sdi: SAMSUNG HD204UI: 36°C
/dev/sdj: SAMSUNG HD204UI: 28°C
/dev/sdk: Hitachi HDS722020ALA330: 39°C
/dev/sdl: Hitachi HDS722020ALA330: 31°C


Sdi on selvästi lämpimin Samsung. Koittamaan niitä sormella ja se löytyi :)
Seuraavaksi tutkimaan voisiko sen ottaa irti konetta sulkematta. Linuxissa on jonkinlainen hot-plug tuki..

19. 12. 2011

Vaikka SSD-levy ei vielä ole saapunut, voin kopioida tiedostot rsync:llä ja simuloida zdb:n avulla, miten paljon tilaa voisi säästää deduplikoinnilla ja pakkauksella. Niitä ei ehkä kannatakaan ottaa käyttöön, jos säästö jää pieneksi. Deduplikoinnista Oraclen dokumentaatio sanoo, että se kannattaa vasta, jos suhdeluku tiedostojen koko jaettuna tarvittavalla tiedostojen koolla on yli 2. Lisäksi on mahdollista käyttää tiedostotason deduplikointia, jolla jo tiedämme saatavan noin 10 % säästön sillä hakemistopuulla, joka on tarkoitus kopioida ZFS:lle. Käynnistetään siis kopionti:


[root@rk7 ~]# time rsync -avH /mirrors /rk6


Se ei kuitenkaan tule valmiiksi tänään. 8 Tt ei siirry gigabitin Ethernetillä hetkessä. Parhaassa tapauksessakin aikaa menee reilu 22 tuntia.

Palataan edellä mainittuun viestiketjuun zfs-discuss-postituslistalla. Myös tiedostojen poistaminen vaikuttaa olevan hidasta ZFS:llä. Ei siitä tällä kertaa enempää kuin hieno ja erikoinen skripti, joka käynnistää jokaiselle poistettavalle tiedostolle oman rm-prosessin. Mitä kaikkea shell-skripteillä voikaan tehdä!


========================
> It seems counter-intuitive - you'd say: concurrent disk access makes
> things only slower - , but it turns out to be true. I'm deleting a
> dozen times faster than before. How completely ridiculous. Thank you :-)

Well, look at it this way: it is not only about singular disk accesses
(i.e. unlike other FSes, you do not in-place modify a directory entry),
with ZFS COW it is about rewriting a tree of block pointers, with any
new writes going into free (unreferenced ATM) disk blocks anyway.

So by hoarding writes you have a chance to reduce mechanical
IOPS required for your tasks. Until you run out of RAM ;)

Just in case it helps, to quickly fire up removals of the specific
directory
after yet another reboot of the box, and not overwhelm it with hundreds
of thousands queued "rm"processes either, I made this script as /bin/RM:

===
#!/bin/sh

SLEEP=10
[ x"$1" != x ] && SLEEP=$1

A=0
# To rm small files: find ... -size -10
find /export/OLD/PATH/TO/REMOVE -type f | while read LINE; do
   du -hs "$LINE"
   rm -f "$LINE" &
   A=$(($A+1))
   [ "$A" -ge 100 ] && ( date; while [ `ps -ef | grep -wc rm` -gt 50 ]; do
      echo "Sleep $SLEEP..."; ps -ef | grep -wc rm ; sleep $SLEEP; ps
-ef | grep -wc rm;
   done
   date ) && A="`ps -ef | grep -wc rm`"
done ; date
===

Essentially, after firing up 100 "rm attempts" it waits for the "rm"
process count to go below 50, then goes on. Sizing may vary
between systems, phase of the moon and computer's attitude.
Sometimes I had 700 processes stacked and processed quickly.
Sometimes it hung on 50...
========================


Tuo tiedostojen poiston hitaus voisi selittää keväiset ongelmani snapshottien poistossa. OpenSolaris-kone oli kesän kylmänä ja vasta äskettäin kokeilin onnistuuko nyt snapshottien poisto. Ei mitään ongelmaa.


21. 12. 2011

Tiedostojen kopionti on edelleen meneillään, 3/4 valmiina. Huomenna hän tulee..

Tuota edellistä lausetta kirjoittaessa minulla oli jo Godot mielessä, mutta sitten tuntemus vahvistui. Laskin, miten nopeasti ZFS-levy täyttyy ja sain tulokseksi vajaa 7 Mt/s. Linux-koneen levyvalo välkähteli hyvin harvoin ja lyhyesti. OpenSolaris-koneessa se taas oli melkein koko ajan päällä. Miten kauan loput reilu pari teraa veisivät? 69 tuntia. (sensuroitu) Nyt säätämään, mutta ensin dokumentointia esiin, löytyi http://www.solarisinternals.com/wiki/index.php/ZFS_Evil_Tuning_Guide#Lim... . Tosin en halua pienentää sitä, vaan suurentaa. Suurennan sitä ensin varovaisesti:


root@rk6:~# history | grep mdb
  438  mdb
  439  man mdb
  440  man mdb
  441  mdb -k | grep meta_limit
  442  echo "::arc" | mdb -k | grep meta_limit
  443  man mdb
  444  echo "::arc" | mdb -k
  470  echo "arc_meta_limit/Z 0x40000000" |  mdb -kw
  471  echo "::arc" |  mdb -k | grep meta_limit
  473  echo "arc_meta_limit/Z 0x50000000" |  mdb -kw
  474  echo "::arc" |  mdb -k | grep meta_limit
  475  echo "arc_meta_limit/Z 0x70000000" |  mdb -kw
  476  echo "::arc" |  mdb -k | grep meta_limit
  479  echo "arc_meta_limit/Z 0x60000000" |  mdb -kw
  481  echo "arc_meta_limit/Z 0x77000000" |  mdb -kw
  482  echo "::arc" |  mdb -k | grep meta_limit
  484  echo "arc_meta_limit/Z 0x90000000" |  mdb -kw
  485  echo "::arc" |  mdb -k | grep meta_limit
  487  echo "arc_meta_limit/Z 0xb0000000" |  mdb -kw
  488  echo "::arc" |  mdb -k | grep meta_limit
  490  echo "arc_meta_limit/Z 0xd0000000" |  mdb -kw
root@rk6:~# echo "::arc" |  mdb -k | grep meta_limit
arc_meta_limit            =      3328 MB


Melkein kaikki muisti on tarjolla. Nopeus kyllä kasvoi, noin 9 Mt/s. Ei silti hyvä. Tutkin, mikä voisi olla pielessä. Mitään apua ei löydy.

Sitten tapahtuu jotain ikävää, X kaatuu. Myös se Konsolen kieleke, jossa käynnistin kopioinnin, on mennyttä. Samasta syystä jouduin yllä suodattamaan historiaa. KDE käyntiin taas ja myös rsync, joka hoitaa kopioinnin. Lisään kuitenkin --progress-vivun, jotta voin helposti seurata siirtonopeutta. Se aloittaa aika tasaiseen 112 Mt/s tahtiin, mutta vajaan neljän gigan kokoisen tiedoston loppupäässä hidastelee, välimuistit täyttyivät. Keskiarvo silti 78.65MB/s. Seuraava 42.63MB/s. Sitten taas nopeammin. Pidemmän ajan keskiarvo näyttää olevan yli 50 Mt/s. Huh!

Mitä ihmettä oikein tapahtui? Välimuisti fragmentoitui tai jotain vastaavaa tiedostojärjestelmän puolella. Parempaa arvausta en keksi. Opetus taitaa kuitenkin olla: älä kopioi yli neljää teraa kerralla, pidä tauko ;)



24. 12. 2011

Kopionti tuli vihdoin eilen valmiiksi. 8 teraa, yli 1,6 miljoonaa tiedostoa ja 165 tuhatta hakemistoa. Aikaa kului noin 5 vrk. Kopiointi ei kuitenkaan ollut sujunut virheittä. Tiedostojen omistajuudet olivat pielessä. Hakemistopuussa on esimerkiksi muutaman Linux-koneen juuriosioiden varmistuskopiot ja niillä tietysti useita pääkäyttäjän omistamia tiedostoja. OpenSolariksessa ei näytä olevan helppoa tapaa jakaa NFS:n avulla täysin oikeuksin, joten helpoin tapa on tehdä kopioinnin viimeistely toisinpäin, Linux jakamassa ja OpenSolaris-koneella käynnistetään kopiointi. Linuxissa jaolle annetaan täydet oikeudet exports-tiedoston kautta:


[root@rk7 ~]# cat /etc/exports
/mirrors  *(rw,no_root_squash,sec=sys)


OpenSolariksessa on NFS-versio 4 ja ja se on mount-komennon oletus. Linuxissa taas version 4 toteutus on vielä vajaa, joten liitoskomentoon tarvitaan lisämääre:


root@rk6:~# mount -o vers=3 192.168.0.7:/mirrors  /rk7/mirrors


Tämän jälkeen varmistetaan, että kopioitu hakemistopuu on täysin identtinen:


root@rk6:~# rsync -avH --progress --delete /rk7/mirrors/* /tank/mirrors/


Edellisen komennon ajo ei enää vienyt kovin pitkää aikaa, ehkä pari tuntia. Pian saisimme vastauksen deduplikoinnin tilansäästöstä:


root@rk6:~# zdb -S tank
out of memory -- generating core dump
^C
Abort (core dumped)


Keskusmuistia on 4 Gt ja levyltä on lohkaistu parin gigan siivu swappia. Swappia siis lisää. Helpoiten sitä saa ottamalla USB-tikun pois lokikäytöstä ja antamalla se swapiksi. zdb:stä käynnistetään varmuuden vuoksi täyden polun kanssa 64-bittinen versio:



root@rk6:~# zpool remove tank  /dev/dsk/c0t0d0p0
root@rk6:~# swap -a /dev/dsk/c0t0d0p0
root@rk6:~# /usr/sbin/amd64/zdb  -S tank


Nyt zdb on ollut jo noin vuorokauden työssään, top:in mukaan se on syönyt muistia 9452 Mt ja kone on täysin hyytynyt. Se vastaa pingiin, mutta top:sta ei pääse ulos q-näppäimellä eikä zdb kuole Ctrl-C:llä. Yritin lisätä ennen hyytymistä sivutustiedoston, mutta se ei onnistunut. Alla komennot ja lopputulos:


root@rk6:~# swap -a /tank/swap2
"/tank/swap2" may contain holes - can't swap on it.


On siis aika sammuttaa kone ja lisätä levyjä. Linux-koneessa hot-unplug on yksinkertainen toimenpide:


[root@rk7 ~]# mdadm /dev/md0 -r /dev/sdi
mdadm: hot removed /dev/sdi
[root@rk7 ~]# echo 1 > /sys/block/sdi/device/delete
[root@rk7 ~]# hddtemp /dev/sd?
/dev/sda: WDC WD2500JS-00NCB1: 41°C
/dev/sdb: SAMSUNG HD204UI: 30°C
/dev/sdc: Hitachi HDS722020ALA330: 33°C
/dev/sdd: Hitachi HDS722020ALA330: 31°C
/dev/sde: Hitachi HDS722020ALA330: 32°C
/dev/sdf: Hitachi HDS722020ALA330: 32°C
/dev/sdg: WDC WD2001FASS-00W2B0: 41°C
/dev/sdh: Hitachi HDS722020ALA330: 31°C
/dev/sdj: SAMSUNG HD204UI: 28°C
/dev/sdk: Hitachi HDS722020ALA330: 39°C
/dev/sdl: Hitachi HDS722020ALA330: 31°C


Lyhyen tähtäimen suunnitelma on käyttää SDD-levy kokonaisuudessaan väliaikaisesti swappina zdb:n ajon ajan. Tulos saadaan ehkä jo huomenna.

25. 12. 2011

Resilvering

Uusien levyjen käyttöönotto ei sujunut ilman kommelluksia OpenSolariksessa ja niihin kului aikaa. Eräs niistä on kuitenkin kertomisen arvoinen. Aikaisemmin SAS2-korttiin oli liitetty vain 6 levyä ja halusin, että kaikki sen 8 porttia otettaisiin käyttöön. Linuxissa tämä olisi onnistunut ongelmitta, mutta OpenSolaris ei huolinut toiseen adapteriin siirrettyä levyä. Se taas on mysteeri, että miksi aiemmin SAS-kortin vaihto SAS2-korttiin ei aiheuttanut samanlaista ongelmaa. Tämä ei oikeastaan ollut vielä se mielenkiintoinen asia vaan ZFS:n "resilvering", prosessi, jossa vanha jo poistettu levy korvataan uudella. Sen käynnisti komento:


root@rk6:~# zpool replace tank c6t1d0 c12t50024E9203F93266d0


Tilanne levypoolissa näytti 10 tunnin kuluttua seuraavalta:


root@rk6:~# zpool status tank
  pool: tank
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scrub: resilver in progress for 10h10m, 79,50% done, 2h37m to go
config:

        NAME                          STATE     READ WRITE CKSUM
        tank                          DEGRADED     0     0     0
          raidz3-0                    DEGRADED     0     0     0
            c6t0d0                    ONLINE       0     0     0
            replacing-1               DEGRADED     0     0     0
              c6t1d0                  UNAVAIL      0     0     0  cannot open
              c12t50024E9203F93266d0  ONLINE       0     0     0  1,00T resilvered
            c8t1d0                    ONLINE       0     0     0
            c12t50024E90049E53C0d0    ONLINE       0     0     0
            c12t50024E90049E5373d0    ONLINE       0     0     0
            c12t50024E90049E5393d0    ONLINE       0     0     0
            c12t50024E90049E5399d0    ONLINE       0     0     0
            c12t50024E90049E5531d0    ONLINE       0     0     0
            c12t50024E90049E5533d0    ONLINE       0     0     0

errors: No known data errors


Et ehkä huomannut sitä, että kahden teran levystä puolet oli käsitelty, mutta jäljellä oli enää viidennes. Selitys ristiriidalle on se, että loput 30 % on käyttämätöntä tilaa ja sille ei tarvitse tehdä mitään. Linuxin RAID ei ymmärrä mitään tiedostojärjestelmästä, joten se käsittelee vastaavassa tilanteessa aina koko levyn. Uuden pariteetillisen RAID-pakankin se aluksi käsittelee alusta loppuun laskien pariteetin. ZFS-poolia luotaessa se on tyhjä, joten sitä ei tarvitse käsitellä. Alla vielä kokonaisaika:


root@rk6:~# zpool status tank
  pool: tank
 state: ONLINE
 scrub: resilver completed after 13h6m with 0 errors on Thu Dec 22 15:53:49 2011


Kuvat

Kaikki kuvat on otettu Linux-koneella. OpenSolaris-koneella on oma näyttö, näppäimistö ja hiiri, jotka se jakaa KVM-laitteen kautta kolmen muun koneen kanssa. En kuitenkaan viitsi siirtyä näyttöjen väliä, joten käytän ssh:ta. Kaksi ensimmäistä kuvaa vaativat kuitenkin OpenSolariksen Device Driver Utility -ohjelman nimen selville ottoa. Kirjauduin sisään tunnuksella rk OpenSolaris-koneella, Linux-koneella ssh-sessiossa komento "ps aux | grep rk", takaisin OpenSolaris-koneelle, ohjelma käyntiin, Linux-koneelle, sama ps-komento ja etsitään listaukseen ilmestynyt uusi ohjelma. Tämän jälkeen Linux-koneella ikkunoidussa komentotulkissa:


[root@rk7 ~]# ssh -l rk 192.168.0.16
Password:
Last login: Thu Dec 22 16:27:11 2011
Sun Microsystems Inc.   SunOS 5.11      snv_134 February 2010
rk@rk6:~$ /usr/bin/python2.6 /usr/ddu/ddu.py &


Ja Linuxin työpöydälle ilmestyy OpenSolaris-koneessa käynnistetyn ohjelma ikkuna. Kuvakaappaus yhdestä ikkunasta komennolla "import -frame ddd1.jpg" ja klikataan haluttua ikkunaa.


OpenSolariksen näkemys laitteistosta




Tarkempi näkymä SAS-2-adapterin levyistä




top näyttää prosessit, muistin käytön ja prosessorin kuormituksen. Tämä Konsolen kieleke on ssh-sessio OpenSolaris-koneeseen.



SATA-3 SSD-levy

SSD-levyt pitäisi osioida niin, että levyn sylinteri osuu 4 kilotavun sivun rajalle. Se onnistuu tietyillä levyn geometrioilla. OpenSolariksessa tämä ei näytä olevan ongelma, sillä format kertoo SSD-levyn geometrian olevan juuri sopivan:


root@rk6:~# format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c0t2d0 <DEFAULT cyl 9343 alt 2 hd 224 sec 56>
          /pci@0,0/pci10de,5d@e/pci15d9,400@0/iport@4/disk@p2,0


Linuxissa ei aina ole näin onnellisesti. Aihetta tarkemmin käsittelevä artikkeli löytyy täältä: http://www.linux-mag.com/id/8397/

No, testataan levyä hieman


root@rk6:~# time dd if=/dev/zero of=/dev/dsk/c0t2d0s2 bs=1M count=40960
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB) copied, 148,344 s, 290 MB/s

real    2m28.389s
user    0m0.191s
sys     2m28.086s
root@rk6:~# time dd if=/dev/dsk/c0t2d0s2 of=/dev/null bs=1M count=20480
20480+0 records in
20480+0 records out
21474836480 bytes (21 GB) copied, 90,3149 s, 238 MB/s

real    1m30.342s
user    0m0.039s
sys     0m46.667s


Ei niin hyvä kuin luvattiin, mutta eteenpäin, otetaan swapiksi


root@rk6:~# swap -a /dev/dsk/c0t2d0s2


Säädetään ZFS:n välimuistin käyttöä pienemmäksi, kaikki muisti on nyt kallisarvoista.


root@rk6:~# echo "arc_meta_limit/Z 0x20000000" |  mdb -kw
arc_meta_limit: 0x30000000              =       0x20000000
root@rk6:~# echo "::arc" |  mdb -k | grep meta_limit
arc_meta_limit            =       512 MB
root@rk6:~# time zdb -S tank


Aikaisemmalla zdb:n ajokerralla huomasin, että se näyttää ensin käyvän tiedostojärjestelmän läpi lukien tarvitsemansa metadatan. Sen käyttämä muistimäärä nousee lukuvaiheen aikana hieman yli 9 gigaan. Sen jälkeen se alkaa analysoimaan tietoja eikä enää, ainakaan levyvalojen mukaan. lue levyä. Edellisillä kerroilla muisti on loppunut kesken, joten sitäkään ei tiedetä, miten pitkään analysointi olisi jatkunut. Nyt muistia kuitenkin löytyy varmasti tarpeeksi. Oheisessa kuvassa top ilmoittaa swapin kooksi peräti 58 Gt ja nyt se on aika mukavan vikkelällä levyllä.


1. 1. 2012 – Tulokset

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.


ZFS - Käyttöönotto

ZFS:ää evaluoidessa keskityttiin lähes kokonaan deduplikointiin, mutta samalla, lähes huomaamatta ZFS:ää rasitettiin melkoisesti ja tutkittiin erilaisten säätöjen vaikutuksia. Testiaineistossa oli yli 1,6 miljoonaa tiedostoa ja kokoa noin 8 teraa. Sen kopiointi oli odotettua hitaampaa, mutta 1 Mbps Ethernetkin on niin hidas, että kopiointiin menee vähintään 22 tuntia.

Levypooli uusiksi

Evaluoidessa levypooli ei ollut vielä siinä kokoonpanossa kuin halusin sen olevan lopullisena. Yksi 2 Tt levy ei ollut mukana poolissa ja raidz3 pitäisi vaihtaa raidz2:ksi. Tässä tapauksessa ei ole muuta tehtävissä kuin poistaa vanha pooli ja luoda uusi. Kopiointi menee myös uusiksi, valitettavasti.


root@rk6:~# zpool destroy tank
root@rk6:~# zpool create -f tank raidz2 c6t0d0 c6t1d0 c8t1d0 c12t50024E9203F93266d0 c12t50024E90049E53C0d0 c12t50024E90049E5373d0 c12t50024E90049E5393d0 c12t50024E90049E5399d0 c12t50024E90049E5531d0 c12t50024E90049E5533d0


Koska pooli poistettiin, menetettiin myös samalla kaikki tehdyt asetukset. Nostetaan välimuistin koko kahteen gigaan, säilötään siellä vain metadataa ja nopeutetaan suurten tiedostomäärien kirjoitusta:


root@rk6:~# echo "arc_meta_limit/Z 0x80000000" |  mdb -kw
root@rk6:~# zfs set primarycache=metadata tank
root@rk6:~# zfs set logbias=throughput tank


Primarycache-asetus pitää muuttaa kopioinnin valmistuttua. Jos lokille annetaan oma laite, sillä saadaan nopeutta lisää. Käytetään nopeaa USB-tikkua:


root@rk6:~# rmformat
Looking for devices...
     1. Logical Node: /dev/rdsk/c1t0d0p0
        Physical Node: /pci@0,0/pci1043,815a@2,1/storage@1/disk@0,0
        Connected Device: JetFlash Transcend 8GB    1.00
        Device Type: Removable
        Bus: USB
        Size: 7,5 GB
        Label: <Unknown>
        Access permissions: Medium is not write protected.
root@rk6:~# zpool add tank log /dev/rdsk/c1t0d0p0
cannot use '/dev/rdsk/c1t0d0p0': must be a block device or regular file
root@rk6:~# rmmount /dev/rdsk/c1t0d0p0
warning: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory
root@rk6:~# rmmount '/pci@0,0/pci1043,815a@2,1/storage@1/disk@0,0'
warning: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory


Ei jostain syystä onnistu. Yritetään vielä.


root@rk6:~# ls /dev/dsk/c1t0d0p0 -l
lrwxrwxrwx 1 root root 59 2012-01-01 12:07 /dev/dsk/c1t0d0p0 -> ../../devices/pci@0,0/pci1043,815a@2,1/storage@1/disk@0,0:q
root@rk6:~# ls -l /devices/pci@0,0/pci1043,815a@2,1/storage@1/disk@0,0:q
brw-r----- 1 root sys 83, 912 2012-01-01 12:07 /devices/pci@0,0/pci1043,815a@2,1/storage@1/disk@0,0:q
root@rk6:~# zpool add tank log /devices/pci@0,0/pci1043,815a@2,1/storage@1/disk@0,0:q


Hieman outoa..

Lisätään vielä SSD-levy poolin välimuistiksi. En usko, että siitä on apua, mutta sen voi poistaa menettämättä poolia, joten lisäämisestä ei ole haittaakaan.


root@rk6:~# zpool add -f tank cache /dev/dsk/c0t2d0s2
root@rk6:~# zpool list tank
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
tank  18,1T   224G  17,9T     1%  1.00x  ONLINE  -
root@rk6:~# zpool status -v tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME                                                      STATE     READ WRITE CKSUM
        tank                                                      ONLINE       0     0     0
          raidz2-0                                                ONLINE       0     0     0
            c6t0d0                                                ONLINE       0     0     0
            c6t1d0                                                ONLINE       0     0     0
            c8t1d0                                                ONLINE       0     0     0
            c12t50024E9203F93266d0                                ONLINE       0     0     0
            c12t50024E90049E53C0d0                                ONLINE       0     0     0
            c12t50024E90049E5373d0                                ONLINE       0     0     0
            c12t50024E90049E5393d0                                ONLINE       0     0     0
            c12t50024E90049E5399d0                                ONLINE       0     0     0
            c12t50024E90049E5531d0                                ONLINE       0     0     0
            c12t50024E90049E5533d0                                ONLINE       0     0     0
        logs
          /devices/pci@0,0/pci1043,815a@2,1/storage@1/disk@0,0:q  ONLINE       0     0     0
        cache
          c0t2d0s2                                                ONLINE       0     0     0

errors: No known data errors


Root-oikeudet NFS-jakoihin

NFS-jaot määritellään komennolla "zfs set sharenfs=on|off <dataset>". Man-sivulla zfs ei kuitenkaan kerrota, miten oikeuksia voisi määritellä ja pitää olla hyvin tarkkaavainen, jotta huomaa viittauksen man-sivulle share, jossa taas viitataan kätevästi sivulle share_nfs. Komento, jolla lisätään root-oikeudet kahdelle koneelle:


share -F nfs -o rw,root=rk7:rk2 /tank


Tuo ei kuitenkaan saa jakoa pysyväksi. Aikaisemmin jaettavat polut määriteltiin suoraan tiedostoon /etc/dfs/dfstab, mutta nykyisin sitä pitäisi välttää ja käyttää sen sijaan sharemgr-komentoa. Se taas ei ole aivan suoraviivaista. Ensin pitää määritellä ryhmä, johon jaettava polku tai polut lisätään ja vasta sitten ryhmän ominaisuuksia voidaan muuttaa. Kolmella komennolla se kuitenkin onnistuu:


root@rk6:~# sharemgr create -P nfs tank
root@rk6:~# sharemgr add-share -d "raidz2osio" -s /tank tank
root@rk6:~# sharemgr set -P nfs -S sys -p "rw=rk7:rk2,root=rk7:rk2" tank
root@rk6:~# sharemgr list -v
default enabled nfs
zfs enabled
tank enabled nfs


Linux-koneella on hyvä ottaa huomioon nfs:n versio ja sitten vain kopioimaan:


[root@rk7 mirrors]# mount -t nfs4 192.168.0.16:/tank /rk6
[root@rk7 mirrors]# time rsync -avH --progress /mirrors /rk6


Se ei valmistu ihan heti..

Sillä aikaa jaon voi määritellä Linux-koneen /etc/fstab-tiedostoon, jotta optiota ei tarvitse muistella. Seuraava rivi hoitaa homman:


192.168.0.16:/tank/ /rk6 nfs4 defaults,noauto 0 0


Deduplikoinnista jälleen

Slashdotissa oli aiheeseen liittyvä kysymys äskettäin: http://ask.slashdot.org/story/12/01/04/1955248/ask-slashdot-freeopen-ded... . Vastauksissa aika paljon toistettiin huomioitani. Mielenkiintoisia olivat Matt Dillonin kirjoitukset HAMMER-tiedostojärjestelmässä olevasta deduplikoinnin toteutuksesta. Se deduplikoi sekä on-line että off-line. On-line silloin, jos duplikaatti tarkistussumma sattuu olemaan välimuistissa ja loput off-line. HAMMER:ssa joudutaan myös poistettujen tiedostojen käyttämä tila vapauttamaan off-line, joten sen "huolto" täytyy joka tapauksessa tehdä ajastetusti. Toinen varsin järkevältä kuulostava ominaisuus oli se, että deduplikointi voidaan jakaa osiin, jolloin keskusmuistivaatimus pienenee. Kääntöpuolena tästä on, että jokaista osaa kohden levytila pitää lukea uudelleen. Matt Dillon kirjoitti mainitussa slashdot-keskustelussa, että deduplikointi maksaa aina, joko muistin tai levy-IO:n määrässä. Tosin ZFS ei tarjoa yhtä hyvää kompromissia kuin HAMMER. SSD-levyn välimuistina on kuitenkin hyvä kompromissi ja sen ZFS tarjoaa.

Ennen kuin enemmän innostuu HAMMER:sta, pitää mainita, että se on DragonFly BSD:tä varten kehitetty tiedostojärjestelmä.
DragonFly BSD on FreeBSD:stä eriytynyt haara ja sillä on vähemmän kehittäjiä kuin FreeBSD:llä. Melko marginaalinen käyttöjärjestelmä siis. Toisaalta wikipedian ( http://en.wikipedia.org/wiki/DragonflyBSD ) mukaan siinä on melko mielenkiintoisia ominaisuuksia. Todennäköisin kompastuskivi ja mahdollisesti melkoisen arviointityön aiheuttava kysymys olisi levyohjainten laiteajurit ja niiden laatu. HAMMER:lla on oma sivu wikipediassa: http://en.wikipedia.org/wiki/HAMMER . HAMMER on myös alustavasti portattu Linuxiin, sen verran, että sitä pystyy lukemaan, ei kirjoittamaan. Sillä voi olla ehkä hyväkin tulevaisuus.

Tästä onkin hyvä jatkaa tiedostojärjestelmien vertailuun.

Suppea edistyksellisten tiedostojärjestelmien vertailu

Aluksi syy ZFS:stä kiinnostumiseen oli sen skaalautuvuus, koska ext4:n rajoituksena oli 16 Tt osion maksimikoko. Sen jälkeen kiinnosti deduplikointi, mutta kun se ei minun tarpeisiini sovi, on vikasietoisuus noussut tärkeäksi. Wikipedian sivulla, jossa luetellaan tiedostojärjestelmiä ( http://en.wikipedia.org/wiki/List_of_file_systems#File_systems_with_buil... ), on vikasietoisiksi tiedostojärjestelmiksi luokiteltu vain viisi tiedostojärjestelmää. Btrfs on vielä keskeneräinen. HAMMER jo oikeastaan käsiteltiin ja Reliance sekä Reliance Nitro ovat tarkoitettu sulautettujen järjestelmien flash-muisteille.

Vikasietoisuudesta vielä hieman. Wikipedian sivu http://en.wikipedia.org/wiki/ZFS#Data_Integrity luettelee syitä, miksi se on tärkeää. Ne voivat kuulostaa kaukaa haetuilta, mutta minulla on "bittimädästä" kokemusta. Sivulla http://www.raimokoski.com/testialue.shtml otsikon "Varoitus uusien kerneleiden IDE-kiintolevyjen ajurien vioista" kerrotaan Red Hat 8.0:n kernelin IDE-ajurien tavasta ajoittain, ja hyvin harvoin kirjoittaa levylle väärää sisältöä. Vikaa esiintyi vain tietyissä laitekokoonpanoissa, joten sen tarkempi etsiminen olisi ollut melko vaikeaa.

Muistan myös toisen samantyyppisen ongelman melko tarkkaan samoilta ajoilta. Spectra Linux 1.2:n eräs oheis-CD käytti zisofs:ää eli pakattua CD:n tiedostojärjestelmää, jotta sille saatiin mahtumaan noin 1,2 Gt tiedostoja. Kun sen käyttöä testattiin, tuli lukuvirheitä noin 20 kpl, mutta aina eri kohdissa levyä. Mystisemmäksi asian teki se, että jos koneessa oli AMD:n prosessori, tuli lukuvirheitä vain noin 4 kpl luettaessa koko levy. Pari viikkoa vian paikantamisessa ja korjaamisessa meni. Ratkaisu oli poistaa Alan Coxin tekemästä melko massiivisesta kernelin patch-tiedostosta vanhan zlib-koodin korvaava koodi, joka oli luokiteltu alpha-tasoiseksi. Tein saman poiston myös pakatun ytimen purkavasta koodista ja jostain vähemmän kriittisestä kolmannesta paikasta. Myös edellä mainittu IDE-levyihin liittyvä ongelma johtui Alan Coxin koostamasta patchistä.

Bittimätää siis esiintyy. Kuitenkin erittäin harvoin ja epätodennäköisesti. Lisäksi niin väitettäessä on syytä olla erittäin hyvät todisteet tai sinua ei uskota asiantuntevimmissa piireissä. Edellä kertomistani tapauksista on lähes 10 vuotta, mutta opetus on silti kirkkaana mielessä: tallennettu tieto on vasta silloin tallessa, kun se ja sen tarkistussumma luettaessa täsmäävät.

Jos vikasietoisuus on tärkeä, ei tällä hetkellä näytä olevan käytännössä muita luotettavia tiedostojärjestelmiä kuin ZFS. Tämä näkymä on kuitenkin osittain väärä. Useimmat tiedostojärjestelmät eivät ota kantaa laitteistotason luotettavuuteen. Se on joko rauta. tai softa-RAID:in tehtävä. Oikea johtopäätelmä on, että ZFS on ainoa luotettava tiedostojärjestelmä, johon on intregroitu myös RAID:n ja LVM:n toiminnallisuus.


Linuxin tiedostojärjestelmien tulevaisuudesta

Tällä hetkellä lähes kaikkien uusien Linux-levitysversioiden oletustiedostojärjestelmä on ext4. Se olisi kelvannut minullekin, mutta ext2fsprogs rajoitti sen kooksi 16 Tt. Arviointiprosessin aikana tämä kokorajoitus on kuitenkin rikottu. Marraskuussa 2010 julkaistu ext2fsprogs versio 1.42:ssa rajoitusta ei enää ole ja uusi raja on ilmeisesti 1 exatavua. Exatavun ja teratavun välissä on petatavu, joten ihan heti uusi rajoitus ei käytännössä tule vastaan.

Ext4 ei kuitenkaan sen tekijän Ted Ts'o:n mukaan ole tulevaisuuden tiedostojärjestelmä vaan Btrfs. Ext4 on ihan hyvä yleistiedostojärjestelmä ainakin toistaiseksi ja brtfs vaikuttaa etenevän hyvää tahtia. Sen pääkehittäjä Chris Mason työskentelee Oraclelle ja brtfs:n on tarkoitus olla oletustiedostojärjestelmä Oraclen Linuxissa lähitulevaisuudessa. Myös Red Hat ja monet muut levitysversioiden tekijät ovat mukana sen kehityksessä. Btrfs on Red Hat Enterprise Linux 6.0:ssa mukana, mutta technology preview -tyyppisenä eli sitä ei tueta ja se saattaa puuttua uudemmista versiosta. Eräs brtfs:n hieno ominaisuus on, että ext3/4 tiedostojärjestelmä voidaan muuntaa btrfs:ksi. Huonoja puolia taas on esimerkiksi pariteetillisten RAID-tasojen puute. Tällä hetkellä se osaa vain RAID-tasot 0, 1 ja 10. RAID 5 ja 6 on luvassa myöhemmin.

Minä jatkan kuitenkin ZFS:n käyttämistä. Olen jo nyt investoinut sen tutkimiseen melko paljon aikaa. Jos ennen siihen tutustumista ext4:n kokorajoitus olisi ollut selvästi suurempi kuin 16 Tt, en todennäköisesti olisi vaivautunut. Tuntemattomissa tiedostojärjestelmissä on aina se vaara, että niistä paljastuu jokin puute tai rajoitus. Tästäkin on kokemusta. Silloin, kun journaloivat tiedostojärjestelmät tekivät tuloaan Linuxiin, testasin ReiserFS:ää, XFS:ää ja JFS:ää. JFS:n kanssa tuli ongelma, kun piti kirjoittaa yli 70 000 tiedostoa samaan hakemistoon. En muista varmasti antoiko se virheilmoituksen eikä jatkanut vai hidastuiko se käyttökelvottomaksi. Joka tapauksessa tiedostojen määrällä oli naurettavan pieni yläraja. Tämä puute on myöhemmin varmasti korjattu.


ZFS - Stressitestausta ja flashin vaikutus

ZFS:ää voi nopeuttaa lisäämällä SSD-levyn välimuistilaitteeksi. Toinen nopeutuskeino on lisätä flash-muistia lokilaitteeksi. Vaikka kymmenen kiintolevyn raidz2-järjestelmä on erittäin nopea suurten tiedostojen käsittelyssä, teoriassa jopa 8 kertaa nopeampi kuin yksi levy, on pienten tiedostojen käsittelyn nopeus teoriassa sama kuin yhden levyn. Sen takia pienikin määrä kiintolevyyn verrattuna hakunopeudeltaan ylivoimaista flash-muistia kriittisessä paikassa voi nopeuttaa koko järjestelmää selvästi. Kumpi sitten on tärkeämpi, välimuisti vai lokilaite? Entä kuinka suuri sen pitäisi olla? Lokilaitteen ei tarvitse olla suuri, mutta välimuistilaitteen koolla on jo väliä.

Testauksen tavoitteet

Evaluointivaiheessa kopioitiin 8 Tt tiedostoja Linux-koneelta ja ensimmäisellä kerralla kopiointi hidastui matkan varrella huomattavasti. Tiedostoja oli noin 1,6 miljoonaa, joten varsin helposti heräsi epäilys, että tiedostojen määrällä olisi ollut vaikutusta hidastumiseen. Kopiointi toistettiin, mutta silloin ZFS:llä oli käytössä erilliset välimuisti- ja lokilaitteet eikä hidastumista enää esiintynyt. Nämä olivat havaintoja, joiden taustalla ei ole mittaustuloksia eli lähes MUTUa. Jotta asia selviäisi, paras testi olisi luoda erittäin suuri määrä tiedostoja ja mieluummin pieniä, jotta testin ajoaika olisi mahdollisimman lyhyt.

Toinen tavoite oli selvittää flash-muistin vaikutus nopeutuksessa. Usean levyn RAID-pakan kirjoitus- ja lukunopeudet ovat erinomaiset, mutta hakuaika tai IOPS (Input/output Operations Per Second) on yhtä huono kuin yhden levyn. Flash-muistin siirtonopeudet eivät yleensä häikäise, mutta IOPS-luvut ovat aivan eri tasolla. Täytyy kuitenkin muistaa, että kiintolevyjen apuna on aina keskusmuistipohjainen välimuisti, joka on vielä vikkelämpää kuin flash-muisti, joten flashillä ei välttämättä kovin suuria parannuksia saavuteta. Myös tässä paras testi on mitata pienten tiedostojen käsittelyn nopeutta.

Kolmas tavoite oli selvittää, voisiko melko arvokkaan SSD-levyn korvata halvemmalla vaihtoehdolla. Aluksi tämä tavoite oli lähinnä etäinen toive, mutta sen järkevyys nousi esille varsin pian.

Käytettyjen laitteiden luku- ja kirjoitusnopeudet on myös tietysti hyvä testata, vaikka niillä ei tavoitteiden kannalta olisikaan merkitystä, niiden testaus on vain niin nopeaa ja helppoa ja lisäksi mittaustulokset auttavat hahmottamaan kokonaiskuvaa.

Testimenetelmät

Edellä mainittu kopioinnin hidastuminen johtui mitä ilmeisimmin metadatan käsittelystä. Voisiko syy olla hakemistopuun rakenteessa? Erittäin syvä hakemistopuu tai erittäin paljon tiedostoja yhdessä hakemistossa?

Hakemistopuun ja tiedostojen luominen olisi helppo toteuttaa skriptin avulla, mutta tarve on niin ilmeinen, että siihen löytyi valmis skripti: https://computing.llnl.gov/code/sio/tarballs/fdtree-1.0.2.tar.gz . En löytänyt sitä suoraan vaan Linux Magazineen ( http://www.linux-mag.com ) kirjoittaneen Jeffrey B. Laytonin ( http://www.linux-mag.com/author/311/ ) artikkelin ( http://www.linux-mag.com/id/7497/ ) kautta.

Linux Magazinen julkaisu on valitettavasti lopetettu kesällä 2011, mutta vanhat artikkelit ovat edelleen luettavissa ja Jeffrey B. Layton jatkaa kirjoittamista enterprisestorageforum:ssa ( http://www.enterprisestorageforum.com/author/Jeffrey-Layton-2040.htm ).

Hakuammuntaa

Yritin siis etsiä hakemistorakennetta ja tiedostomäärää, jolla hidastuminen ilmenisi. Erilaisten hakemistopuurakenteiden testitulokset vaihtelivat, mutta IOPS pysyi samana (tästä lisää myöhemmin). Koska samalla oli tarkoitus testata myös flash-muistin vaikutusta eri tavoin, testiajon pituudella oli käytännön rajoitus, aikaa ei saisi kulua tuhottoman paljon. Pisin testiajo, johon päädyin oli 29 miljoonan tiedoston luonti ja se vei yli kaksi vuorokautta aikaa. Fdtree ei anna välituloksia ja sen takia testin aikana mahdollisesti tapahtuva hidastuminen jäisi huomaamatta. Tämän puutteen poistamiseksi tein pienen skriptin:


#!/bin/sh
for i in `seq 200`
do
   sleep 30m
   df | awk '/tank/{printf $3"  "}'
   date
done


Skripti tulostaa puolen tunnin välein testattavan tiedostojärjestelmän vapaan tilan sekä kellonajan ja tekee niin sadan tunnin ajan. Jos skriptin tulosteen ohjaa komennolle:


awk '{if (PREV) print ($1-PREV)/4/1800 ; PREV=$1}'

tulostuu kuinka monta tiedostoa on luotu tai kuinka monta kertaa hakemistojen metadataa on kasvatettu keskimäärin sekunnin aikana kunakin edeltävänä puolena tuntina.

Hidastumista ei kuitenkaan ilmennyt. Skriptistä oli kuitenkin se hyöty, että se näytti, että vapaa tila väheni melko tarkalleen yhtä nopeasti hakemistopuun rakenteesta huolimatta. Syvässä hakemistopuussa hakemistojen metadataa jouduttiin päivittämään useammin ja sen takia tiedostojen luonti oli hitaampaa. Matala ja leveä hakemistopuu on tavallaan tehokkaampi. Siinä metadatan osuus on pienempi tiedostojen määrään verrattuna.

Testausta hidastumisen etsintä kuitenkin hidasti. Kunkin konfiguraation yksi testiajo kesti tosiaankin yli kaksi vuorokautta. Lisäksi alussa kokeilin erilaisia hakemistopuumalleja enkä heti alussa päätynyt siihen, että 29 miljoonaa tiedostoa on riittävän paljon, vaan kokeilin ensin vaatimattomammilla määrillä. Siinä sitten vierähti viikko jos toinenkin..

Näiden testien tulokset ovat ensimmäisessä kuvassa. Testin käynnistänyt komento oli "fdtree -d 90 -f 40 -s 1 -l 3" ja se tulosti käynnistäessään:

fdtree-1.0.2: starting at ./LEVEL0..12798/
        creating/deleting 3 directory levels with 90 directories at each level
        for a total of 737191 directories
        with 40 files of size 4KiB per directory
        for a total of 29487640 files and 117950560KiB







Kuvaajaa tulkittaessa on huomattava, että tiedostojen luontiin käytettiin selvästi eniten aikaa. Se on siis kaikkein tärkein tulos. Hakemistoja luodaan harvoin niin suuria määriä kerralla, että nopeudella olisi suurta merkitystä. Käytännössä hakemiston luonti oli yhtä nopeaa kuin tiedoston luonti, mutta Linuxin ext4:llä se oli hieman nopeampaa. Ext4:n tuloksia ei oikeastaan olisi pitänyt laittaa samaan kuvaajaan, koska sen testiajot tehtiin toisessa, selvästi nopeammassa koneessa. Kiintolevyt ja niiden määrä olivat kuitenkin lähes identtiset ja hyvin suurella todennäköisyydellä Linux-koneen nopeampi keskusmuisti oli suurin selittäjä paremmille tuloksille tiedostoja ja hakemistoja luotaessa. Niiden poistossa ext4 oli selvästi hitaampi, joten ainakin siltä osin testi todisti, että ZFS on parempi. Tiedostojen ja hakemistojen luomisen osalta en uskalla edes arvailla kumpi tiedostojärjestelmä on parempi.

Flash-muistin vaikutusta testattiin usealla eri tavalla. Tuloksissa huomiota herätti se, että ne ovat lähes identtisiä. Jos flash-muistia käytetään ZFS:n apuna, se nopeuttaa, mutta sillä ei näytä olevan väliä, onko se välimuisti- vai lokilaitteena. Lisäksi 8 gigan kokoinen USB-tikku, vaikkakin nopea sellainen, nopeuttaa yhtä paljon kuin 60 gigan huippunopea SSD-levy. Silläkään ei ollut merkitystä, jos sekä välimuisti- että lokilaitteena oli flash-muistia.

Laitteiden nopeudet

Tallennuslaitteilla on käyttöjärjestelmän kannalta vain kaksi mielenkiintoista ja siis testaamisen arvoista ominaisuutta: siirtonopeus ja hakuaika. Siirtonopeus on hyvin helppo testata ja sen vaikutus on helppo ymmärtää. Hakuaikaa on vaikea testata eikä sen vaikutusta käytäntöön ole helppo ymmärtää. Edellä on yritetty havainnollistaa hakuajan merkitystä. Hakuajan vaikutusta on yritetty kautta aikain minimoida välimuisteilla eri tasoilla ja eri tavoin. Tallennuslaitteen pitkä hakuaika on siis periaatteessa huono asia, mutta käytännössä sen vaikutusta harvoin näkee. Hakuaikaa hieman käytännöllisempi suure on IOPS. Sekään ei ole helposti suoraan mitattava arvo. Jos esimerkiksi luetaan tiedostoa, on metadatan käsittely yksi tai useampi IO-operaatio, johon ei vaikuta pelkästään hakuaika, metadata pitää myös lukea. Kun tiedoston sijainti on löytynyt, pitää sekin lukea. Käytännössä kaikki tiedostojärjestelmässä tehtävät haut ja muut operaation vaativat useita muita operaatioita ja hakuaikojen lisäksi nopeuteen vaikuttaa myös luku- tai kirjoitusnopeus. Kirjoitus- ja lukunopeus sen sijaan ovat hyvinkin tarkkaan samat kuin suuren tiedoston kirjoitus- ja lukunopeus.






Mittaustulokset ovat yllä. Koska tulosten hajonta on hyvin suuri eikä kuvaajassa näy tarkkoja arvoja, ovat tulokset myös alla taulukkona:

     Pelkät kiintolevyt        SSD       USB   Linux, ext4
Kirjoitus           207        198       8,6    316
Luku                283        529      32,5    352


Flash-muistin vaikutus ZFS:n nopeuttajana - toinen testisarja

Yli kahden vuorokauden ajoaika testille on hankala. Jos testattavia vaihtoehtoja on useita, menee ikä ja terveys. Toisaalta testin ajoaika ei saa olla liian lyhytkään, muuten sen luotettavuus ja tarkkuus kärsii. Vaihtoehtoja haarukoidessa muutama minuutti olisi sopiva. Tiedostojärjestelmää testatessa pitää kuitenkin pitää aina mielessä se, että keskusmuistia käyttävä välimuisti sekoittaa helposti testitulokset, joten joko sen vaikutus pitää ohittaa testausjärjestelyiden avulla tai testiajon pituus pitää olla melko pitkä. Päädyin komentoon "fdtree -d 3 -f 16 -s 1 -l 10", jonka ajoaika oli käytetyillä laitteistoyhdistelmillä kahden ja kolmen tunnin välillä. Eräs tärkeä syy valintaan oli se, että sen vaatima tallennustila mahtui USB-tikulle.

Testin käynnistänyt komento  "fdtree -d 3 -f 16 -s 1 -l 10" tulosti käynnistäessään:


fdtree-1.0.2: starting at ./LEVEL0..3481/
        creating/deleting 10 directory levels with 3 directories at each level
        for a total of 88573 directories
        with 16 files of size 4KiB per directory
        for a total of 1417168 files and 5668672KiB





Mittaustuloksista huomataan, että USB-tikku ZIL- eli lokilaitteena antoi paremman tuloksen kuin välimuistina ja vain aavistuksen verran huonomman kuin SSD-levy lokilaitteena. Ensimmäisessäkin testisarjassa USB-tikku lokilaitteena oli vain aavistuksen verran heikompi kuin SSD-levy lokilaitteena. Jos flash-muistia halutaan käyttää, on USB-tikku lokilaitteena lähes paras sekä helppo ja halpa valinta. Tässä testisarjassa nousee kuitenkin esille se, että keskusmuistia käyttävä välimuisti riitti ja kiintolevyt ilman flash-muistia olivat yhtä nopeita kuin SSD-levy. Myös Linux-koneessa keskusmuistia käyttävä välimuisti näytti kyntensä ja sen kaikki tulokset ovat selvästi parempia kuin hitaampaa keskusmuistia käyttävän OpenSolaris-koneen. Vaikka flash-muisti ei tässä testisarjassa nopeuttanut, ei se myöskään hidastanut ja parin kympin arvoinen USB-tikku on halpa vakuutus sille, että tiedostojärjestelmä ei hidastu erittäin raskaissa operaatioissa.



Flash on keskusmuistia hitaampaa

Deduplikointi vaatii paljon muistia, mutta SSD-levyllä voi "jatkaa" usein rajallista ja liian pientä keskusmuistia. Flash-muisti ei kuitenkaan ole yhtä nopeaa kuin keskusmuisti, joten deduplikointi hidastaa silti siinä vaiheessa, kun keskusmuistipohjainen välimuisti ei enää riitä. Kuinka paljon se sitten hidastaa? Tämä riippuu tietysti laitteistosta - kuinka nopeaa keskusmuisti on suhteessa SSD-levyyn. Käyttämässäni laitteistossa keskusmuisti on melko hidasta, tyyppiä DDR-400. Kaikki levyt sen sijaan ovat nopeita, käytännössä uusia ja SSD-levy varsinkin on käytännössä niin nopea kuin vain kohtuullisella hinnalla kaupasta saa. Ainoastaan suoraan PCI-e-väylälle liitettävät flash-kortit olisivat selvästi nopeampia. Tuloksissani deduplikointi hidastaa siis vähemmän kuin tasapainoisemmassa laitteistossa.


Testijärjestelyt

Aiemmin käytetty fdtree-skripti kirjoittaa luomiinsa tiedostoihin pelkkiä nollia. Ne deduplikoituvat täydellisesti lukuunottamatta ensimmäistä blokkia tai tiedostoa, jos ne ovat pieniä. Sitä pitää siis muuttaa, jotta testitiedostot eivät deduplikoituisi. Käytännössä tein siitä kuitenkin kopion nimellä fdtree-urand ja muutin dd-käskyn lähteeksi /dev/urandom-pseudolaitteen. Alkuperäinen versio on hyvä verrokki, sillä normaalikäytössä suositusten mukaan ainakin puolet blokeista pitäisi olla deduplikoituvia. Alla muutettu rivi:

dd if=/dev/urandom bs=4096 count=$fsize of=$file_name > /dev/null 2>&1

Ideaalitilanteessa deduplikoituvuus tiedettäisiin etukäteen ja testiohjelma tuottaisi juuri sen verran deduplikoituvaa materiaalia. Varsin työläs tapa olisi tehdä skriptivariaatioita tai lisäparametri deduplikoituvuusasteille ja ajaa testit esimerkiksi asteille 2, 3, 4 jne. Ääripäät antavat kuitenkin jo jonkinlaista tuntumaa.

Toinen skriptimuutos liittyy siihen, että tein erillisen datasetin (käytännössä uusi alihakemistopuu, jonka ominaisuuksia, kuten deduplikointia, voidaan muuttaa) testausta varten. Muutin myös raportointiväliä dftrack-skriptissä:

#!/bin/sh
for i in `seq 1200`
do
   sleep 5m
   df | awk '/tank\/dedup/{printf $3" "}'
   date
done

Uusi dataset luotiin ja asetusta muutettiin käskyillä:

zfs create tank/dedup
zfs set dedup=on tank/dedup

Edellä esitelty dftrack-skripti käynnistettiin komennolla:

sh /usr/local/bin/dftrack | awk '{if (PREV) print ($1-PREV)/4/300 ; PREV=$1}' &

Sen jälkeen itse testiohjelma:


fdtree-urand -d 50 -f 80 -s 1 -l 3
fdtree-1.0.2: starting at ./LEVEL0..29938/
        creating/deleting 3 directory levels with 50 directories at each level
        for a total of 127551 directories
        with 80 files of size 4KiB per directory
        for a total of 10204080 files and 40816320KiB


Tiedostoja on siis hieman yli 10 miljoonaa.

Alkuperäinen fdtree käynnistettiin samoilla parametreillä.



Tulokset ja niiden tulkinta

Ensin fdtreen tulokset taulukkona.


                          fdtree-urand   fdtree

Directory creates per second     217     212

File creates per second           67     192

File removals per second         353    1988

Directory removals per second   2406    2362

Kokonaisaika/s                181014   58661


Hakemistojen luonti ja poisto on yhtä nopeaa, joten ne ovat testin kannalta turhia tuloksia. Lisäksi kokonaisaikaan niillä on mitätön merkitys. Tiedostojen käsittelyssä ero on sen sijaan suuri. Tiedostojen poisto on melko nopeaa, mutta siinä suhteellinen ero on hyvin suuri. Kokonaisajan kannalta sen merkitys on kuitenkin melko vähäinen. Tiedostojen luonnin nopeus on koko testin kannalta tärkein, ja siitä on erillinen graafi. Kun vertailee tiedostojen luonnin nopeuksien suhdetta ja kokonaisaikojen suhdetta, pitäisi huomata, että se on hyvin tarkalleen sama. Tiedostojen luontinopeus dominoi siis koko testiä.



Graafissa ei ole vaaka-akselilla asteikkoa, koska se ei olisi tarkka. Se on kuitenkin aika-akseli ja kuvaajien pituudesta voi päätellä testiajojen viemän ajan. Punaisen kuvaajan alussa on yksi alhainen mittapiste, joka johtuu mainitusta epätarkkuudesta ja se olisi pitänyt oikeastaan poistaa virheellisenä. Samaa voisi uumoilla sinisenkin alkuosan kuopasta, mutta se todennäköisimmin on samaa vaihtelua, joka näkyy koko kuvaajassa. Jos mittausväli olisi ollut suurempi kuin 5 minuuttia, ei vastaavaa "sahausta" olisi näkyvissä.

Graafissa merkittäviä havaintoja on se, että deduplikoituvan materiaalin kirjoittaminen on aina hieman nopeampaa kuin deduplikoitumattoman. Jos deduplikoinnin käyttämä metadata on ensisijaisessa välimuistissa, on ero kuitenkin melko pieni. Toisin olisi, jos tiedostojen koko olisi suurempi. Silloin tiedoston vaatiman uuden metadatan kirjoittaminen olisi pienempi operaatio verrattuna itse tiedoston kirjoittamiseen.

Deduplikoitumattomien tiedostojen kuvaajassa tapahtuu melko jyrkkä lasku eli hidastuminen. Se, missä vaiheessa hidastuminen tapahtuu, riippuu siitä, miten paljon välimuistia on jo aiemmin käytetty eli siis kuinka kauan koneen käynnistymisestä on aikaa ja kuinka paljon tiedostojärjestelmiä on käytetty. En käynnistänyt konetta uudelleen ennen testiä, joten hidastumispiste on sattumanvarainen eikä siitä kannata vetää johtopäätöksiä. Muita vaikuttavia tekijöitä ovat keskusmuistin määrä ja sitä kautta välimuistin määrä ja tietysti välimuistin asetukset. Tärkeä havainto on hidastumisen määrä. Nopeus tippuu melko tarkalleen kolmannekseen. Mutta, kuten jo alussa huomautin, tulos on epätavallisen hyvä johtuen hitaasta keskusmuistista ja nopeasta SSD-levystä. Uudemmalla laitteistolla kymmenesosaan tai sitäkin pienempään hidastuminen olisi odotettavaa.


Loppupäätelmät

Tuloksia tulkitessa on otettava huomioon testilaitteiston erikoisuus. Sen takia SSD-levyllä tulokset ovat liian hyviä. Toisaalta testi oli täysin synteettinen ja tiedostot epätavallisen pieniä. Suurilla tiedostoilla erot nopeuksissa olisivat pienempiä. Ehkä nämä vastakkaiset vääristymät suurinpiirtein kumoavat toisensa, mutta varsinaisessa käytössä deduplikoituvuusastetta ei voi etukäteen tietää kuten ei tiedostojen kokoakaan.

Deduplikointia käytettäessä pätee edelleen kolmen käskyn optimointiohje:

- hanki lisää keskusmuistia

- hanki lisää keskusmuistia

- lisää SSD-levy välimuistilaitteeksi