skillPOOL Szakértői Klaszter

skillPOOL Szakértői Klaszter

Hogyan írjunk lassú alkalmazást ?

avagy az „M” opció haszontalansága

2014. december 04. - CoDe kft

christmas-progress.jpgAkkor beszélgessünk róla. [ Ugye tegezhetlek ? Kösz. ]

  • GL: Hogyan írjunk lassú alkalmazást ? (ezt itt én mondom)
  • Te: Milyen alkalmazást ? (ezt itt Te mondod)
  • GL: Szinte bármilyet.
  • Te: Tervezzük meg alaposan !
  • GL: Jó ötletnek tűnik.

Szedjük össze a szükséges inputokat, a böngészőből, adatbázisokból, hívjuk meg a szükséges web szolgáltatásokat, végezzük el a számításokat, állítsuk össze a kumulált adatokat, írjuk vissza az egészet az adatbázisba és a felhasználói felületre – esetleg az eredménnyel is hívjunk meg egy másik rendszert, majd zárjuk le a tranzakciót. Eközben naplózzunk minden egyes általunk fontosnak vélt lépést.

Ha mindez elkészült, kezdhetjük a következő kéréssel.

Tudom ! Senki nem tervez ilyen programot – esetleg egy volt kolléga távoli ismerőse, aki csak vi-vel tud szöveget szerkeszteni - de azért tegyük fel a példa kedvéért, hogy mégis.

A program (valószínűleg) hibátlanul működik – amíg használatba nem veszik, mert akkor kiderül , hogy  lassú.

Csináljunk vele valamit.

Itt jön az „M” (menedzser) opció: Vegyünk nagyobb gépet – ezt ignoráljuk.

Nézzük meg miért lassú. Mit látunk? A CPU nincs kihasználva, az I/O aktivitás alacsony. Akkor mi történt?

Szép szekvenciális programunk ott futkározik a (majdnem) legkorszerűbb gépünknek hol egyik, hol másik magján. Van belőle vagy 4-8-16, mert annyi kell egy szerverbe. Minél több van annál kisebb átlagos terhelést látunk.

  • Te: Szuper ! Ezt tanultuk az iskolában ! Többszálasítunk !
  • GL: Lehet ? Nem lehet ? Ha igen, hogyan ?

Sok kérdés jön még itt, mire megleljük (ha megleljük) a helyes választ.

  • A feldolgozás algoritmusa megengedi, hogy egyszerre több szálon dolgozzuk fel ?
  • Nincsenek ezek egymásra hatással ?
  • Esetleg a feldolgozás sorrendje is fontos ?

[ Gyógypedagógiás példa egy backend alkalmazás esetén: az egymást követő feladatok: létrehozni egy új ügyfelet, majd beállítani a hitelkereteit. Ne próbáljuk meg ezt a két dolgot párhuzamosítani ! ]

Tegyük fel, hogy a feldolgozandó kérések mégis csak függetlenek, és valami webes frontendről származnak.

  • Te: Akkor többszálasítsunk ! Minden kérés külön száll.
  • GL: Jó ötlet(nek tűnik). Amíg 2-5-10 párhuzamos kérésünk van. És ha 100, vagy 10000 ?

Tudom, vannak thread poolok és Te ilyet nem csinálsz– de annak a volt kollégának a távoli ismerőse is tudott róla, és mégis …

Aztán van még egy gond – vagy kettő.

Az egyik az, hogy a két hasonló művelet jó eséllyel az adatbázis azonos tábláit fogja piszkálni és az adatbázis kezelő szépen sorba rakja a kéréseket. (Ugye fel sem merül olyan eszköz használata, ami ezt nem teszi, vagy a tranzakció kezelés ignorálása.)

A másik gond az, hogy több párhuzamos kérés esetén a válaszidő – jó esetben és egy ideig - alig fog nőni, de az egyes kérések válaszideje nem csökken – márpedig drága felhasználónknak előjön a homok allergiája, ha homokórát lát.

„M” (menedzser) opció: Vegyünk nagyobb gépet – egyelőre még ignoráljuk.

Nincs más hátra, gondolkodni kell – és mérni. Rájövünk, hogy az idő jelentős része megy el a logolással, az üzenetek megszerkesztésével és lemezre írásával.

  • Te: Csökkentsük le a logolások mennyiségét.
  • GL: Rossz ötlet.

Nyilván azért tettük bele, mert így követhető mi is történik a programunkban, ami annyira komplex, hogy már mi sem értjük pontosan, jövő hónapra pedig biztosan elfelejtjük. Amikor meg szüksége lesz valakinek rá, már régen egy másik cégnél dolgozunk. Opció törölve.

  • Te: Akkor kapcsoljuk ki az éles rendszerben – ott úgyse fejlesztünk.
  • GL: Rossz ötlet.

Soha nincs nagyobb szükség a részletes logra, mint akkor, amikor az éles rendszeren találunk olyan hibát, ami csak a téli napfordulót követő harmadik munkaszüneti napon jön elő.

[ Jelen sorok írója töltötte már a szilveszter délelőttjét bankban, mert azokban az években, amikor szilveszter keddre esik az utalások a következő év szilveszterére lettek időzítve. ]

Ezt az opciót is töröljük.

  • Te: Akkor most hogyan tovább ?

Logolni kell, sokat logolni jó, várni a feldolgozással, hogy ez megtörténjen nem jó. Ne várjuk meg.
Még szerencse, hogy az iskolában tanítottak olyat, hogy szinkron és aszinkron kommunikáció. A szerencsésebbek még emlékeznek rá. A logolandó adatokat gyűjtsük össze, és küldjük el egy üzenetben egy jó vágású naplózó szálnak, majd az elszöszmötöl vele. Szerverünkben meg úgyis hemzsegnek az unatkozó processzor magok.

  • Te: Heuréka. Akkor most gyorsabbak vagyunk.
  • GL: De nem eléggé.
  • Te: Akkor most jöhet az „M” (menedzser) opció: Vegyünk nagyobb gépet?
  • GL: Talán még ne.

Ha ez az üzenetküldés ilyen jó ötletnek tűnik a naplózásnál, nem lehetne ezt máshol is használni ? Hát (háttal nem kezdünk mondatot – csak indokolt esetben), amikor a feldolgozás eredményével meghívunk egy web szolgáltatást, meg kell azt nekünk várni ? Nem.(*) Akkor használjunk ott is üzenetküldést !

(*) – Ennek ugye az a feltétele, hogy olyan üzenetküldő infrastruktúrát használjunk, ami garantálja az üzenetek célba érkezését.

Lehet, hogy a felhasználói válaszban sincs szükség a teljes feldolgozás eredményére ? Nosza, hasítsuk azt is ketté !

  • Te: Akkor most hol tartunk ?
  • GL: A feldolgozásunkat nem párhuzamosítottuk, hanem sorosítottuk (lásd még: pipe line).

Miért jó ez ? Az egyes részek dedikált feladatot látnak el, mindegyik megkaphatja a maga erőforrásait – ide értve a CPU magokat is. Ezek nagy valószínűséggel nem fognak ütközni. A válaszidő lerövidült, a CPU erőforrásait hatékonyan ki tudjuk használni.

  • Te: És ha még mindig nem elég gyors ?
  • GL: Még mindig nem tartunk az (M) opciónál.

Most, hogy a feldolgozást fázisokra osztottuk, már meg tudjuk nézni, hogy mi nem elég gyors. Na, azt a fázist kell párhuzamosítani – feltéve, ha megfelel a fenti feltételeknek.

  • Te: És ha még mindig nem elég gyors ?
  • GL: Most alkalmazzuk az (M*) opciót
  • Te: Mi az a (M*) opció ? 
  • GL: Vagy inkább az (M) opció módosított változatát.

Most már tudjuk, hogy nem egyszerűen „nagyobb” gépet kell venni, de már pontosan ismerjük az alkalmazásunk erőforrás igényeit, és tudjuk, hogy memóriában, CPU-ban vagy I/O kapacitásban alakult ki a szűk keresztmetszet.

Én pontosan tudom, hogy mindenki (Te is) pontosan így jár el, de a volt kollégám távoli ismerőse számára ezt biztos újdonság, és megkértem a nagyszakállút, hogy csempéssze ma a csizmájába.

Gács Lajos

EAI Architect

 

 

 

A bejegyzés trackback címe:

https://skillpool.blog.hu/api/trackback/id/tr276956723

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása