<?xml version="1.0" encoding="UTF-8"?>
<posts type="array">
  <post>
    <body>Jeg skal hastighedsoptimere en Java applikation. Den skal performe max p&#229; kortest mulige tid. Den kan ikke skalere udad som man normalt ville &#248;nske men kun opad. Det vil sige en enkelt supermaskine med 16 CPU'er og 16G ram i 64bit software. 

I de senere &#229;r er kravet om hurtigere CPU hastigheder er faldet mens kravet om antal CPU'er er steget. Grunden er at en hurtig processor bruger mere str&#248;m end to processorer p&#229; den samme kraft og man udnytter alts&#229; forholdet mellem ydeevne og forbrug.

Problemet med at skalere en Java applikation er f&#248;rst og fremmest at Java ikke kan udnytte en &#230;gte multicore arkitektur s&#229; den &#248;nskede effektivitet kan opn&#229;s. Man kan tilf&#248;re s&#229; mange CPU'er man vil men Java kan ikke udnytte dem. Dog kan man sige at sige at Java processerne f&#229;r mere frihed idet de andre processer p&#229; maskinen som fx databaser kan k&#248;re p&#229; andre cores. 

Selve Java applikationen er en heterogen monolitisk struktur og den skal eksekveres som en 32bit applikation. Det vil sige at den kun kan udnytte 2G hukommelse eller mindre. Det betyder desv&#230;rre ogs&#229; at man skalere p&#229; den laveste f&#230;llesn&#230;vner. 

Men hvad sker der n&#229;r man flytter en applikation fra en dual core maskine til en &#230;gte fysisk 16 core maskine? Min interesse i sagen er kun henvendt p&#229; i hvilken udtr&#230;kning Java kan udnytte de mange processorer. Hvis Java kun kan udnytte en processor m&#229; applikationen kunne k&#248;re p&#229; samme vis som p&#229; andre duals maskiner. Hvad ville der ske hvis Java kunne udnytte flere CPU&#8217;er og de enkelte processer uds&#230;ttes for &#230;gte samtidighed, alts&#229; potentielt mange samtidige eksekvererne tr&#229;de i samme objekt?   

To ting vakte min opm&#230;rksomhed. Dels en memory leak og dels en slags forvirring omkring konfiguration og resourcer som fx databaseforbindelser. Memory leaks i applikationen skyldes bla ikke frigjorte v&#230;rdier fra hukommelsen. Den andre adf&#230;rd var mere underlig. Applikationen kunne k&#248;re skiftevis langt f&#248;r en tilstand reageret p&#229; manglede resourcer.  

Til min store overraskelses opdager jeg efter flere timers debug session at problemet ligger i ThreadLocal objektet i Java eller rettere dem m&#229;de man bruger dem p&#229;. Applikations designeren binder databaseforbindelser i disse tr&#229;d relaterede objekter. N&#229;r en container tr&#229;d d&#248;r tager den de lokale objekter med sig. Men n&#229;r 64bit maskinen bestemmes sig for at skifte CPU mister alle threadlocals konteksts. Det betyder at konfiguration og resources bliver frigivet midt i k&#248;rselen. 

ThreadLocal har v&#230;ret en meget brugt strategi gennem mange &#229;r og benyttes til at b&#230;re fx et ID gennem en applikation b&#229;de i en tr&#229;d men jeg vil p&#229;st&#229; at det er et antipattern at benytte den til andet fx databaseforbindelser. 

l&#230;s: Thread-local storage

Efter udbedrelse af problemerne k&#248;re softwaren fint p&#229; 64bit maskinen. Java installationen bruger to, m&#229;ske tre CPU'er til at eksekvere Java softwaren. N&#229;r man skalere er det &#248;nskeligt at kunne skalere line&#230;rt, alts&#229; ved en fordobling af kraft for&#248;ger man hastighed gange to. Reelt set k&#248;re denne Java applikation p&#229; en af de 16 hurtige CPU ad gange og udnyttelsen af den fine hardware stinker max. 

Hvis man vil kunne skalere sine applikationer m&#229; man skrive dem til multicore.

&quot;Small Things, Loosely Joined, Written Fast&quot;:posts/122-Small-Things-Loosely-Joined-Written-Fast</body>
    <category-id type="integer" nil="true"></category-id>
    <created-at type="datetime">2008-11-01T09:51:34Z</created-at>
    <id type="integer">124</id>
    <post-id type="NilClass">124</post-id>
    <published type="boolean">true</published>
    <tag-id type="NilClass">45</tag-id>
    <title>Scaling Enterprise Java on 64-bit MultiCore</title>
    <updated-at type="datetime">2008-11-02T22:50:31Z</updated-at>
  </post>
  <post>
    <body>Den perfekte storm er en storm som pr&#230;cis kan overvindes uden alvorlige komplikationer til f&#248;lge. Indenfor aktiehandle fors&#248;ger man at bygge systemer der kan h&#229;ndter virkeligt mange handler p&#229; kort tid.

For en capture virksomhed betyder det liv eller d&#248;d at deres systemer kan gennemf&#248;re 150.000 handler i sekundet og alle under 5 millisekunder. Samtidig stiger eftersp&#248;rgsel eksplosivt. Derfor kan de kun overleve hvis deres systemer er bygget til at kunne h&#229;ndtere fremtidige krav. Alts&#229; en perfekt storm p&#229; deres system.

Det er den form for udfordringer vi st&#229;r overfor i den parallelle computer verden. Hvis vores systemer bliver belastet mere end de kan klare bryder de samme. Det sker at en forretning opn&#229;r virkelig stor succes og f&#229;r dermed nye problemer med at klare eftersp&#248;rgselen. For ledelsen betyder det at de m&#229; opmande p&#229; alle vigtige poster lige som IT afdelingen skal kunne skalere b&#229;de hardware og software.

Man taler om line&#230;r skalerbarhed. Linear skalerbarhed har en enorm indvirkning p&#229; omkostninger for enhver virksomhed. Denne egenskab vokser betydeligt i applikationer som er basset p&#229; on-demand-priss&#230;tning. De fleste systemer, is&#230;r klassiske n-lags arkitektur kan ikke skalere line&#230;rt.

Linear skalerbarhed betyder, at systemet er i stand til at &#248;ge sin kapacitet i en line&#230;r relation til m&#230;ngden af ressourcer der tilf&#248;res. Fx hvis en server kan behandle 50 transaktioner i sekundet, to servere kan behandle 100, ti servere kan behandle 500 og s&#229; videre. Ikke-line&#230;rt skalerbare systemer st&#229;r over for faldende kapacitet for hver supplerende tilv&#230;kst. S&#229; mens den f&#248;rste server kan behandle 50, to servere kan kun behandle 85, tre servere vil behandle 110 og s&#229; videre. P&#229; et eller andet tidspunkt vil et ikke line&#230;rt skalerbart system opleve at tilf&#248;rte ressource ikke giver ekstra kapacitet.

De almindelige &#229;rsager til dette omfatter database forbindelser og l&#229;se, persistens og transport mekanismer for messaging middleware og ESB. Erfaring siger at traditionelle arkitekturer dvs. n-niveau applikationer ofte st&#229;r overfor denne p&#229;stand. Amdahl's lov giver os en formel til at beregne hvilken effekt forskellige ting som p&#229;virker vores evne til at skalere. Applikationer kan modsvare flere forskellige egenskaber. Fx kunne man forud set en vis succes og bygge derefter. Nogle brancher skal kunne klarer en ekstra kapacitet p&#229; 4000% pr &#229;r. Andre applikationer er brygget til at kunne klare spidsbelastning.

Man kan opn&#229; ekstra skalerbarhed gennem ved at designe systemet p&#229; en anden m&#229;de, skriver udvalgte dele om eller omdefinere systemets arkitektur. M&#229;ske er pr&#230;misserne for systemet omdefineret og man m&#229; tilpasse systemet til de nye pr&#230;misser. Et vigtigt punkt er valg af hardware, ofte er de trufne valg meget konservativt og basset p&#229; rutine frem for bevis.

Men i alle tilf&#230;lde vil det betyde &#248;konomisk katastrofe. De &#248;konomiske aspekter skal holdes oppe imod hvad system-nedetid koster og hvad betyder det at v&#230;re uden oppetid i en time, et d&#248;gn? Kan virksomheden overleve? I vores medie tider er fejl lig med pressebev&#229;genhed. Hvor risikovillig er virksomheden p&#229; dette omr&#229;de?

Langt de fleste IT systemer jeg har set kan slet ikke skalere. Ofte skyldes det ikke d&#229;rlige teknologi valg men blot ligegyldighed. Teknologien er valgt p&#229; forh&#229;nd af folk som d&#229;rligt kender de essentielle krav til systemet eller til forretningen.

Desv&#230;rre er skalerbarhed f&#248;rst noget der dukker op efter en mere end &quot;The Perfect Strorm&quot;
</body>
    <category-id type="integer">4</category-id>
    <created-at type="datetime">2008-08-29T02:00:00Z</created-at>
    <id type="integer">117</id>
    <post-id type="NilClass">117</post-id>
    <published type="boolean">false</published>
    <tag-id type="NilClass">45</tag-id>
    <title>The perfect storm</title>
    <updated-at type="datetime">2008-08-29T02:01:50Z</updated-at>
  </post>
  <post>
    <body>Jeg har lige h&#248;rt John Davies for syvende gang over de seneste &#229;r og det er altid en forn&#248;jelse. John er en world wide veteran indenfor IT konferencer og har v&#230;ret aktiv konsulent siden c programmeringssproget var state of the art. Gennem &#229;rerne har han haft adskillige store stillinger og firmaer med specialer som (SWIFT, FpML, ISO-20022. osv). John taler om investeringsbanker og alle de udfordringer som de m&#248;der s&#229;som, ekstrem hastighed, reaktionsevne og absolut garanti. 

Garanteret garanti aspektet bliver sat i alvorligt perspektiv n&#229;r en vendor bliver holdt til ansvar for hver og eneste besked, lidt af en mundfuld n&#229;r man t&#230;nker p&#229; at en SWIFT besked med udligning af kontobel&#248;b mellem landekonti er p&#229; samme bel&#248;b som en vendor er v&#230;rd og der bliver sent nogle hundrede om dagen. 

N&#229;r man arbejder med investeringssystemer betyder reaktionstid og hastighed alt. Systemerne er sat op til at gennemf&#248;re handler ved meget pr&#230;cise udregnede gr&#230;nser og hvis disse systemer halter blot 10 millisekunder i forhold til de andre investeringssystemer er det dem der l&#248;ber med de gode handler. Det er ikke for sjov at alle de store investeringsforretninger ligger t&#230;t placere op ad hinanden og enkelte endda direkte ovenp&#229; b&#248;rsen i London. Investeringsforretningerne ligger ogs&#229; i umiddelbar n&#230;rhed af de st&#248;rste backbones for at hindre at eventuelle routere stj&#230;ler den vigtige beslutnings tid. 

I forhold til traditionelle systemer er disse ogs&#229; specielle p&#229; en anden m&#229;de. Deres maximale respons tid er m&#229;ske nede p&#229; ca. 3 millisekunder og det s&#230;tter sp&#248;rgsm&#229;l som &quot;vil du k&#248;be MS aktie nu&quot; i relief. Ethvert sp&#248;rgsm&#229;l skal  behandler enorme m&#230;ngder af data inden det er muligt at svare. Det er mere normalt at man loader alt data ind i memory om morgenen og gemmer for lang tid arkiv om aftenen efter handlerne er overst&#229;et. 
 
Ydermere kan der arbejde ofte flere tusind mennesker p&#229; selvsamme systemer. Det kr&#230;ver en fornuftig planl&#230;gning og k&#248;ligt overblik at have s&#229; mange programm&#248;rer til at arbejde sammen ude en direkte samh&#248;righed. 

Service stak 

I flere foredrag taler John ogs&#229; om den software stak der fortr&#230;kkes i de banker hvor hans virksomhed er tilknyttet. Denne gang sagde han at Applikation servere er for nedadg&#229;ende i den slags banker. Det har l&#230;nge v&#230;ret s&#229;dan at man ikke m&#229; benytte EJB fordi de er langsomme og ikke persistent nok. John er glad for teknologier som GIGAspaces og Java Spaces.  

Enlig ville jeg gerne skrive lidt om SWIFT formatet. Men det bliver nok f&#248;rst om lidt. I det gamle Javahouse arbejdede vi for en bank med SWIFT formatet. Jeg ville &#248;nske vi p&#229; det tidspunkt have set det SWIFT API som John har lavet i sit firma, C24.  
</body>
    <category-id type="integer">11</category-id>
    <created-at type="datetime">2008-01-31T05:15:00Z</created-at>
    <id type="integer">96</id>
    <post-id type="NilClass">96</post-id>
    <published type="boolean">false</published>
    <tag-id type="NilClass">45</tag-id>
    <title>High performance architecture</title>
    <updated-at type="datetime">2008-02-06T04:31:11Z</updated-at>
  </post>
  <post>
    <body>Hvis din objektmodel er replikeret over flere VM'er, s&#229; er sandsynligheden for at alle crasher samtidigt, lige s&#229; lille som at DB's diske crasher. S&#229; kan man rent faktisk arbejde med crash-tolerant memory og antage at heap'en aldrig slettes. Det fjerner hele behovet for et data-access layer, for applikationens model er jo crash-resilient. 


Det betyder at man kan droppe databasen og bruge memory i stedet. 

Halvdelen af alle framevorks i Java handler om O/R mappingsproblemet og der er skrevet indtil flere design patterns som attakere netop dette problem som fx valuebean(VB) og datatransferobject(DTO) der er strukturelle m&#248;nster. 

Enlig er det en ret enkelt og ligetil proces. Problemet er at det er trivielt og at vi i mange &#229;r skrevet tusind af klasser som g&#248;r pr&#230;sis det samme. En s&#229;kaldt serverside programm&#248;r lever af at mappe tabeller og relationer i databasen til en objektmodel til trods trods for at tabeller og objekter er to vidt forskellige konstruktioner. Firkantede database tabeller passer ikke lige over til et rent objektorienteret paradigme.


Et par gode kolleger fra Javahouse tiden og jeg selv, inviterede Owen Taylor til Danmark for at tale i et par banker og i cybercomgroup headquarter. Owen er specialist i Giga Spaces teknologien. Det helt essentielle ved Spaces er hastighed og skalerbarhed. Men i tilgift f&#229;r man en sjov afledt effekt. Et typisk forl&#248;b er at man preloader en m&#230;ngte data fra databasen om morgenen hvorefter arbejdet begynder. Efter arbejdet kan man evt. gemmer nye data. Resten af tiden benyttes kun memory. Alle objekter er persistente og replikerede. 

Eneste logiske grund til at opdatere databasen er at interaktion med legacy systemer. Selve spaces er aldrig nede.


Den helt store fordel er at man kan fjerne hele databasen og alle de gamle problemer med O/R mapping og hele dataaccess layer i den gammeldags software model. 

Der er fortaget unders&#248;gelser som viser at backend programmering(O/R mapping) tager ca. 60 procent af alt udviklingstid. 

</body>
    <category-id type="integer">13</category-id>
    <created-at type="datetime">2007-08-14T00:12:00Z</created-at>
    <id type="integer">59</id>
    <post-id type="NilClass">59</post-id>
    <published type="boolean">false</published>
    <tag-id type="NilClass">45</tag-id>
    <title>Drop Databasen</title>
    <updated-at type="datetime">2008-04-08T07:29:18Z</updated-at>
  </post>
  <post>
    <body>Take A Look at the SpaceFacade Pattern, Owen Taylor of GigaSpaces discusses how space-based architecture is fundamentally different from traditional architectures and how it supports the potent pattern, Master/Worker. He addresses state management, event distribution, performance, reliability and interoperability. &lt;a href=&quot;http://go.techtarget.com/r/1245074/5224861&quot;&gt; here &lt;/a&gt;

Vil du s&#230;lge dine Microsoft aktier lige nu? Eller vil du helle k&#248;be flere? Dette valg har meget at g&#248;re med den historiske baggrund for netop denne aktie. Som minimum vil du sikkert gerne vide hvilken pris de sidst er handlet til, og m&#229;ske vil du ogs&#229; gerne vide hvordan udviklingen har v&#230;ret de sidste 6 m&#229;neder. M&#229;ske vil du oven i k&#248;bet vide om Microsoft i n&#230;rmeste fremtid er ved at lancere et nyt styresystem. Hasta la vista, Baby!

Lad os antage at du har 5 millisekunder til at finde ud af det! Og lad og lege at der samtidigt med dig findes ca. 5000 andre som stiller sig det samme sp&#248;rgsm&#229;l netop nu!

Tja,, du vil ha lidt sv&#230;rt ved at overskue det hele. Det vil langt de fleste systemer ogs&#229;. Men der finder en specielle systemer der kan klare opgaver af denne art. Systemer bruger udelukkende indenfor pengehandle og milit&#230;r.

Disse systemer har det til f&#230;lles at de skal virker hurtigere end alle de andre system af samme slags. Det er maskinerne som bekriger hinanden n&#229;r der handles v&#230;rdipapirer. De arbejder s&#229; hutigt at de ikke har tid til databserne som jo normalt ellers holder p&#229; data. De skal v&#230;re super robuste og v&#230;re klar til at reager n&#229; som helst. De skal kunne regenerer sig selv og v&#230;re voldsomt skalerbare grundet kraftige spidsbelastninger.

Den slags applikationsegenskaber kan opn&#229;s ved brug af et space. GigaSpaces er et system p&#229; benytter den teknologi. Et space kan betragtes som en f&#230;lles hukommelse alle kan deler. (red, fluffy cloud) En klient s&#230;tter et object ind i spaces og derefter kan alle bruge det.

Interfacet ind til spaces er meget simple. Det best&#229;r kun 4 metoder(CRUD). I space lever objekter og kan deles umiddelbart efter de er initialiseret. Man deler typisk metoder og beskeder. Events er beskeder. 

Denne model frav&#230;lger fuldst&#230;ndigt den traditionelle tier model. Den beskriver ingen logisk opdeling(layering) af applikationen men rekomendere POJO. 

I traditionelle l&#248;sninger er multilayer modellen meget brugt. Den skulle m&#229;ske afl&#248;ses af POJO's men det har lange udsigter. N&#230;sten alle laver stadig gammeldags layering selvom mange nye frameworks ikke fordre denne opdeling. Selvf&#248;lgelig kan man opdele sin applikation i fysiske lag, specelt hvis man har en virkelig god grund. 

I mange &#229;r har vi alle lave disse lag p&#229; baggrund af en tegning fra SUN. Den viser denne lagopdelte model hvor man ikke kan se andet en tekniske komponenter. Halvdelen af disse komponenter var EJB 2.x. og skulle naturligvis gemmes bag stateless facader. Heldigvis er EJB ikke EJB mere efter 3.x specifikationen men blot trasaktionellen komponenter. De objeker som kom ud af facederne var value-objecter(dto), men dem beh&#248;ver man heller ikke mere. 

Hvorfor skal vi s&#229; blive ved at bygge alle de lag?  </body>
    <category-id type="integer">13</category-id>
    <created-at type="datetime">2007-03-01T12:04:00Z</created-at>
    <id type="integer">26</id>
    <post-id type="NilClass">26</post-id>
    <published type="boolean">false</published>
    <tag-id type="NilClass">45</tag-id>
    <title>Multi level applications are dead</title>
    <updated-at type="datetime">2008-04-03T09:18:13Z</updated-at>
  </post>
</posts>
