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.