IO Baselining: SQLIO (hu)

Minden SQL Server esetében az IO alrendszer – lemezek, RAID vezérlő, SAN, stb. – a leggyengébb elem általában. Éppen ezért nagyon fontos, hogy tisztában legyünk ennek a részegység(ek)nek a kapacitásával és határaival. A legtöbbször azt látom, hogy egy új szerver esetén se fordítanak időt arra, hogy összeszedjék ezeket a minimális információkat, megbíznak a gyártó által adott adatokban. Ez *hibás* hozzáállás: legutóbb egy hárombetűs SAN gyártó által megadott értékek és a valóság köszönőviszonyban sem volt egymással. A gyártó állítása szerint 8000 IOPS-ra képes a SAN, de ezt kimértem és valójában kevesebb, mint a felére sem volt képes. Persze lehet mondani, hogy hány IO szál és mekkora írási/olvasási műveletekkel dolgoztam, illetve véletlen vagy szekvenciális IO-ról volt e szó, vagy milyen módon csatoltam a géphez. Ez így jogos felvetés lenne, de több, különböző paraméter mellett sem volt képes a SAN a névleges teljesítményre. Pont ezek miatt az okok miatt is tartom fontosnak, hogy egy új SQL Server esetén mindenképpen szánjunk rá időt, a meglévő szerverek esetében pedig folyamatos monitorozással kövessük az IO terheltséget és a válaszidőket. Ez a bejegyzés nem foglalkozik az utóbbi esettel, csak az új szerverek esetével.

Mi az SQLIO és mire használható?

A nevével ellentétben, semmi köze nincs az SQL Server-hez, ez egy igen szerencsétlen névválasztás. Lényegében ez az eszköz segít az IO alrendszer teljesítményének meghatározásában. Ezzel a parancssori eszközzel, a különböző IO minták – véletlen, szekvenciális – szerinti alap teljesítmény mutatókat tudjuk meghatározni. Ezek az információk jól jöhetnek egy-egy hibakeresés során, mivel az IO alrendszer teljesítményének határértékei rendelkezésre állnak. Több esetben is jó szolgálatot tett egy ilyen mérés: volt olyan eset, amikor egy fejlesztő cég reklamált, hogy lassú a lemez alrendszer, de végül kiderült, hogy a maximális teljesítményének a 20-30%-án pörgött “csak” és lock/block probléma volt, rossz/hiányzó indexelés miatt.

Tesztkörnyezet felépítése

Talán ez a legkönnyebb része: az alábbi szoftver és hardver elemeket használtam a teszt során.

Szoftver követelmények

  • SQLIO: ezzel fogjuk a lemezeket “meghajtani”.
  • Notepad: talán a leghasznosabb program :-), ezzel nézünk bele az eredményekbe
  • SQL Server 2008 vagy újabb: ezzel dolgozom fel a mérési eredményeket. Elég az Express verzió is.
  • Excel: ezzel jelenítjük meg az eredményt.

Teszt hardver

  • Tesztelt lemez:
    • Samsung 840 Pro SSD 128GB
    • NTFS Allocation unit: 64 KB
    • Partition alignment: 1024KB
    • USB3 csatlakozás
  • Tesztre használt gép:
    • Dell Precision M4700
    • 1db Intel Core i7-3740QM processzor,
    • 32 GB RAM

Teszt terhelés

Az alábbi IO terhelésnek fogom kitenni az SSD meghajtómat:

  • Írási/olvasási műveletek:
    • Mód: véletlen/szekvenciális
    • IO szálak száma: 2,4,8,16,32,64
    • Várakozó IO műveletek: 1,2,4,8,16,32,64,128
    • IO méret: 64KB
    • Időtartam: 60 másodperc
    • hardveres buffer használata,
    • 1 db. 20GB-os file

A fentiekből könnyen kiszámolható, hogy 2*2*6*8=192 esetem lesz, így a teszt 192 percig, kicsit több, mint 3 óráig fog tartani. A teszt során a gépem mást nem csinál, csak az SQLIO.exe-t futtatja a megfelelő paraméterekkel.

SQLIO paraméterezése

A teszt terhelés részben megadott beállításokat az alábbi paraméterek segítségével lehet megadni:

Paraméter Leírás Példa
-k io művelet: írás | olvasás -kW | -kR
-t szálak száma -t2
-s teszt hossza másodpercben -s60
-o függő IO műveletek száma -o32
-f io művelet típusa: véletlen |szekvenciális -frandom | -fsequential
-b io mérete KB -b64
-B buffer beállítás -BH
-L késleltetési információk -LS
-F paraméterek kiolvasása szöveges dokumentumból -Fparam.txt

 

Teszt eredménye

Nagy meglepetés nem ért, mivel USB-n keresztül csatlakoztattam a géphez. Az eredményt az alábbiak szerint értékeltem ki:

  • IOPS: IO műveletek száma másodpercenként. Megmutatja, hogy hány írási/olvasási műveletre képes az IO alrendszer ebben a konfigurációban
  • Adatátvitel: megmutatja, hogy mennyi adatot képes írni/olvasni az IO alrendszer ebben a konfigurációban
  • Késleltetés és szaturációs pont: megmutatja, hogy milyen késleltetés mellett történnek az IO műveletek, illetve meghatározza a szaturációs pontot.

IOPS

A teszt eredménye az alábbi grafikonon látható

Látható, hogy az írási műveletekkel sokkal jobban birkózik meg a drive, 500-1000 IOPS különbség van az olvasással szemben, pozitív irányban. Ezzel meg is van az átlagos IOPS, ami kb. 3000 ebben az esetben.

Adatátvitel

Itt az 1 másodperc alatt átvitt – írt/olvasott – adatmennyiség látható:

Itt megint az látszik, hogy az írási művelete során nagyobb adatátvitelre képes a lemez. Átlagosan 188MB/s átviteli sebességgel számolhatunk.

Késleltetés és szaturációs pont

A késleltetés azt mutatja meg, hogy egy-egy IO művelet során mennyi időt kellett várni ahhoz, hogy az adathoz hozzáférjünk a lemezen. SQL Server esetén az ajánlott értékek az alábbiak:

  • 1-5ms tranzakciós log esetén.
  • 4-20ms adat file, OLTP terhelés esetén.
  • max. 30ms adat file, DSS terhelés esetén.

Persze ezek ajánlott értékek, a tapasztalat azt mutatja, hogy ettől nagyobb értékek is lehetnek, de ez mindig függ az SLA-tól!

Késleltetés

Az alábbi grafikonon látható a különböző IO minták során, milyen késleltetési idővel dolgozott a lemez.

Szaturációs pont

A szaturációs – telítettségi – pont, az a terhelési pont, ahol már magasabb késleltetés mellett is ugyan azt az adatátviteli sebességet érem el. Az alábbi grafikonon látszik ez a pont: minden esetben, szálak számától függetlenül,  32 függő IO kérés esetén áll be, innentől kezdve bármennyi várakozó IO művelet is van, az átvitt MB-ok mennyisége nem változik, de a késleltetés növekszik.

Konklúzió

Megállapíthatjuk, hogy a fenti adatok birtokában sokkal hamarabb kizárhatjuk vagy megállapíthatjuk az IO alrendszer e a szűk keresztmetszet vagy sem, illetve szükség van e bővítésre vagy bőven határértékeken van. Érdemes a Performance Monitor segítségével az alábbi számlálókat folyamatosan követni és összevetni a baseline értékekkel, legalább 3-6 havi rendszerességgel:

  • Physical Disk / Disk Reads/sec
  • Physical Disk / Disk Read Bytes/sec
  • Physical Disk / Avg. Disk sec/Read
  • Physical Disk / Disk Writes/sec
  • Physical Disk / Disk Write Bytes/sec
  • Physical Disk / Avg. Disk sec/Write

Ajánlott olvasmányok

Az alábbi listába megtalálhatóak hasonló – angol nyelvű – bejegyzések a témában.

Add comment