<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alt om ingenting og litt i mellom &#187; IT</title>
	<atom:link href="http://hovenko.no/blog/tag/it/feed/" rel="self" type="application/rss+xml" />
	<link>https://hovenko.no/blog</link>
	<description>En blogg av Knut-Olav</description>
	<lastBuildDate>Mon, 10 Mar 2025 19:25:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Millioner av filer i samme katalog på filsystemet i Linux</title>
		<link>https://hovenko.no/blog/2014/12/02/millioner-av-filer-i-samme-katalog-pa-filsystemet-i-linux/</link>
		<comments>https://hovenko.no/blog/2014/12/02/millioner-av-filer-i-samme-katalog-pa-filsystemet-i-linux/#comments</comments>
		<pubDate>Tue, 02 Dec 2014 17:15:16 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Infrastruktur]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[IT]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=854</guid>
		<description><![CDATA[På jobb her om dagen kjørte vi i to-hundre (nye filer i sekundet) &#8220;rett i en veggen&#8221;, da antallet filer på filsystemet ble for mange og alt gikk i stå. Hovedsaklig møtte vi på to problemer: ingen flere ledige inodes, og lang venting på å liste ut alle filene, med millioner av filer lagret i [...]]]></description>
			<content:encoded><![CDATA[<p>På jobb her om dagen kjørte vi i to-hundre (nye filer i sekundet) &#8220;rett i en veggen&#8221;, da antallet filer på filsystemet ble for mange og alt gikk i stå.</p>
<p>Hovedsaklig møtte vi på to problemer: ingen flere ledige inodes, og lang venting på å liste ut alle filene, med millioner av filer lagret i én og samme katalog.</p>
<p>Filene ble lagret på filsystemet <a href="https://ext4.wiki.kernel.org/">EXT4</a> i Linux, Ubuntu 14.04.1 LTS.</p>
<p>EXT4 har en fastsatt grense for antall filer som filsystemet kan håndtere, og denne settes under oppretting av filsystemet, så denne kunne vi ikke endre.<br />
Videre klarer ikke EXT4 å håndtere stort mer enn ca 100k filer i én og samme katalog uten at alt går i sneglefart.</p>
<p>Vi måtte finne et nytt filsystem, noe som ikke hadde noen øvre grense for antall filer, med unntak av diskplass så klart.</p>
<h2>Andre filsystemer til unnsetning</h2>
<p>Vi måtte gjøre noen tester for å finne ut hvilket filsystem vi kan bruke istedenfor EXT4.<br />
Kandidatene vi kom fram til var <a href="https://btrfs.wiki.kernel.org/">BTRFS</a>, <a href="http://en.wikipedia.org/wiki/XFS">XFS</a> og <a href="http://en.wikipedia.org/wiki/ZFS">ZFS</a>.</p>
<p><small>I tillegg vurderte vi <a href="http://en.wikipedia.org/wiki/OneFS_distributed_file_system">OneFS</a>, et produkt fra Isilon som vi allerede har kjørende i produksjon, et nettverkslagringssystem som er spesialisert til å håndtere veldig store datamengder, men dette produktet er heller ikke bra til å håndtere veldig mange filer i én katalog.<br />
Vi kan rett og slett ikke bruke den på grunn av risiko for å krasje hele filsystemet og ta med oss alle andre systemer i produksjon som bruker dette.<br />
</small></p>
<p>Testingen jeg gjorde er relativt enkel:</p>
<ol>
<li>Opprettet tomme filer på 20 GB, loopback-montert og formattert med filsystemet som skulle testes</li>
<li>Kopierte 1.6M (<strong>1.644.553</strong>) filer på til sammen 19 GB, alle i én katalog, til hver av filsystemene</li>
<li>Tømte Linux OS-cache før testing av hvert filsystem</li>
<li>Tok tiden for detailjert sortert utlisting (kald test)</li>
<li>Tok tiden for detailjert sortert utlisting enda en gang (varm test)</li>
<li>Tok tiden for usortert utlisting (varm test)</li>
</ol>
<p><small>I tillegg tok jeg noen notater om komprimeringsgrad for de filsystemene som støttet komprimering, og hvor mye OS-cache og minne som ble brukt etter gjennomført testing.<br />
Maskinene har noen bakgrunnsprosesser som vil kunne allokerer noe minne mens testene kjøres, men jeg anses aktiviteten på disse som lite i forhold til ressursbeslaget disse testene vil gjøre.<br />
</small></p>
<p>Hastighet på lesing eller skriving av innholdet i filene er ikke det viktigste for oss.<br />
Det er små filer, fra 50 KB til 500 KB, så det er viktigere at vi kan lese flere filer raskt enn å lese én stor fil raskt.</p>
<p>Vi trenger et filsystem som lar oss jobbe med filene, skrive nye filer, flytte filer og kopiere filer når behovene melder seg, istedenfor å krype stille sammen for å dø &#8211; altså er uthenting av metadata om filer og utlisting av filene viktige kriterier.</p>
<p>For å tømme OS-cache på Linux kjørte jeg følgende kommando:</p>
<pre><code>
echo 3 | sudo tee /proc/sys/vm/drop_caches
</code></pre>
<p>For utføring av testen &#8220;detailjert sortert utlisting&#8221; kjørte jeg følgende kommando:</p>
<pre><code>
time ls -lht KATALOG | wc -l
</code></pre>
<p>For utføring av testen &#8220;usortert utlisting&#8221; kjørte jeg følgende kommando:</p>
<pre><code>
time ls -1 -U KATALOG | wc -l
</code></pre>
<p>Disse kommandoene tar tiden for å liste ut filer.<br />
I steden for å bruke tid på å printe ut all teksten til konsollet så gjorde jeg en telling av linjer, som også ble en verifikasjon på at jeg hadde kopiert over alle filene til alle filsystemene som ble testet.</p>
<h3>Testoppsett</h3>
<p>Filene lå opprinnelig på Server1 på et EXT4-filsystem.<br />
Disse ble kopiert over til Server2 hvor testene av de andre filsystemene ble gjort.<br />
Server2 hadde omtrent ingen annen aktivitet mens testene pågikk, så målingene skal være nokså nøyaktige.<br />
For å måle opp mot problemet vårt ble også testene gjennomført på Server1 mot EXT4.<br />
I tillegg gjennomførte jeg en test på Server1 over NFS mot XFS-filområdet til Server2.</p>
<p>Filsystemene ble i hovedsak opprettet med standard-opsjoner på Ubuntu 14.04.1 LTS.<br />
Komprimering ble aktivert i BTRFS og ZFS.</p>
<h2>Resultater</h2>
<p>På Server1 gjennomførte jeg en tømming av OS-cache, men målte ikke minneallokeringsbruk, da det er andre tjenster som kjører på serveren, og det kunne gitt villedende resultater.</p>
<p>NFS-testen fra Server1 mot Server2 sitt XFS-testoppsett mangler noen måletall, tall jeg anså som uviktige å måle på grunn av nettverksseparasjonen.<br />
Den kalde testen av detaljert utlisting av filer ble ikke gjennomført over NFS.</p>
<p>Skriving av filer til ZFS ble merkbart tregere for hver fil som ble skrevet &#8211; i starten var overføringshastigheten over 6.5 MB/s, men slutta på 3.2 MB/s.<br />
Usikkert om det skyldes komprimering, diskstørrelse eller andre årsaker.</p>
<table cellspacing="0" border="0">
<colgroup width="220"></colgroup>
<colgroup span="5" width="85"></colgroup>
<tr>
<td height="17" align="left"></td>
<td align="center" bgcolor="#E6E6FF"><b>Server1</b></td>
<td align="center"><b>Server2</b></td>
<td align="center"><b>Server2</b></td>
<td align="center"><b>Server2</b></td>
<td align="center"><b>Server1</b></td>
</tr>
<tr>
<td height="47" align="left"></td>
<td align="center" bgcolor="#E6E6FF"><b>EXT-4</b></td>
<td align="center"><b>BTRFS</b></td>
<td align="center"><b>XFS</b></td>
<td align="center"><b>ZFS</b></td>
<td align="center"><b>NFS over Server2 XFS</b></td>
</tr>
<tr>
<td height="17" align="left"><b>Block-size (GB)</b></td>
<td align="center" bgcolor="#E6E6FF" sdval="83" sdnum="1044;">83</td>
<td align="center" sdval="10" sdnum="1044;">10</td>
<td align="center" sdval="25" sdnum="1044;">25</td>
<td align="center" sdval="10" sdnum="1044;">10</td>
<td align="center"></td>
</tr>
<tr>
<td height="17" align="left"><b>Diskbruk (GB)</b></td>
<td align="center" bgcolor="#E6E6FF" sdval="19" sdnum="1044;0;0,0">19,0</td>
<td align="center" sdval="8" sdnum="1044;0;0,0">8,0</td>
<td align="center" sdval="19" sdnum="1044;0;0,0">19,0</td>
<td align="center" bgcolor="#FFFF00" sdval="6,5" sdnum="1044;0;0,0">6,5</td>
<td align="center"></td>
</tr>
<tr>
<td height="17" align="left"><b>KB / inode</b></td>
<td align="center" bgcolor="#E6E6FF" sdval="16" sdnum="1044;0;0,0">16,0</td>
<td align="center" bgcolor="#FFFF00" sdval="1" sdnum="1044;0;0,0">1,0</td>
<td align="center" bgcolor="#FFFF00" sdval="1" sdnum="1044;0;0,0">1,0</td>
<td align="center" bgcolor="#FFFF00" sdval="0,5" sdnum="1044;0;0,0">0,5</td>
<td align="center"></td>
</tr>
<tr>
<td height="17" align="left"><b>detailjert sortert utlisting (kald)</b></td>
<td align="center" bgcolor="#E6E6FF" sdval="0,00233796296296296" sdnum="1044;0;MM:SS">03:22</td>
<td align="center" sdval="0,0025" sdnum="1044;0;MM:SS">03:36</td>
<td align="center" bgcolor="#FFFF00" sdval="0,00130787037037037" sdnum="1044;0;MM:SS">01:53</td>
<td align="center" sdval="0,00578703703703704" sdnum="1044;0;MM:SS">08:20</td>
<td align="center">???</td>
</tr>
<tr>
<td height="17" align="left"><b>detailjert sortert utlisting (varm)</b></td>
<td align="center" bgcolor="#E6E6FF" sdval="0,000509259259259259" sdnum="1044;0;MM:SS">00:44</td>
<td align="center" sdval="0,000219907407407407" sdnum="1044;0;MM:SS">00:19</td>
<td align="center" bgcolor="#FFFF00" sdval="0,000185185185185185" sdnum="1044;0;MM:SS">00:16</td>
<td align="center" sdval="0,000381944444444444" sdnum="1044;0;MM:SS">00:33</td>
<td align="center" sdval="0,00532407407407407" sdnum="1044;0;MM:SS">07:40</td>
</tr>
<tr>
<td height="17" align="left"><b>usortert utlisting (varm)</b></td>
<td align="center" bgcolor="#E6E6FF" sdval="0,0000231481481481481" sdnum="1044;0;MM:SS">00:02</td>
<td align="center" sdval="0,0000231481481481481" sdnum="1044;0;MM:SS">00:02</td>
<td align="center" bgcolor="#FFFF00" sdval="0,0000115740740740741" sdnum="1044;0;MM:SS">00:01</td>
<td align="center" sdval="0,000173611111111111" sdnum="1044;0;MM:SS">00:15</td>
<td align="center" sdval="0,000173611111111111" sdnum="1044;0;MM:SS">00:15</td>
</tr>
<tr>
<td height="17" align="left"><b>Allokert RAM (GB)</b></td>
<td align="center" bgcolor="#E6E6FF" sdnum="1044;0;MM:SS">???</td>
<td align="center" sdval="5,9" sdnum="1044;">5,9</td>
<td align="center" sdval="3,45" sdnum="1044;">3,45</td>
<td align="center" bgcolor="#FFFF00" sdval="3,3" sdnum="1044;">3,3</td>
<td align="center"></td>
</tr>
<tr>
<td height="17" align="left"><b>OS-cache (GB)</b></td>
<td align="center" bgcolor="#E6E6FF" sdval="0,1" sdnum="1044;">0,1</td>
<td align="center" sdval="3,7" sdnum="1044;">3,7</td>
<td align="center" bgcolor="#FFFF00" sdval="0,8" sdnum="1044;">0,8</td>
<td align="center" sdval="1,4" sdnum="1044;">1,4</td>
<td align="center"></td>
</tr>
<tr>
<td height="17" align="left"></td>
<td align="left"></td>
<td align="left"></td>
<td align="left"></td>
<td align="left"></td>
<td align="left"></td>
</tr>
</table>
<p><small>Tid ble målt i minutter og sekunder.<br />
BTRFS, XFS og ZFS allokerer inodes dynamisk.<br />
</small></p>
<p>EXT4 var eneste som hadde et maksimalt antall inodes.<br />
BTRFS rapporterte ikke om inodes i &#8220;df -i&#8221;, verken ledige eller brukte.<br />
Både XFS og ZFS var fleksible i ledige inodes som ble rapportert og endret seg i takt med ledig diskplass.</p>
<p>Alle filsystemene gjennomførte testene innen akseptabel hastighet når systemet var varm.<br />
Allikevel var BTRFS og XFS de raskeste her med svar på under 20 sekunder, mens ZFS brukte 33 sekunder og EXT4 brukte 44 sekunder.</p>
<p>XFS var klart raskest når systemet var kald med svar på under 2 minutter.<br />
EXT4 og BTRFS var nokså like med omkring 3,5 minutter når systemet var kald.<br />
ZFS brukte uakseptabel lang tid (over 8 minutter) når systemet var kald.</p>
<p>EXT4, BTRFS og XFS leverte et akseptabelt raskt svar på usortert utlisting av filene, på maksimalt 2 sekunder.<br />
XFS var raskest, på 1 sekund.<br />
ZFS brukte uakseptable 15 sekunder.</p>
<p>Alle filsystemene unntatt EXT4 allokerte mye minne og cache for å utføre testene.<br />
Det er usikkert om loopback-monteringen på Server2 kan ha hatt innvirkning.<br />
EXT4 allokerte bare 109 MB som cache, men den var også noe tregere enn de andre når systemet var varm.<br />
XFS allokerte 3.5 GB minne, hvorav 830 MB cache.<br />
ZFS allokerte 3.3 GB minne, hvorav 1.4 GB cache.<br />
BTRFS allokerte 5.9 GB minne, hvorav 3.7 GB cache.</p>
<h2>Konklusjon</h2>
<p>Vi anså XFS til å være best for våre behov.<br />
Den leverte svar innen akseptabel tid både da systemet var kaldt og varmt, og var også den raskeste til å levere usortert utlisting av filene.</p>
<p>ZFS skuffet stort med uakseptabelt trege svar.<br />
BTRFS brukte for mye minne, men ellers virket den lovende.</p>
<p>Felles for både BTRFS og ZFS var at komprimering var aktivert.<br />
Kanskje kunne minnebruken vært lavere for både BTRFS og ZFS om testingen ble utført uten komprimering.</p>
<p>Det er <a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/log/fs/btrfs">god aktivitet rundt BTRFS i Linux-kildekoden</a> og ser ut til å bli arvtakeren til EXT3/4.<br />
BTRFS har funksjoner for blant annet komprimering og snapshotting, og det vil være aktuelt med ny vurdering av BTRFS senere.</p>
<h2>Avslutning-rant</h2>
<p>Etter at ny diskenhet ble koblet til Server1 og XFS ble satt opp, så dukket et nytt problem fram &#8211; overføring av filene fra EXT4-partisjonen til den nye XFS-partisjonen gikk i trege 1 MB/s.<br />
Løsningen ble å overføre filene tilbake fra Server2 sitt XFS-filsystem over NFS&#8230;</p>
<p>Et enda større problem møtte vi med en annen katalog, som inneholder omkring 1.1 millioner kataloger, som igjen inneholder filer, men mer om dette kan diskuteres over et par kanner kaffe &#8211; jeg har god tid&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2014/12/02/millioner-av-filer-i-samme-katalog-pa-filsystemet-i-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bigdata RDF-server erfaringer</title>
		<link>https://hovenko.no/blog/2014/06/23/bigdata-rdf-server-erfaringer/</link>
		<comments>https://hovenko.no/blog/2014/06/23/bigdata-rdf-server-erfaringer/#comments</comments>
		<pubDate>Mon, 23 Jun 2014 09:13:25 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Infrastruktur]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Bigdata]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RDF]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=813</guid>
		<description><![CDATA[I jobbsammenheng jobber jeg mye med modellering av data i RDF. Vi har lenge lagret RDF-grafer som filer på disk, men har den siste tida undersøkt flere RDF-databaser. Felles for de fleste grafdatabaser er at de trives best i RAM. Store installasjoner som skryter av å lagre milliarder av tripler består enten av servere med [...]]]></description>
			<content:encoded><![CDATA[<p>I jobbsammenheng jobber jeg mye med modellering av data i <a href="http://www.w3.org/RDF/">RDF</a>.</p>
<p>Vi har lenge lagret RDF-grafer som filer på disk, men har den siste tida undersøkt flere RDF-databaser.</p>
<p>Felles for de fleste grafdatabaser er at de trives best i RAM.<br />
<a href="http://www.w3.org/wiki/LargeTripleStores">Store installasjoner som skryter av å lagre milliarder av tripler</a> består enten av servere med masse minne, eller av mange maskiner i et kluster som tilsammen innehar mye minne &#8211; da snakker vi størrelsesorden hundrevis av GB RAM.</p>
<h2>Tidligere tester av RDF-databaser</h2>
<p>Vi har tidligere testet <a href="http://jena.apache.org/documentation/serving_data/index.html">Jena Fuseki</a> og <a href="http://virtuoso.openlinksw.com/">OpenLink Virtuoso</a>, men begge har sine irriterende problemer.</p>
<h3>Jena Fuseki TDB</h3>
<p>Jena Fuseki med TDB blir fort ubrukelig når databasen blir større enn Java heap-size, og den feiler ofte med OutOfMemoryError.<br />
Testet med 4 GB Java-heap.</p>
<h3>OpenLink Virtuoso</h3>
<p>OpenLink Virtuoso har vi testet i versjon 6 og versjon 7.<br />
Versjon 6, som følger med i pakkesystemet til Ubuntu, støttet ikke SPARQL UPDATE.<br />
Versjon 7 feiler når vi prøver å laste inn grafer som inneholder mange blank nodes, selv om vi klarte å hacke oss til en løsning ved å splitte opp insertene i mindre deler.<br />
Generelt sett har Virtuoso flere irriterende problemer, blant annet at den ikke forstår &#8220;INSERT DATA&#8221; fra SPARQL UPDATE &#8211; her måtte vi bruke &#8220;INSERT INTO&#8221;.</p>
<h2>Bigdata</h2>
<p>Jeg har i noen dager testet <a href="http://www.bigdata.com/">Bigdata</a>, en server for lagring og spørring over RDF-data.</p>
<p>Bigdata-serveren er en Java-applikasjon som kjører i en standard Servlet applikasjons-container.</p>
<h2>Innlasting av data</h2>
<p>Datagrunnlaget er oppdelt i 525K (<strong>525.000</strong>) grafer &#8211; dokumenter i RDF/TURTLE-format.</p>
<p>Grafene inneholder mange blank nodes, ressurser som ikke er navngitte og globalt identifisérbare med IRI.<br />
Grunnen til at vi bruker blank nodes er fordi vi konstruerer ressurser sammensatt av data fra kildesystemer som ikke tilordner ID-er til disse konseptene.<br />
Dersom vi skulle konstruert ID-er for disse ressursene må vi bruke mye energi og mange kodelinjer for å holde de ID-ene stabile, for å tilordne de samme ID-ene ved neste eksport fra kildesystemet &#8211; da er det mye enklere å konstruerer blank nodes.</p>
<p>Innlasting av data ble gjort graf for graf i form av <a href="http://www.w3.org/TR/sparql11-update/">SPARQL UPDATE</a>-meldinger over HTTP, hver delt i to seksjoner &#8211; først sletting av eksisterende tripler i grafen, for så innsetting av nye tripler i samme graf.</p>
<p>Sletting av grafer er en viktig funksjon i vårt tilfelle, da vi ønsker å bytte ut alle tripler fra en eventuell gammel versjon av grafen med tripler fra en ny versjon.<br />
Utskiftingen av hele grafer ønsker vi å gjøre som en atomisk operasjon for å unngå at en graf fremstår som tom før nye data lastes inn.</p>
<h3>Serveroppsett</h3>
<p>Jeg startet med å kjøre Bigdata i en Jetty-container på en server med 4 GB RAM og 100 GB disk &#8211; <strong>dbdev01</strong>.<br />
Med unntak av lokasjonen til journal-fila (databasen til Bigdata), kjørte jeg med standardinnstillinger og 2 GB Java-heap.</p>
<h3>Datamengder</h3>
<p>Mot denne lastet jeg inn ca 450K (<strong>450.000</strong>) grafer.<br />
Dette utgjorde i overkant av 84M (<strong>84.000.000</strong>) tripler.</p>
<p>Journal-fila vokste til 14 GB.</p>
<h3>Ytelse ved innlasting av data</h3>
<p>I starten klarte jeg å laste inn ca 10 grafer per sekund.<br />
Det er ikke spesielt imponerende hastighet, men siden dette var en test så lot jeg prosessen fortsette.<br />
Etter ett døgn var hastigheten nede i 2-3 grafer per sekund.<br />
Etter to døgn var hastigheten nede i 1-2 grafer per sekund.</p>
<p>Å gjøre SPARQL-spørringer mot databasen samtidig som importen pågikk var bortimot ubrukelig, selv enkle spørringer som å hente ut navn på 60 ressurser.<br />
Samtidig sakt importhastigheten ned til ca 1 graf per 10 sekunder.</p>
<p>Da var 450.000 grafer importert, 85% av datasettet vårt, som for tiden øker med ca 100.000 grafer per år.<br />
Dette skalerer ikke.<br />
Bestemte meg for å avbryte importen.</p>
<h3>Ny server med mer minne</h3>
<p>Jeg fikk en ny server til rådighet, med 32 GB RAM og 100 GB disk &#8211; <strong>dbdev02</strong>.<br />
Serveren kjørte allerede noen tjenester, så jeg hadde ca 28 GB RAM ledig.<br />
Ellers var det lite last på serveren.</p>
<p>Jeg kopierte journal-fila på 14GB fra dbdev01 til dbdev02, og starta opp Bigdata på begge servere, samme konfigurasjon, og med 1 GB Java heap.</p>
<h2>Ytelsestester spørringer</h2>
<p>Gjorde samme tester mot begge serverne.</p>
<h3>Test #1</h3>
<p>Første spørringen mot serveren er en SPARQL-spørring med datofiltrering og dybde på 5 (Vedlegg 1).<br />
Resultatet fra spørringen er ca 80K (<strong>80.000</strong>) løsninger, i SPARQL RESULTS XML-format på 75 MB.</p>
<p>Ved kald, nyoppstartet Bigdata var dbdev02 (24s) vesentlig raskere enn dbdev01 (2m31s).</p>
<p>Ved gjentatte utføringer av samme spørring var begge servere nokså like raske, også etter kjøring av andre relativt enklere spørringer i mellomtiden.</p>
<h3>Test #2</h3>
<p>En annen spørring som ga store utslag var med dybde på 4, uten filtrering og med LIMIT 100.000 (Vedlegg 2).<br />
Resultatet fra spørringen er ca 53K (<strong>53.000</strong>) løsninger, i SPARQL RESULTS XML-format på 22 MB.<br />
Resultatet var altså mindre enn den angitte begrensningen på 100K.</p>
<p>dbdev02 (1m19s) var mye raskere enn dbdev01 (12m23s).<br />
Dette var med varm database.</p>
<h3>Innlasting av data mot 32 GB minne</h3>
<p>En ny test av import av data, som inkluderer overskriving av gamle grafer, denne gang gjort mot dbdev02 med 32 GB minne, viser en importhastighet på ca 5 grafer i sekundet.</p>
<h2>Analyse av testresultatene</h2>
<p>Den største forskjellen er rett etter Bigdata nettopp har starta opp.<br />
Mange av spørringene som ga store utslag etter kald oppstart returnerte omtrent like raskt etter gjentagende spørringer.<br />
Dataene i resultatet blir muligens cachet et sted.</p>
<h3>Minne</h3>
<p>dbdev01 har etter noen spørringer lite ledig RAM, mens dbdev02 har mye ledig RAM.<br />
Det kan tyde mot at Bigdata har det bedre når mye av datafila ligger i minnet.</p>
<h3>Diskytelse</h3>
<p>Hjelper nok også om disken er rask.<br />
Virker som at disken er raskere på dbdev02 enn dbdev01.<br />
En test lokalt på hver server viser at kopiering av fil på 1 GB tok 14.5s på dbdev01 og 6.2s på dbdev02.<br />
Ingen prosesser på noen av boksene som bruker nevneverdig mye disk-IO når Bigdata idler.</p>
<h3>Swapping</h3>
<p>Kanskje swapping på dbdev01 kan være årsak, selv om swap-aktiviteten for tiden er lav.</p>
<p>Munin-graf over minne for dbdev02 viser en økning på 16GB i cache (fil-cache) etter oppstart av Bigdata.<br />
Null swapping.</p>
<p>Munin-graf over minne for dbdev01 er fullstendig mongo, går opp og ned som en jojo i den perioden Bigdata har kjørt (2 dager).<br />
Viser også mye swapping, spesielt under inserts.</p>
<h2>Konklusjon</h2>
<p>Bigdata trives veldig godt med mye RAM og bruker operativsystemets filcache for å få rask aksess til dataene.</p>
<p>Bigdata feiler ikke like dramatisk som Jena Fuseki TDB når minnet går fullt.<br />
Selv om vi endte opp med å teste Bigdata med mer minne enn vi testet med Jena Fuseki TDB, så taklet Bigdata med 4 GB minne mye større datasett enn Jena Fuseki TDB klarte med det samme.</p>
<p>Det er ikke så viktig med stor Java heap under innlasting av data.<br />
Heap-størrelsen øker når det gjøres spørringer, så større heap har kanskje en positiv effekt ved mange og tunge spørringer.</p>
<p>Den nye innlastingstesten viser at Bigdata er mye raskere på innlasting av data dersom den har nok minne til databasen.</p>
<h2>Vedlegg</h2>
<h3>Vedlegg 1: SPARQL Test #1</h3>
<p>SPARQL-spørring som lister ut avspilt musikk i en tidsperiode på én måned:</p>
<p><code>
<pre>
PREFIX dct: &lt;http://purl.org/dc/terms/&gt;
PREFIX ebuccdm: &lt;http://www.ebu.ch/metadata/ontologies/ebuccdm#&gt;
PREFIX digas: &lt;http://id.nrk.no/2013/digas/class/&gt;
PREFIX xsd: &lt;http://www.w3.org/2001/XMLSchema#&gt;

SELECT * WHERE {
  GRAPH ?g {
    ?part a digas:Music .
    ?timeline ebuccdm:hasTimelineTrackPart ?part .
    ?prog ebuccdm:hasTimelineTrack ?timeline .
    ?trans ebuccdm:playsOut ?prog .

    ?part dct:title ?partTitle .
    ?prog dct:title ?progTitle .
    ?trans ebuccdm:publicationStartDateTime ?startTime .
    FILTER ( ?startTime &gt;= &quot;2014-01-01T00:00:00+01:00&quot;^^xsd:dateTime ) .
    FILTER ( ?startTime &lt; &quot;2014-02-01T00:00:00+01:00&quot;^^xsd:dateTime ) .
  }
}
ORDER BY ?startTime
</pre>
<p></code></p>
<h3>Vedlegg 2: SPARQL Test #2</h3>
<p>SPARQL-spørring som lister ut medvirkende på programmer med en begrensning på 100.000 resultater:</p>
<p><code>
<pre>
PREFIX nrk: &lt;http://gluon.nrk.no/dataordbok.xml#&gt;
PREFIX dct: &lt;http://purl.org/dc/terms/&gt;
PREFIX ebuccdm: &lt;http://www.ebu.ch/metadata/ontologies/ebuccdm#&gt;

SELECT ?obj ?title ?contactName ?roleName
WHERE {
    ?obj a nrk:programme .
    ?obj dct:title ?title .
    ?obj ebuccdm:hasContributor ?contributor .
    ?contributor ebuccdm:contactName ?contactName .
    ?contributor ebuccdm:hasRole ?role .
    ?role ebuccdm:roleName ?roleName .
} LIMIT 100000
</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2014/06/23/bigdata-rdf-server-erfaringer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Redshift &#8211; a Linux tool for late nights</title>
		<link>https://hovenko.no/blog/2012/09/06/redshift-a-linux-tool-for-late-nights/</link>
		<comments>https://hovenko.no/blog/2012/09/06/redshift-a-linux-tool-for-late-nights/#comments</comments>
		<pubDate>Thu, 06 Sep 2012 21:16:26 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[English-posts]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[verktøy]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=773</guid>
		<description><![CDATA[Redshift is a nice Linux tool for adjusting the color temperature of the screen according to time of the day. At night this tool makes the screen a bit warmer, so your eyes wont &#8220;hurt&#8221; so much of the otherwise so bright display of your desktop background, browser or editor. You provide the tool with [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jonls.dk/redshift/" title="Redshift">Redshift</a> is a nice Linux tool for adjusting the color temperature of the screen according to time of the day.</p>
<p>At night this tool makes the screen a bit warmer, so your eyes wont &#8220;hurt&#8221; so much of the otherwise so bright display of your desktop background, browser or editor.</p>
<p>You provide the tool with your approximately geo coordinates and some value for upper and lower limit of color temperature, then it will automatically and continuously change color temperature all through day and night.</p>
<p>Example command for running this tool, if your&#8217;re in Norway:<br />
<code>
<pre>
$ redshift -l 60.0:10.0 -t 5700:3600 -g 0.8 -m vidmode -v
</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2012/09/06/redshift-a-linux-tool-for-late-nights/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cryptic error message from Courier IMAP server &#8211; Permission Denied</title>
		<link>https://hovenko.no/blog/2012/07/02/cryptic-error-message-from-courier-imap-server-permission-denied/</link>
		<comments>https://hovenko.no/blog/2012/07/02/cryptic-error-message-from-courier-imap-server-permission-denied/#comments</comments>
		<pubDate>Mon, 02 Jul 2012 00:40:24 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[English-posts]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Courier-IMAP]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=749</guid>
		<description><![CDATA[I have debugged this error message for the last couple of days. Jul 1 23:11:56 lance imapd: LOGIN, user=knut-olav@hoven.ws, ip=[::ffff:AAA.BBB.CCC.DDD], port=[48700], protocol=IMAP Jul 1 23:11:56 lance imapd: knut-olav@hoven.ws: Permission denied The solution was pretty simple. The /tmp folder had bad permissions. This server was only meant for hosting email services, so bad permissions on /tmp [...]]]></description>
			<content:encoded><![CDATA[<p>I have debugged this error message for the last couple of days.<br />
<code>
<pre>Jul  1 23:11:56 lance imapd: LOGIN, user=knut-olav@hoven.ws, ip=[::ffff:AAA.BBB.CCC.DDD], port=[48700], protocol=IMAP
Jul  1 23:11:56 lance imapd: knut-olav@hoven.ws: Permission denied</pre>
<p></code></p>
<p>The solution was pretty simple.</p>
<p>The /tmp folder had bad permissions. This server was only meant for hosting email services, so bad permissions on /tmp folder was actually not an issue earlier.</p>
<p>I guess the wrong permissions were caused by my custom XEN node setup using multiple partitions, including a partition just for /tmp.</p>
<p><strong>Debugging was quite hard</strong></p>
<p>Authentication was successful, as I got a different error message when authenticating with a known bad password.</p>
<p>I debugged it using strace. It wasn&#8217;t easy, as courier imap forks out child processes for each connection, which I had to strace as well.</p>
<p><code>
<pre># strace /usr/sbin/couriertcpd -address=0 -maxprocs=40 -maxperip=20 -nodnslookup -noidentlookup 143 /usr/lib/courier/courier/imaplogin /usr/bin/imapd Maildir</pre>
<p></code></p>
<p>Connect to port 143 using telnet.<br />
Log in using this command:<br />
<code>
<pre>i login MY_EMAIL_USERNAME MY_PASSWORD
</pre>
<p></code></p>
<p>Then find the imap process PID. Look for a process running as user <tt>vmail</tt>:</p>
<p><code>
<pre>$ ps axuw|grep imapd
#...
vmail      362  0.0  1.0   4616  1344 ?        S    01:46   0:00 /usr/bin/imapd /var/spool/mail/vmail/hoven.ws/knut-olav/Maildir/
#...
</pre>
<p></code></p>
<p>In this case, the PID is 362. Then attach strace to it using <tt>strace -p 362</tt>, as sudo.</p>
<p>From the telnet interface, I entered a couple of commands like these:<br />
<code>
<pre>2 select "INBOX"
5 UID fetch 1:10 (UID RFC822.SIZE FLAGS BODY.PEEK[HEADER.FIELDS (From To Cc Bcc Subject Date Message-ID Priority X-Priority References Newsgroups In-Reply-To Content-Type)])
</pre>
<p></code></p>
<p>Then I found this somewhere down into the strace output:<br />
<code>
<pre>
open("/tmp/tmpfWsezjv", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied)
write(2, "ERR: knut-olav@hoven.ws: Permiss"..., 43) = 43
</pre>
<p></code></p>
<p><strong>Fixing the problem</strong><br />
<tt>chmod 1777 /tmp</tt></p>
<p>As I wrote earier&#8230; a simple solution.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2012/07/02/cryptic-error-message-from-courier-imap-server-permission-denied/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Strukturell utviklingsarkitektur</title>
		<link>https://hovenko.no/blog/2011/04/05/strukturell-utviklingsarkitektur/</link>
		<comments>https://hovenko.no/blog/2011/04/05/strukturell-utviklingsarkitektur/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 18:47:43 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Arkitektur]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[arkitektur]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[prosjektstruktur]]></category>
		<category><![CDATA[prosjektstyring]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=649</guid>
		<description><![CDATA[Programkode har ikke alltid samme struktur som kjørende kode. Det kan være dynamisk kode som blir generert, malverksfiler som kompileres, konfigurasjon som hentes inn fra flere kilder som kan overstyres under kjøring. CSS og Javascript er også programmeringsspråk og bør behandles således. Kode kjører i forskjellige miljøer, enten det er på en web-server, i en [...]]]></description>
			<content:encoded><![CDATA[<p>Programkode har ikke alltid samme struktur som kjørende kode. Det kan være dynamisk kode som blir generert, malverksfiler som kompileres, konfigurasjon som hentes inn fra flere kilder som kan overstyres under kjøring.</p>
<blockquote class="left"><p>CSS og Javascript er også programmeringsspråk og bør behandles således.</p></blockquote>
<p>Kode kjører i forskjellige miljøer, enten det er på en web-server, i en virtuell maskin, en applikasjonsserver, i nettleseren eller instruksjoner som dynamisk bygges opp og sendes til eksekveringsmotorer som gjør en jobb og sender ferdig prosessert data tilbake. Det kan være preprosessorer som ved kompilering skriver om deler av programkoden.</p>
<p>Dette er noe å tenke på når man strukturerer opp prosjektet i kataloger og filer.</p>
<h3>Forskjellige programmeringsspråk krever forskjellige strategier</h3>
<p>Noe man kanskje ikke tenker så mye på mens man forsøker å konfigurere opp prosjektet til å kjøre Java-testene eller kompilere C-fila, er at en løsning ofte består av flere enn ett programmeringspråk. Om man utvikler web-løsninger er CSS og Javascript blitt en selvfølge. CSS og Javascript er programmeringsspråk og bør behandles således.</p>
<p>Javascript er et nesten like gammelt språk som Java, men det er først de siste årene at tradisjelle utviklere har fått øynene opp for hva som er mulig med Javascript. Desto mer man gjør i Javascript desto større er behovet for å teste funksjonaliteten. Det er fullt mulig å kjøre automatiserte enhetstester mot Javascript-kode, og det finnes verktøy for å detektere typiske feil og påpeke klassiske fallgruver. Det finnes også verktøy for å minifisere Javascript slik at filene blir mindre og legger mindre beslag på båndbredden til brukerne av systemet, og ikke minst like viktig er at det kan spare kostnader ved å senke krav til båndbredde fra systemet. Tilsvarende finnes det verktøy for CSS som minifiserer filene og som kan analysere filene og detektere ineffektive regler og duplikate regler som aldri inntreffer.</p>
<h3>Retningslinjer</h3>
<p>Mange programmeringsspråk har anbefalinger til hvordan programkode skal struktureres. Om systemet som skal lages hovedsaklig skal skrives i ett programmeringsspråk kan man følge dette språkets retningslinjer. I retningslinjene defineres gjerne hva en typisk fil skal inneholde, navngiving, indentering, kontrollkode, feilhåndtering, hvordan filene plasseres i en katalogstruktur og mye annet. Perl-prosjekter struktureres ofte etter <a href="http://search.cpan.org/perldoc?perlnewmod">CPAN sine retningslinjer</a>, PHP-prosjekter struktureres ofte etter <a href="http://pear.php.net/manual/en/standards.php">PEAR sine retningslinjer</a> og <a href="http://java.sun.com/blueprints/code/projectconventions.html">Java har sine retningslinjer</a>.</p>
<div class="wp-caption alignnone"><a href="http://www.flickr.com/photos/sciencemuseum/3322440276/"><img alt="" src="http://farm4.static.flickr.com/3149/3322440276_9be5a6d9c2.jpg" title="Construction of the East Block, Science Museum, London, 28 April 1916. Foto: Flickr/Science Museum London (CC)" width="500" height="357" /></a><p class="wp-caption-text">En by bygger seg ikke selv. Foto: Flickr/Science Museum London (CC)</p></div>
<p>Det har de siste årene blitt populært å bruke Maven som kontrollsystem for prosjekter, spesielt for Java-prosjekter, men kan også brukes til andre programmeringsspråk som PHP og Javascript. Man bruker gjerne Maven som en innpakking av prosjektet, til bygging av systemet, kjøre tester, pakketere og rulle ut nye versjoner. Det legger ingen føringer for hvordan man strukturerer innholdet av filer i prosjektet.</p>
<p>Det er ingen fasit når det kommer til struktur av prosjekter, men dersom man er flere som arbeider på samme prosjekt kan det være smart å bli enige om hvilke retningslinjer man skal følge.</p>
<h3>Ikke all kode er programkode</h3>
<blockquote class="right"><p>Tester skal støtte oppunder løsningen og gi en god og stabil leveranse.</p></blockquote>
<p>Den viktigste delen av løsningen er det kjørbare systemet, og det er dette som skal gi merverdi til bedriften. Dokumentasjon, tester, byggerammeverk og utviklingsmiljø er biprodukter; støttefunksjoner som skal bidra til å gi et godt og kjørende system.</p>
<p>Maven brukes, som nevnt ovenfor, gjerne til bygging av løsningen og til å kjøre opp web-server under utvikling, men Maven er ikke en del av det kjørbare systemet i leveransen.</p>
<p>Tester, som enhetstester og funksjonstester, er ikke programkode og trenger ikke behandles som det. Tester skal støtte oppunder løsningen og gi en god og stabil leveranse. Tester bør holdes utenfor katalogstrukturen til programkoden. Det kan være løsere retningslinjer til testene, for eksempel friere navngiving av tester, ingen maksimal linjelengde eller flatere katalogstruktur.</p>
<h3>Testene dine er viktige fordet!</h3>
<p>En god test er en verifikator om at en funksjon fungerer. En god test er presis på hva den tester og er lett å lese og forstå.</p>
<p>En god praksis er å navngi testene etter hva de tester. Et eksempel kan være en test som skal teste at en kunde som heter &#8220;Ola&#8221; har adresse &#8220;Drammensveien&#8221;, og denne testen kan da hete <code>test_kunden_ola_har_adresse_drammensveien</code>, selv om dette ikke stemmer overens med for eksempel Java&#8217;s camelcase.</p>
<p>En testfunksjon skal teste en ting, og kun én ting. Du trenger ikke å teste at du har korrekt brukernavn og passord i konfigurasjonen for hver eneste test du skriver. Hvis navnet på testen indikerer at en brukers adresse skal kontrolleres så skal testen gjøre det, og lite annet. Samme testen kan gjerne teste forskjellig input dersom det virker hensiktsmessig. For eksempel kan en e-postadresse-validator kontrollere flere godkjente e-postadresser, men kanskje bør det være en egen testfunksjon for verdier som skal feile valideringen.</p>
<h3>Samhandling med andre arkitekturprinsipper</h3>
<p>Det er mulig å kombinere struktur på utviklingsmiljøet med andre arkitekturvalg. For enkle web-løsninger er trelagsarkitekturen MVC (model-view-controller) populær, hvor man skiller applikasjonslogikk fra datamodell og presentasjon, og man kan plasserer filer i en katalog navngitt etter laget hvor de hører hjemme.</p>
<p>Hvis prosjektet setter domenedrevet design høyt så kan det være smart å segmentere ut filene som utgjør domenemodellene i egne kataloger, for å holde domenet samlet uten for mye støy fra annen kode.</p>
<h3>En felles hverdag</h3>
<p>Det er smart å ha orden i prosjektet sitt. Kildekoden til prosjektet kan sees på som skrivebordet ditt; hvis det er vanskelig å finne det du leter etter så er ikke arbeidsmiljøet optimalt. I et prosjekt med mange utviklere betyr dette at alle deler &#8220;felles skrivebord&#8221;. Å sette retningslinjer som alle i prosjektgruppen enes om å følge kan bidra til en ryddigere hverdag for alle, men retningslinjene bør ikke blir detaljerende og vanskelige å følge. Alle skal føle seg komfortable med disse.</p>
<p>Det er en felles hverdag. En god struktur bidrar til raskere utvikling, enklere feilsøking, og etterhvert til bedre kode med færre feil.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2011/04/05/strukturell-utviklingsarkitektur/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Programkode og modulbasert arkitektur</title>
		<link>https://hovenko.no/blog/2011/03/01/programkode-og-modulbasert-arkitektur/</link>
		<comments>https://hovenko.no/blog/2011/03/01/programkode-og-modulbasert-arkitektur/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 19:32:23 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Arkitektur]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[arkitektur]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[modularitet]]></category>
		<category><![CDATA[prosjektstyring]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=586</guid>
		<description><![CDATA[Med modulbasert arkitektur gjelder det å dele opp systemet som skal lages i moduler av håndterbar mengde kode og funksjonalitet, hvor hver modul er ekspert på sitt ansvarsområde og eksponeres til resten av systemet igjennom veldefinerte grensesnitt. Utenfra fungerer en modul som en sort boks; man gir beskjeder inn og man får svar tilbake. Man [...]]]></description>
			<content:encoded><![CDATA[<p>Med modulbasert arkitektur gjelder det å dele opp systemet som skal lages i moduler av håndterbar mengde kode og funksjonalitet, hvor hver modul er ekspert på sitt ansvarsområde og eksponeres til resten av systemet igjennom veldefinerte grensesnitt.</p>
<div class="wp-caption alignnone"><a href="http://www.flickr.com/photos/create_joy/4291306755/"><img alt="" src="http://farm5.static.flickr.com/4013/4291306755_dd271b1021.jpg" title="Puslespill (Puzzle). Foto: Flickr/create_joy (CC)" width="500" height="357" /></a><p class="wp-caption-text">Puslespill (Puzzle). Foto: Flickr/create_joy (CC)</p></div>
<p>Utenfra fungerer en modul som en sort boks; man gir beskjeder inn og man får svar tilbake. Man vet ikke hvordan den sorte boksen kommer frem til svaret. Det gjør det enklere å forholde seg til støttefunksjoner, så man kan fokusere på den funksjonaliteten man skal lage. Jeg kaller det støttefunksjoner fordi disse funksjonene ikke er viktige; eller rettere sagt så er funksjonaliteten man arbeider med for øyeblikket mye viktigere enn en hvilken som helst annen annen modul.</p>
<h3>Vedlikeholdbarhet</h3>
<p>Behovet for modulbasert arkitektur oppstår når systemer blir for store til at én eller to personer kan ha oversikt over hele systemet. Da blir det viktig med vedlikeholdbare moduler av håndterbare mengder med kode.</p>
<p>Vedlikeholdbarhet betyr ikke at koden til stadighet må endres, noe som faktisk fungerer mot sin hensikt. Dersom modulen endres for ofte med for store endringer kan det innføre feil. Mye ny funksjonalitet kan gjøre modulen uoversiktlig og mindre vedlikeholdbar. En vedlikeholdbar modul bidrar til at resten av systemet får en tydelig måte å kommunisere med modulen på, og dersom man støter på feil så skal man klare å fikse feilen.</p>
<h3>Eksempel på modulbasert løsning</h3>
<div id="attachment_601" class="wp-caption aligncenter"><a href="http://hovenko.no/blog/wp-content/uploads/2011/02/modulbasert-arkitektur.png"><img src="http://hovenko.no/blog/wp-content/uploads/2011/02/modulbasert-arkitektur-500x288.png" alt="" title="Modulbasert Arkitektur - eksempel" width="500" height="288" class="size-medium wp-image-601" /></a><p class="wp-caption-text">Et svært enkelt og overordnet eksempel på en modulbasert nettbutikkløsning</p></div>
<p>Kjernen av <em>MyWebShop</em> kommuniserer mot eksterne komponenter over definerte grensesnitt. Det er ikke sikkert at alle komponenter har grensesnitt basert på åpne standarder, som SQL, SMTP og HTTP. Det kan være behov for å definere nye grensesnitt i bedriften. For eksempel kan kommunikasjon mot et CMS-system skje via et nytt grensesnitt vi kaller <em>ProductService</em> som tilbyr funksjoner som er nyttige for vår nettbutikk. På denne måten definerer vi tydelig hvilke funksjoner nettbutikken har behov for, samtidig som vi skjuler andre funksjoner som CMS-systemet tilbyr som ikke er viktige for vårt system.</p>
<p>Når kommunikasjon mellom moduler foregår over definerte grensesnitt, så kan moduler byttes ut med ny moduler ved behov. For eksempel kan modulen <em>My Simple CMS</em> byttes ut med et mer avansert og bedre CMS-system dersom nettbutikken vår blir større og får nye behov som den gamle modulen ikke kan tilby. Om den nye modulen ikke støtter det samme grensesnittet som den gamle kan man lage et veldig lite oversettingslag, kalt for et adapter, som oversetter mellom vårt eget <em>ProductService</em>-grensesnitt og den nye modulen.</p>
<h3>Samhandling</h3>
<p>Et ofte brukt tilfelle av modulbasert programvare er når data skal behandles i flere ledd. Samme grensesnitt kan brukes i front av flere forskjellige moduler. For eksempel kan et spamfilter kobles på foran e-posttjeneren slik at e-post kan filtreres før det lagres i brukerens innboks, og uønsket e-post kastes uten at brukeren ser e-posten. Fordelen med modulbasert arkitektur er klar, man får et mer oversiktlig system med komponenter som kan settes sammen og byttes ut ved behov.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2011/03/01/programkode-og-modulbasert-arkitektur/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Funksjonell og logisk arkitektur i IT-prosjekter</title>
		<link>https://hovenko.no/blog/2011/02/07/funksjonell-og-logisk-arkitektur-i-it-prosjekter/</link>
		<comments>https://hovenko.no/blog/2011/02/07/funksjonell-og-logisk-arkitektur-i-it-prosjekter/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 11:56:37 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Arkitektur]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[arkitektur]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[logisk]]></category>
		<category><![CDATA[prosjektstyring]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=550</guid>
		<description><![CDATA[Som jeg skrev i introduksjonenen til IT-arkitektur så finnes det flere innsynsvinkler til dette temaet. Hva er så mer logisk enn å starte med logisk arkitektur? Det handler om funksjonaliteten, det viktigste i et IT-system og den viktigste årsaken til at IT-prosjekter settes i gang! Et IT-system skal løse et behov for virksomheten, eller kunden [...]]]></description>
			<content:encoded><![CDATA[<p>Som jeg skrev i <a href="http://hovenko.no/blog/2011/01/27/hvorfor-begynner-man-med-arkitektur/">introduksjonenen til IT-arkitektur så finnes det flere innsynsvinkler</a> til dette temaet. Hva er så mer logisk enn å starte med logisk arkitektur? Det handler om funksjonaliteten, det viktigste i et IT-system og den viktigste årsaken til at IT-prosjekter settes i gang!</p>
<p>Et IT-system skal løse et behov for virksomheten, eller kunden som vi kaller det. Kunden har mange behov, men man avgrenser gjerne systemet til å løse et subsett av disse behovene. Vi kaller dette for <a href="http://en.wikipedia.org/wiki/Problem_domain">problemdomenet</a>.</p>
<p>Målet med logisk arkitektur er å styrke de funksjonelle kravene, og veien til en god logisk arkitektur kan være lang. Kunden vet ikke hva det egentlige behovet er, og har ofte sin en oppfatning om hvordan løsningen skal se ut. Utviklere blir ofte veldig engasjerte og starter å lage noe de selv synes virker kult istedenfor å grave og analysere i kundens egentlige problemer.</p>
<div class="wp-caption alignnone"><a href="http://en.wikipedia.org/wiki/Gnomes_(South_Park)"><img alt="" src="http://upload.wikimedia.org/wikipedia/en/d/dd/Gnomes_plan.png" title="South Park Gnomes plan" width="442" height="334" /></a><p class="wp-caption-text">South Park Gnomes plan</p></div>
<h3>Verktøy</h3>
<p>Det finnes flere verktøy for å analysere seg fram til en god logisk arkitektur. For å definere de funksjonelle kravene kan man skrive brukstilfeller (<em>use cases</em> på engelsk) som definerer hvilke brukere eller roller som skal utføre hvilke steg i en prosess for å ende opp med et ønsket resultat. Dette avdekker alternative valg som brukeren kan gjøre, for eksempel hva som skjer hvis brukeren taster en ugyldig verdi inn til systemet eller avbryter midt i prosessen. Dette dokumentet brukes for å måle om funksjonaliteten som ble avtalt er implementert og fungerer. Dette skaper en målbarhet som er viktig for at både kunde og leverandør (prosjektgruppen) skal ha felles forståelse for hva som lages og hva som er levert.</p>
<p>Det finnes også verktøy for å visualisere systemer, og <a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language">UML er en notasjon for å visualisere systemer</a>. Det kan visualisere brukstilfeller, flyt av data og koblinger mellom komponenter, valgmuligheter underveis i prosesser og tilstand til komponenter under gitte kriterier. Det finnes flere aspekter man kan visualiere med UML, men de nevnte er hovedsaklig de viktigste innenfor logisk arkitektur. Det handler om å modellere domenet, og komponentene navngis ofte etter begreper som brukes i virksomheten. </p>
<h3>Domenedrevet design</h3>
<p>En teknikk som jeg har fått sansen for er <a href="http://domaindrivendesign.org/">domenedrevet design (DDD)</a>, hvor fokuset rettes mot problemdomenet og det viktigste er å ha en god og dyp domenemodell på et felles språk. Dyp i at den reflekterer virksomhetens problemområde best mulig og med felles språk på tvers av programkode og de daglige funksjoner i virksomheten.</p>
<p>For å skape et felles språk som alle i prosjektet kjenner til og forstår betydningen av, så bør man lage en ordbok som alle gjør seg kjent med. Alle begreper fra domenemodellen bør legges inn i en slik ordbok. Ordboken skal være fri for systemtekniske begreper og skal forstås av domeneekspertene; de som kjenner virksomhetens funksjoner best.</p>
<h3>Eksempel på domenemodell</h3>
<p>Nedenfor vises et eksempel på en domenemodell av et bloggsystem. Det anbefales å skrive en kort tekst til figurene, da det ikke alltid er lett å forstå meningen bak en tegning. Dette er bare én av mange måter å visualisere et problem på.</p>
<div id="attachment_563" class="wp-caption alignright"><a href="http://hovenko.no/blog/wp-content/uploads/2011/02/domainmodel.png"><img src="http://hovenko.no/blog/wp-content/uploads/2011/02/domainmodel-500x322.png" alt="" title="Eksempel på domenemodell for en blogg" width="500" height="322" class="size-medium wp-image-563" /></a><p class="wp-caption-text">Eksempel på domenemodell for en blogg</p></div>
<p>Når man får dypere forståelse av domenet lager man en ny tegning som enten erstatter en gammel tegning eller som kan supplere en eksisterende tegning. Dersom kunden fra eksempelet over også ønsker at leserne skal kunne abonnere på en strøm av blogginnlegg, så kan man lage en ny tegning som viser et søk som mates inn i en nyhetsstrømgenerator (i mangel av bedre ord).</p>
<p>Det finnes ingen fasit på logisk arkitektur. Alle konkurransedrevne virksomheter har særegne behov, noe de trenger for å kunne konkurrere og skille seg ut i markedet. Nettopp derfor er logisk arkitektur trolig det vanskeligste å forstå og gjennomføre innenfor IT-arkitektur.</p>
<p>Lykke til med neste prosjekt! Etter å ha lest dette setter du deg selvfølgelig dypere inn i kundens virksomhet og avgrenser systemets oppgaver til å løse kundens konkrete problem – ikke sant?</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2011/02/07/funksjonell-og-logisk-arkitektur-i-it-prosjekter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hvorfor begynner man med arkitektur?</title>
		<link>https://hovenko.no/blog/2011/01/27/hvorfor-begynner-man-med-arkitektur/</link>
		<comments>https://hovenko.no/blog/2011/01/27/hvorfor-begynner-man-med-arkitektur/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 22:03:44 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Arkitektur]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[arkitektur]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[prosjektstyring]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=531</guid>
		<description><![CDATA[IT-arkitektur er noe som stadig nevnes; at man trenger en tjenesteorientert arkitektur, en brukerorientert arkirektur, en modulbasert arkitektur, eller kanskje en dataorientert arkitektur. Eller kanskje alt på en gang. Navnelista er lang. Om å skape orden Arkitektur er teknikker som skal hjelpe mennesker til å forstå kompliserte systemer, som igjen skal få kompliserte systemer til [...]]]></description>
			<content:encoded><![CDATA[<p>IT-arkitektur er noe som stadig nevnes; at man <em>trenger en tjenesteorientert arkitektur</em>, en <em>brukerorientert arkirektur</em>, en <em>modulbasert arkitektur</em>, eller kanskje en <em>dataorientert arkitektur</em>. Eller kanskje alt på en gang. Navnelista er lang.</p>
<h3>Om å skape orden</h3>
<p>Arkitektur er teknikker som skal hjelpe mennesker til å forstå kompliserte systemer, som igjen skal få kompliserte systemer til å virke bedre sammen, være raske, mer feiltolerante og enkle å bruke. Resultatet skal bli et enklere system. Det strømlinjeformer enkelte prosesser av systemene og skal hjelpe til med å gjøre systemene mer vedlikeholdbare.</p>
<p>Det er flere måter å komme fram til en arkitektur. Jeg har selv gått i fella, flere ganger &#8211; man velger en arkitektur for tidlig i prosjektet. Det er lett å gå seg blind i arkitektur når man hører at man trenger ting som Scrum, MVC, Cloud Computing, skyen, SaaS, SOA og ESB, buzzwords brukt av selgere for å selge inn produkter og tjenester. Løsningen er å ikke låse seg til en arkitektur til å begynne med, før man egentlig vet hva man skal lage.</p>
<p>En arkitektur utvikler seg over tid mens man arbeider målrettet med prosjektet og målrettet jobbet mot målet med prosjektet er. Det er alltid en smartere måte å løse et problem på, man bare vet ikke om det ennå.</p>
<div class="wp-caption alignnone"><a href="http://www.flickr.com/photos/edyson/13832022/"><img alt="" src="http://farm1.static.flickr.com/12/13832022_d808814a11.jpg" title="Menneskets evolusjon" width="500" height="175" /></a><p class="wp-caption-text">Evolusjon (evolution) Foto: Flickr/Esthr (CC)</p></div>
<h3>Innfallsvinkler</h3>
<p>Arkitektur finnes på flere nivåer. Man ser på arkitektur fra forskjellige innfallsvinkler. Som utvikler tenker jeg gjerne på hvordan koden er strukturert, gjerne i moduler strukturert i hver sine kataloger, på objekter med arv av abstrakte klasser og grensesnitt og hvordan kommunikasjonen mellom to systemer på nettverket skal foregå. En driftsperson tenker mer i retning av hvilke servere tjenestene skal kjøre på, i hvilke nettverkssoner, regelsett i lastbalanserer, feilhåndtering og backup. Ledelsen ønsker gjerne at utviklingsteamet skal være agile og kunne snu seg raskt ved endringer, men man ønsker også stabilitet og forutsigbarhet. En optimal arkitektur koster mye, ofte mer enn man er villig til å investere i prosjektet.</p>
<p>Wikipedia nevner <a href="http://en.wikipedia.org/wiki/Software_architecture">følgende innfallsvinkler til arkitektur</a>:</p>
<ul>
<li><a href="http://hovenko.no/blog/2011/02/07/funksjonell-og-logisk-arkitektur-i-it-prosjekter/">Funksjonell og logisk</a></li>
<li><a href="http://hovenko.no/blog/2011/03/01/programkode-og-modulbasert-arkitektur/">Programkode og modulbasert</a></li>
<li><a href="http://hovenko.no/blog/2011/04/05/strukturell-utviklingsarkitektur/">Utvikling og strukturelt</a></li>
<li>Kjøremiljø, samtidighet, prosesser og tråder</li>
<li>Komponenter, fysisk utplassering, utrulling og installering</li>
<li>Brukerinteraksjon og tilbakemeldinger</li>
<li>Data og datamodell</li>
</ul>
<p>Jeg vil igjennom en serie med innlegg berøre disse arkitekturtemaene nærmere.</p>
<p><small>Dersom du bare er interessert i å lese om arkitektur kan du <a href="http://hovenko.no/blog/category/teknologi/arkitektur/feed/atom/">følge arkitekturfeeden</a>.</small></p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2011/01/27/hvorfor-begynner-man-med-arkitektur/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
