Version2 bliver Devops-hajer i skygge-skyen (sådan da)

Illustration: René Magritte: La Bonne Aventure/Flickr-bruger Irina
Firewalls, Java-installation, swap-filer... Devops-folket har altid travlt, på deres devops-bondegård.

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.

Læs også: Nem og gratis skygge-it: Vi putter emneord i skyen

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:

Illustration: Version2

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.

Illustration: Version2

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.

Læs også: Festlig fredag: Her er Version2’s længste ord gennem tiderne

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 lad 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.

Tips og korrekturforslag til denne historie sendes til tip@version2.dk
Følg forløbet
Kommentarer (4)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
Klavs Klavsen

Her vil jeg give Lasse ret. DevOps ( som defineret her https://en.wikipedia.org/wiki/DevOps ) - siger netop også at noget af det vigtigste er "infrastructure as code" - f.ex. vha. ansible, puppet etc.
Hvis nu du skrev en Ansible opskrift, til at gøre de ting du har gjort her (og byggede på de Ansible opskrifter der allerede findes til f.ex. java install på AWS instanser) - så ville det sikre dig at du kunne genskabe serveren, når AWS sletter den og giver dig en blank (det gør de med Free engang imellem svjv. ;) - og så har du recovery planen på plads.

Mht. at sikre sig at din service kører - skal du bare skrive en systemd service fil - og så kan du bede systemd genstarte din service automatisk, hvis den dør.

Og ja - du bør anvende en openjdk pakke fra din distribution af - så nogen holder øje med sikkerhedsopdateringer for dig - og så du kan nøjes med at bede din pakke manager køre opdateringer på jævnligt :)

  • 3
  • 0
Michael Garde

Jeg vil give dig ret. Hvis artiklen havde handlet om, hvordan man automatisered alt ovenstående, så ville det være mere DevOps relateret.

Vedr. installation af Java, så kan man (i hvert fald på en Red Hat linux maskine) sige
yum list java*
hvilket vil liste alle installerbare pakker som starter med java.

  • 0
  • 0
Log ind eller Opret konto for at kommentere