Her på redaktionen er vi gået i skyen med vores machine learning-program, der finder forslag til emneord.
Og vi har ikke tænkt os at betale en øre for det! Vi er nemlig fedtede - så er det sagt.
Men det kan godt lade sig gøre at slippe med en udgift på 0 kroner. De store cloud-leverandører giver 12 måneders gratis tjenester, hvis man kan klare sig med en lille server.
Sådan én satte vi op i sidste artikel. Den hører hjemme hos Amazon og har én gigabyte hukommelse. Ikke meget at rutte med. Vores instans kører Amazon Linux 2, som er en Red Hat-variant.
Vi forlod sagaen i sidste afsnit, hvor vi netop havde opdaget, at den på forhånd installerede udgave af Java er version 7, og den kan vi ikke bruge. Quelle horreur! Som man siger i Frankrig.
Vi logger ind på sky-serveren som beskrevet i forrige artikel.
Jeg prøver at se, om Amazon Linux har Java 11 i sit programbibliotek. I Red Hat skulle det gøres med denne kommando, har jeg læst mig til:
$ sudo yum install java-11-openjdk-devel
– men Bash svarer:
No package java-11-openjdk-devel available.
Måske kunne man sætte et Red Hat-programarkiv op - det er ikke så svært, men jeg kender mest til Debians Apt-get via Ubuntu, som er anderledes end Yum, og lige nu vil jeg bare have hul igennem - se, om det virker. Senere hen må jeg tænke over opsætning af automatiske opdateringer, men lige nu er det hele på lege-stadiet.
Jeg har tidligere installeret Graal i Ubuntu på Virtualbox, og der kom hele JVM’en med i købet.
Det kan vel bruges til formålet. Jeg installerer, som beskrevet i en tidligere artikel, men her er der heller ikke held i sprøjten - det er Java 8, og jeg skal bruge Java 10 som minimum, da jeg godt kan lide Javas nye typeinferens.
Men jeg kan nok bare bruge de samme kommandoer, der installerer Graal, til at installere OpenJDK, Javas open source-udgave. Det må vel være et fedt. Det ser sådan ud:
$ curl -L https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz -o /tmp/ojdk11 $ tar -zxvf /tmp/ojdk11 -C /tmp $ sudo mv /tmp/jdk-11.0.2 /usr/lib/jdk-11.0.2
Vi tester, ved at navigere til mappen /usr/lib/jdk-11.0.2/bin og køre kommandoen
$ ./java -version openjdk version "11.0.2" 2019-01-15 OpenJDK Runtime Environment 18.9 (build 11.0.2+9) OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
– og Bob’s your uncle, som de siger i England - så er Java 11 på serveren.
Kopier til skyen med scp
Nu skal programmet kopieres over på serveren. Det gør jeg ved at åbne en ny (lokal) Bash-terminal og bruge kommandoen
$ scp -i TaniasAWSNoegler.pem -r "/mnt/c/Users/tan/Desktop/ting/Version2 - Webtjeneste med HTTPS" ec2-user@ec2-18-223-114-109.us-east-2.compute.amazonaws.com:~/webtjeneste
(hvor det hele står på en linje.)
Scp kopierer, og tager min privat-nøgle som argument, til autentifikation. Koden ligger i en mappe på skrivebordet, der på Windows-sprog hedder “ting\Version2 - Webtjeneste med HTTPS”.
Nu er vi parat til at køre programmet med kommandoen
$ /usr/lib/jdk-11.0.2/bin/java v2ml.WebService
men det går slet ikke. Programmet stopper med det samme, med denne fejl:
Exception in thread "main" java.lang.OutOfMemoryError
– og en masse flere linjer, der har at gøre med indlæsning af de tabeller, som programmet bruger til at udregne forslag til emneord.
Hejs med hukommelse
Den var værre. Måske er 1 gigabyte slet ikke nok til at køre mit program. Når jeg kører det lokalt, er det en forslugen sag, og den virtuelle maskine ender ofte med at allokere omkring 2,5 gigabyte hukommelse. Så måske kan det slet ikke lade sig gøre på den gratis server?
Men på den anden side, hvorfor give op med det samme - og nu gik det lige så godt. Lad os starte med at allokere mere hukommelse til JVM’en. Det gøres med flaget Xms og ser sådan ud:
$ /usr/lib/jdk-11.0.2/bin/java -Xms800M v2ml.WebService
– hvor hukommelsen sættes til 800 megabyte ud af de 1000, der er til rådighed. Går det an? Java-maskinen tygger lidt på det, og så kører programmet - success!
Jeg tester vores emneord med url’en
https://ec2-18-223-114-109.us-east-2.compute.amazonaws.com:8000/apps/emneord/test
i en browser, hvor domæne-navnet findes inde i Amazons web-konsol, som vi skrev i forrige artikel.
Der sker ingenting, og til sidst udløber browserens timeout. Mon ikke vi skal åbne en port et sted? Jeg kigger mig lidt rundt i webkonsollen, og finder punktet ‘Security Groups’, hvor jeg klikker på linjen ‘launch wizard 1’, som åbner et panel med et faneblad, der hedder ‘inbound’ og en knap, der hedder ‘edit’. Det lyder som det rigtige.
Jeg klikker på knappen og får denne dialog frem:
Porten til skyen
Mit webtjeneste-program lytter på port 8000, den åbner jeg. Jeg lukker dialogen og prøver med min test-url fra før - og nu kommer min test-side frem i browseren.
Jeg iler ind i en artikel for at klikke på emneordsknappen - og dæleme - jeg får et forslag til et emneord, malet med gult, ligesom da jeg kørte programmet på min egen pc.
Herligt.
Men herlighederne aftager hurtigt. Efter et kvarters tid bliver der ikke længere malet med gult i Version2’s cms. Der er noget galt.
Jeg kører kommandoen ‘top’, som viser de kørende processer - og der er ingen ‘java’ i listen, som top skriver i konsollen. Programmet er tilsyneladende crashet.
Hmmm.
Lidt søgning på nettet fortæller mig, at jeg skal kigge i log-filerne. Det gør jeg med den gode gamle grep-kommando:
$ sudo grep java /var/log/messages*
som høster de linjer i log-filerne, hvor der står noget med Java. Her finder vi linjen:
/var/log/messages-20190331:Mar 28 14:53:15 ip-172-31-46-107 kernel: [104845.907604] Out of memory: Kill process 7924 (java) score 901 or sacrifice child
Der har vi synderen. Jeg havde også lidt på fornemmelsen, at én gigabyte i hukommelse var lige i underkanten.
Swap
Der er tre løsninger, så vidt jeg kan se:
Jeg kan svinge betalingskortet og købe mig til noget mere hukommelse. Så går ideen med budgettet på 0 kr. i udgifter fløjten.
Jeg kan presse luften ud af tabellerne, der fylder så meget - og her er der virkelig noget at hente. Jeg kan med lidt snilde reducere tabellerne ned til 28 procent af udgangspunktet, som vi tidligere har skrevet om.
Men det tager også tid at skrive ny kode, og jeg vil bare have mit program op og køre nu og her, for dælen da!
Den sidste mulighed er at skabe en swap-partition, som er virtuel hukommelse på disk. Den står nemlig på 0 til at starte med i Amazon Linux.
Internettet synes at mene, at der er noget ‘fishy’ med den slags disk, som min t2.micro-instans benytter. Der er nemlig begrænsning på antallet af i/o-operationer, og jeg har ingen ide om, hvor mange operationer sådan en swap benytter på en god dag.
Men det kan være det går, og ellers må jeg prøve noget andet.
En opskrift på nettet fortæller, at jeg skal bruge de her fire kommandoer for at skabe en swap-fil på 1 x 2000 megabyte, altså 2 gigabyte:
$ sudo dd if=/dev/zero of=/swapspace bs=1M count=2000 $ sudo chmod 600 /swapspace $ mkswap /swapspace $ swapon /swapspace
Det spiller uden problemer, og jeg kan teste, at det virker, med denne udgave af swapon-kommandoen:
$ sudo swapon -s Filename Type Size Used Priority /swapspace file 2047996 0 -2
Med Free-kommandoen kan jeg tjekke, hvor meget fri hukommelse der er, når mit program kører - fordelt på rigtig RAM og swap:
$ free total used free shared buffers cached Mem: 1009428 944012 65416 0 5428 37088 -/+ buffers/cache: 901496 107932 Swap: 2047996 16896 2031100
Så er det bare at smække fødderne op på bordet og lade tiden gå - og efter flere uger, efterhånden, kører det lille program stabilt.
Sådan da. For når jeg lukker mit terminal-vindue, lukker programmet også.
Hvis det skal være rigtigt, skal programmet sættes op som en dæmon, en server-tråd i baggrunden - så meget ved jeg da om Linux. Men til at starte med, skal jeg bare have en hurtig success-oplevelse - så må eftertanken komme til senere.
Lidt søgning på nettet viser mig denne løsning:
$ nohup /usr/lib/jdk-11.0.2/bin/java -cp /home/ec2-user/webtjeneste/bin -Xms800M v2ml.WebService &>/dev/null &
– der smider programmet over i en baggrundstråd og skriver uddata til /dev/null, som er ‘ingenting.’ Det er ikke helt efter bogen, men jeg har altså givet mig selv lov til at hoppe over hvor gærdet er lavest, i denne omgang.
Og det virker. Programmet finder lystigt emneord og kører fint i ugevis. Så langt, så godt. Som tidligere nævnt, benytter vi et hjemmelavet certifikat. Men den går naturligvis ikke. Vi skal have et rigtigt HTTPS-certifikat, og helst uden at betale noget. Det kigger vi nærmere på i fremtiden.

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.
Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.
Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.
Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.