Optimalizuj, nebo zkrachuj!
Výzvy informačních technologií: optimalizace v celých systémech, nebo jejich krach.
S vybavením správnými nástroji je možno optimalizovat výkon aplikací i databází zároveň.
Greg Nerpouni, Embarcadero, článek převzat ze serveru Enterprise Systems
Vývoj aplikací používajících databáze stále pokračuje i přesto, že se rozpočty na IT smrskávají a zřetelné rozdělení povinností mezi databázové profesionály a aplikační vývojáře se nadále rozostřuje. Správci databází se více zaměřují na provoz a plnění kritérií SLA, zatímco aplikační vývojáři, kteří plynně pracují s jazyky jako Java a C++, nicméně zpravidla neumí dobře SQL, jsou nuceni pustit se do psaní vlastního kódu v SQL.
Představte si běžnou situaci, kdy je pozornost správců databází plně vytížena sledováním provozu a není s kým se poradit. Jak se budete vy, aplikační vývojář hodnocený za produktivitu, prát s problémy? Jak zůstanete agilním vývojářem a zajistíte optimální výkon v rozsahu celého vyvíjeného systému? Pokud je na nejvyšším místě hodnocen výkon, nezačnete náhodou bojovat s výkonem kódu v aplikaci a zároveň i v databázi? Pokud ano, pak vězte, že nejste sami. Jde o rostoucí trend a vzniká jasná potřeba rozsáhlého profilování a optimalizace v rámci celých vyvíjených systémů. Předmětem tohoto článku je posouvající se role správců databází a aplikačních vývojářů včetně představení zásadních nástrojů pro tvorbu, dolaďování a provoz výkonných aplikací.
Specializace se stává dávnou minulostí
Zhruba před osmi lety jsem byl součástí datového integračního týmu, který pracoval na projektu datových skladů. Tým se skládal především z konzultantů, včetně datových architektů, modelářů dat, databázových vývojářů, správců databází, specialistů na integraci, aplikačních vývojářů a specialistů na obchodní logiku. Každá skupina specialistů si zvolila vlastní nástroje a nikdy se neodchýlila od daného pracovního zadání. Celý projekt byl velice nákladný. Jakmile se datový sklad dostal do výroby, záměry vedení projektu byly jasné: snížit veškeré nepotřebné náklady předáním znalostí v rámci týmu, rozvázání pracovního poměru s většinou konzultantů a sdílení povinností v rámci významně zmenšeného týmu.
V dnešní škrtící ekonomické situaci dává pramálo obchodního smyslu zaměstnávat velký počet projektových specialistů pracujících na jediném projektu. Žádný rozpočet na zeměkouli by toto neunesl. Neznamená to ovšem, že by podnikatelé hodlali jakkoli zpomalovat. Více než kdy dříve dnes vládne smýšlení "udělat víc s méně zdroji" a nejvyhledávanější pracovníci se musejí umět přizpůsobit a mít širší záběr - tedy být méně specializovaní.
Tohle platí i pro správce databází. Přestože mají zvyk zaměřovat se na dostupnost a výkon produkčních systémů, potřebují zahrnovat stále více databázových platforem. Počet aplikací zpracovávajících hromadná data roste a správci databází mají čím dál tím méně času pomáhat během vývojových cyklů. Ti aplikační vývojáři, kteří pracují s databázemi, potřebují vyšší úroveň sebejistoty, aby jim neunikl špatně fungující kód do produkčních systémů (kde oprava chyb stojí podstatně víc peněz).
Optimalizace aplikačního zásobníku.
Při tvorbě systémů v agilním vývojovém prostředí potřebujete dobré nástroje, abyste se nehonili za nesprávnými či neexistujícími problémy. Potřebujete nástroje, které odhalí úzká místa v projektech a pomohou vám zaměřit se na kód, na kterém záleží a třeba i odstranit "mrtvý" kód a tím zmenšit celkovou velikost paměti nutné pro vaši aplikaci. Například vývojáři v Javě potřebují vidět do všech vrstev zásobníku aplikací jak během vývoje, tak při testování a provozu. Během vývoje jim statická měření umožní zjišťovat složitost kódu, statické audity pak zajistí, aby se vytvářel a spravoval nejlepší možný kód. Dále měření sníží nároky na přepracování kódu, protože umožní odstranit problém ještě před tím, než se do centra pozornosti dostane další vrstva.
Další specializované nástroje obsahují profilování paměti a procesoru, pokročilou analýzu vláken, hloubkové výpisy pokrytí kódu a profilování distribuovaných komponent v Javě, takže aplikační vývojáři mohou báječně jemně doladit svůj kód. Každá z těchto vrstev vyžaduje pozornost, aby byl zajištěn vysoký výkon; zvlášť když se aplikace přesunují k funkčnímu či zátěžovému testování.
V závislosti na velikosti a složitosti vývojářské organizace jsou v různých okamžicích vývojového cyklu používány různé nástroje a různá kritéria pro přijmutí či odmítnutí aplikace. Často jsou stejné nástroje pro odhalování soupeření vláken, nadbytečného zamykání, úniků paměti, problémů nedostatku dočasného úložného prostoru a úzkých míst procesoru používána i v oddělení zajišťování kvality. Následně tato oddělení sdílí záznamy či "momentky" stavu vláken, procesorů či paměti s vývojem. Zpřesní se tak spolupráce a zrychlí se vyřešení. Spolupráce mezi odděleními vývoje a testování se tak zlepšuje a dobrý vztah mezi odděleními celkově pomáhá podnikání.
Další nástroj, který byste měli použít při testování a ladění svých aplikací je pokrytí kódu. Řekne vám, který kód se vykonává, včetně frekvence každé třídy a každé metody až po samotný řádek kódu. Tím se snadno vyřadí nepoužitý aplikační kód a sníží se paměťové nároky. Můžete též odhalit jaké testovací případy JUnit se využívají během ověřování kvality, takže si můžete zajistit vhodné pokrytí ve zpětném pohledu. Pokud jsou testovací případy vytvořeny během vývoje, ale nikdy se nespustí během ověřování kvality, celková kvalita výsledku může být ohrožena. Možnost takového pohledu do struktury aplikace pak je zcela zásadní.
A konečně existují distribuované komponenty, ze kterých se skládají aplikace v Javě, včetně EJB, JSP, JMS a JDBC (a spousty dalších), které typicky potřebují ladit. V případě JDBC a aplikací využívajících databáze vám mnoho nástrojů dovolí zobrazit podrobnosti příkazů SQL a průběhu vykonávání kódu, a to i s měřením času a frekvence.
Ačkoli je však taková informace užitečná na vysoké úrovni pro aplikační vývojáře, je omezená z pohledu vyhodnocení úzkých míst v databázi nebo ladění kódu v SQL na vysoký výkon. Následkem je to, že v aplikaci stále zůstává černá skříňka, do které nemůžete nijak zasáhnout.
Jak se vlomit do černé skříňky
V minulosti nebyly k dispozici snadno použitelné nástroje pro příležitostné vývojáře v SQL, pomocí kterých by se mohli vyrovnávat s úzkými místy výkonu v databázích. Tito vývojáři byli v tomto ohledu zcela závislí na dostupnosti a ochotě správců databází. Jsou dva jednoduché způsoby, jak se s tím vyrovnat. Za prvé můžete ladit SQL v průběhu jeho vývoje, nebo až v okamžiku zjištění, že JDBC tvoří úzké místo aplikace. Druhý případ ošetříte profilováním databáze při testování, kterým odhalíte neúčelný a pomalý kód SQL a můžete jej dávkově ladit na maximální výkon.
Pokud dáváte přednost ladění každého příkazu zvlášť (ať již v průběhu jejich zápisu, nebo po analýze distribuované komponenty Java), stačí prostě předhodit příkaz SQL ladicímu nástroji.
Ladicí nástroj poskytne pokyny, přepsání SQL a indexů tak, aby zrychlil kód SQL na jediné stisknutí tlačítka. Pokyny pracují jako GPS pro váš kód tím, že řeknou databázi, které kroky má provést, aby vykonání příkazu bylo nejrychlejší. Přepisy SQL skutečně opravují kód tak, aby odstranily běžné chyby jako kartézský součin nebo potlačený index, které mohou databázi srazit na kolena. Analýza indexů se ponoří do databáze a hledá v ní možnosti vylepšení výkonu, které by zrychlily vytahování výsledkových množin.
Jak již jsem zmínil, nástroje pro profilování a optimalizaci Javy mají často své místo v odděleních ověřování kvality. Stejně tak nástroje pro profilování a optimalizaci databází nyní snadno mohou pomáhat ve vývojových odděleních, kde se dají odhalovat a analyzovat úzká místa v aplikacích ještě před tím, než se momentky stavu předají správcům databází. Skoro zázračně tak často vzniká dobrý synergický vztah mezi vývojáři aplikací a správci databází.
Nástroj, jenž odstraňuje složitost odhalování a určování kódu SQL s nízkým výkonem může výsledky své činnosti zobrazovat na jednoduchém řídícím panelu. Například to, co je obvykle obsahem 30 stránek textového výpisu z programu Oracle Statspack je nyní mapováno do srozumitelného grafu s vrcholy a údolími spolu s příslušným kódem SQL. Místo abyste se museli spoléhat na správce databáze (jehož pozornost by měla být stejně zaměřena na provoz), který by pro vás dekódoval 30 stránek textu a poradil vám, jak se s výkonnostním problémem vyrovnat, stačí vám profilovat databázi, vytvořit vizuální momentku a zaměřit se na hlavní oblast kódu SQL, který způsobuje degradaci výkonu databáze i aplikace.
Pokud byste ale pozornost správce databáze nutně potřebovali, můžete mu vždy předat momentky, které správcům dovolí rychle najít tu správnou příčinu problémů - a to je něco, co jistě ocení. Řídící panel může zvýraznit kód SQL, který vyžaduje vaši pozornost. Stejným způsobem, jakým jste předali kód SQL ladicímu nástroji, můžete přenést libovolný kód SQL z profilace do ladicího nástroje a vytvořit sadu návrhů pro opravu jednotlivých příkazů ... a pak vybrat tu opravu, která má nejlepší výkon. A to vše na jediný stisk knoflíku.
S vybavením podobnými nástroji přichází čas změnit typická rozdělení práce a vlomit se do černých skříněk. Jedině tak můžete vpravdě vlastnit výkon vytvářeného kódu jak v aplikaci, tak v databázi a vyplnit prázdný prostor vzniklý po konsolidaci zdrojů v kulhající ekonomice jistotou neslýchaného výkonu. Pro aplikačního vývojáře prostě dnes platí: optimalizuj, nebo zkrachuj.
Greg Nerpouni je starší produktový manažer pro vývojářská řešení u společnosti Embarcadero technologies. Odpovídá za nástroje pro zvyšování produktivity a optimalizaci výkonu vývojářů, pracovníků oddělení kvality a správců databází. Má více než 13 let zkušeností s vedením vývoje produktů a poskytováním profesionálních služeb. Můžete jej kontaktovat na adrese greg.nerpouni@embarcadero.com. Gregovy krátké prezentace o produktech, o kterých v článku mluví, najdete na YouTube:
- The Smart Way to Manage Database Changes
http://www.youtube.com/watch?v=g-NUmOXhM-U - Database Change Management, Change Manager 5.1 is generally
available!
http://www.youtube.com/watch?v=21TyyVi_Bkk - SQL Profiling and Tuning, Stress Testing with DB Optimizer
http://www.youtube.com/watch?v=zjWfM88njWA - Java and Database Peformance Optimization Offerings, J
Optimizer, DB Optimizer, and Performance Center
http://www.youtube.com/watch?v=YbU_G1YNV_8 - Java Profiling
and Tuning, J Optimizer 2009
http://www.youtube.com/watch?v=XdmQ8iOp1Y0