sobota 4. května 2013

Pomalost Intel RAID 5 způsobená vyprazdňováním cache pro zápis - aneb proč flushovat

Tento článek by se také mohl jmenovat: Máte UPS? Zdvojnásobte si výkon svého diskového pole....


Anotace ve zkratce:
Tento článek pojednává o kombinaci Intel Rapid Storage Technology RAID 5 pole na chipsetu H77 s technologií Hyper-V. A konkrétním problému s pomalostí mysql databáze ve webové aplikaci Tiny Tiny RSS, běžící ve virtuálním počítači. Problém způsobuje bezpečností disková funkce Windows :  write-cache buffer flushing. Také se zabývá řešením. 




http://www.intel.com/content/www/us/en/chipsets/mainstream-chipsets/chipset-h77.html
Asi půl roku využívám Intel raid na chipsetu H77. Kombinace RAID 5 a tří spolehlivých disků Samsung HD154UI  je prozatím bezproblémová. Výkon pole nijak neoslní, mělo by jít o odolné řešení pro případ výpadku jednoho z disků. V případě závady základní desky stačí pole zapojit do jakékoliv jiné se stejnou nebo novější verzí RTS(Intel Rapid Storage Technology) option ROM.

Problém ovšem nastal když jsem v Hyper-V nasadil virtál obsahující mysql server pro Tiny Tiny RSS (viz předchozí článek http://blog.mj12.eu/2013/05/nasazeni-tiny-tiny-rss-v-ubuntu-serveru.html )

Kupodivu Tiny RSS bylo nezávisle na OS neuvěřitelně pomalé. Načtení složky trvalo až stránky trvalo cca 5 sec, načtení složky 10 sec). Běžná rychlost načítání je maximálně do 0,5sec. Po delší diagnostice a ladění SQL databází jsem našel původ problému. Je jím "Windows write-cache buffer flushing". Tato funkce je ve Windows ve výchozím stavu zapnutá (pokud vůbec cache používáte) a stará se o pravidelné vyprazdňování cache na disk - tím snižuje riziko ztráty dat v případě výpadku napájení nebo chyby STOP.


Návod jak vypnout vyprazdňování cache naleznete zde http://support.microsoft.com/kb/324805/en-us
Nevím zda to je problém čistně RTS a mysql či RTS a Hyper-V. Ale reálný rozdíl jak uvidíte na obrázcích níže je velice zajímavý.

Virtuální počítač (ať už win nebo linux) má tendenci provádět nonstop zápisy do svého vdh, jde asi jen o 9 - 400KB/s. Ale jak vidíte stačí to k vytížení disku na maximum. Latence se pak podle taskmanageru pohybuje kolem stovek ms až sekund. Délka diskové fronty je 1,5-3.

Stav se zapnutým virtuálním počítačem obsahujíc mysql databázi. Flushování ve vychozím stavu zapnuté.

A zde je stejná situace s vypnutou funkcí "Windows write-cache buffer flushing"

Další příklad propadu výkonu můžeme vidět na programu HD Tune. Jako první opět ve výchozím stavu se zapnutým flushováním.

A bez této bezpečností funkce:
Jak je vidět, rychlost je téměř dvojnásobná, v případě latence je to až pětinásobně lepší.
A ještě file benchmark test měřený přímo v Hyper-V hostu. 

Zde již je to zajímavější, ovšem stále to nevysvětluje proč s flushingem mysql pracuje desetinásobně pomaleji. 
Ještě dva údaje pro porovnání:
Access Time           : 0.568 ms
Burst Rate            : 197.9 MB/s

Access Time           : 0.377 ms
Burst Rate            : 518.2 MB/s

Ovšem stojí tento rozdíl za vypnutí vyprazdňování cache? Bez automatiky Windows cache vyprazdňují pouze při každém vypnutí.....A u RAID může neplánované vypnutí způsobit až kolaps pole, nemluvě o poškození otevřených dat.

Možná řešení problému:


  1. Jasným kandidátem na řešení je tedy UPS komunikující s PC která by informovala o výpadku a sepnula bezpečné vypnutí. Bohužel o není levná legrace. 
  2. Nic neměnit a používat bezpečné vyprazdňování. Bohužel tato alternativa by mi znemožnila používat TT-RSS na RAID 5. Musel bych použít nějaký jiný samostatný disk, iSCSI... či RAM disk? :-)
  3. Snížit riziko. Microsoft v rámci Sysnternals nabízí program Sync 2.0. Ten slouží k ručnímu vyprázdnění diskové cache. 

Program Sync 2.0 aneb snad to bude fungovat....

Microsoft dělá výborný software - tato věta není jen fráze. Prográmek Sync z roku 2006 bez problému funguje na Windows 8 x64. A dělá to co má:


Je až k nevíře že program z roku 2006 bude fungovat v roce 2013. Na obrázku níže je červeně označený moment kdy byl sync spuštěn, přenosová rychlost klesla a cache se vyprázdnila.


Nic tedy nebrání vytvoření naplánované úlohy která bude Sync spouštět. Jenže jak často? Jak často Windows ve výchozím stavu flushují cache? Jednou za hodinu? Každou minutu? Každých 5 vteřin? Vteřinu? 0.1 vteřiny? 0.001 vteřiny? Po každém zápisu či při iddle? Bohužel se mi tuto informaci nepodařilo získat pro Windows, ale ani pro Linux. 

Pravděpodobně každých 15-30 minut bude rozumné rozmezí pro iddle běh. 


PS: Pokud prodáváte nějakou starší UPS, mám zájem :-) 

Žádné komentáře:

Okomentovat