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 :-) 

Nasazení Tiny Tiny RSS v Ubuntu serveru (v Hyper-V)

Vzhledem k ukončení Google Readeru je na čase hledat vhodné alternativy. Pokud vás láká myšlenka hostovat si vlastní RSS čtečku, či jste dokonale zvyklí na Android čtečku gReader, (podpora je v beta verzi zde) nabízí se Tiny RSS.

Na živo si TT-RSS můžete vyzkoušet na veřejné instalaci jednoho dobrodince na http://rss.cicolina.org/

Pokud zvažujete vlastní nasazení, je to docela snadné. Pro linux existují desítky návodů. Kupodivu ale pro Windows jich moc není. Pokud máte k dispozici Windows server, asi ideální řešení je vytvoření dedikovaného VM v Hyper-V. Výhodou je přenositelnost a snadná zálohovatelnost. V případě reinstalace hostitele si stačí zálohovat několika gigabajtový vhd a později opět připojit. Již žádné reinstalace a rekonfigurace.....Hyper-V se také na rozdíl od virtualboxu postará o uložení stavu při restartu hostitele a opětovné obnovení po nastartování.

Pro TT-RSS v Hyper-V se vybízejí dvě varianty:


  1. Windows host s nějakým druhem LAMP serveru, například XAMPP. Výhodou je velice snadná instalace a konfigurace. Také můžete využít dynamickou paměť - VM pak neujídá paměť kterou nevyužívá. Licencovat můžete například z MSDN (AA ), Windows 8 za pár stovek... Takový server 2003 se vejde do 3GB a vystačí s 200-300MB RAM. Aktualizaci feedů je pak možné provádět pomocí naplánovaných úloh, což je zábavná alternativa vůči linux daemonům.  
  2. Hyper-V oficiálně podporuje pouze CentOS a RedHAT. Naštěstí Nové verze Ubuntu mají již integrované integrační služby pro Hyper-V. Není tedy problém s ovladači ani s vypínáním. Bohužel není reálném používat GUI verzi Ubuntu - rozhraní je nepoužitelně pomalé, a to i po zakázání framebufferu. Další varianta je Debian. Pro něj můžete doinstalovat integrační služby velice snadno v podobě deb balíčku (zde). S GUI rozhraním problém není, pouze je někdy nutné ručně provést ifup eth0

Dnes se ovšem podíváme na instalaci Tiny Tiny RSS v ubuntu serveru.


Instalaci Ubuntu server 13.04 v Hyper-V nebudu nijak zvláště popisovat, pouze nezapomeňte nainstalovat SSH. Pro VM stačí bohatě 512 MB paměti - mysql bude moci hodně cachovat. 

Jakmile jsme na SSH začneme instalací mysq:
sudo apt-get install mysql-server mysql-client

Vytvoříme silné heslo a pokračujeme:
sudo aptitude install apache2 mysql-server libapache2-mod-php5 php5-mysql

A nakonec prerekvizity:

sudo aptitude install php5-cli php5-xmlrpc php5-curl

Nyní máme funkční webový server, pokračujeme Nasazením TT-RSS:

wget https://github.com/gothfox/Tiny-Tiny-RSS/archive/1.7.8.tar.gz
tar -xf 1.7.8.tar.gz -C /var/www/
chown -R root.www-data /var/www/
chmod -R g+w,o+ /var/www/



Nyní si ještě nainstalujeme phpMyAdmin pro snadnější práci a budoucí sledování DB. Zadejte silné heslo.
sudo apt-get install phpmyadmin

Na adrese http://VÁŠserver/phpmyadmin vytvořte nového lokálního uživatele (třeba tinyrss) a rovnou i stejnojmennou databázi. Opět použijte silné heslo.

Na adrese http://VÁŠserver/ by měla být k dispozici úvodní konfigurace. Vyplňte údaje, inicializujte databázi a hotovo. Nyní můžete přidat vaše feedy. Také změňte výchozí heslo!

Zbývá ovšem ještě dořešit aktualizaci. TT-RRS ve výchozím stavu feedy automaticky neaktualizuje (chytré?) Stačí ovšem udělat následující - otevřít nanem rc.local a dopsat řádek...
nano /etc/rc.local 

a přidal řádek:
sudo -u www-data php /var/www/update_daemon2.php > /dev/null&
pak znovunačíst konfiguraci:
rc  /etc/init.d/rc.local start



Nyní se rozběhne aktualizace feedů...a jsme hotovi. Může náš potěšit že na rozdíl od Windows, je na Linuxu aktualizace vícevláknová, stejně se ale připravte na hodiny čekání a naplnění čtečky tisíci příspěvků. 
Nakonec zbývá přizpůsobit si TT-RSS. Na fóru projektu lze nalézt spoustu pluginů imitující vzhled greaderu. Plugin pro identické klávesové zkratky je také již integrován. Po aktualizaci feedů vám také TT-RSS zobrazí seznam již nefunkčních adres spolu se seznamem dlouhodobě neaktivních. Můžete tedy pohodlně opravit sledované adresy - například po přesunu blogů..
Pro přiblížení Goodle Readeru doporučuji ještě toto nastavení:


Automatically mark articles as read – No
Combined feed display – Yes
Confirm marking feed as read – No


A pokud budete mít problém, okamžitě zapomeňte že by jste ho zmínili na fóru projektu. Administrátor s tímto příjemným avatarem....
...se okamžitě postará o vaše zesměšnění a pohřbení dobrých nápadů. (A ne, na fórum jsem nic nepsal, stačí s pročíst několik témat).

A několik článků k tématu TT-RSS:
http://the.geekorium.com.au/make-tiny-tiny-rss-look-and-behave-like-google-reader/

http://tt-rss.org/forum/viewtopic.php?f=22&t=1287

http://nathan.chantrell.net/20130317/tiny-tiny-rss-a-replacement-for-google-reader/