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

25. april 2019 kl. 05:114
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.
Artiklen er ældre end 30 dage
Manglende links i teksten kan sandsynligvis findes i bunden af artiklen.

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.

Artiklen fortsætter efter annoncen

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:

  1. $ sudo yum install java-11-openjdk-devel

– men Bash svarer:

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

Artiklen fortsætter efter annoncen

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:

  1. $ curl -L https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz -o /tmp/ojdk11
  2.  
  3. $ tar -zxvf /tmp/ojdk11 -C /tmp
  4.  
  5. $ 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

  1. $ ./java -version
  2. openjdk version "11.0.2" 2019-01-15
  3. OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
  4. 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

  1. $ 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

  1. $ /usr/lib/jdk-11.0.2/bin/java v2ml.WebService

men det går slet ikke. Programmet stopper med det samme, med denne fejl:

  1. 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?

Artiklen fortsætter efter annoncen

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:

  1. $ /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

  1. 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:

  1. $ 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:

  1. /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:

  1. $ sudo dd if=/dev/zero of=/swapspace bs=1M count=2000
  2.  
  3. $ sudo chmod 600 /swapspace
  4.  
  5. $ mkswap /swapspace
  6.  
  7. $ swapon /swapspace

Det spiller uden problemer, og jeg kan teste, at det virker, med denne udgave af swapon-kommandoen:

  1. $ sudo swapon -s
  2. Filename Type Size Used Priority
  3. /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:

  1. $ free
  2. total used free shared buffers cached
  3. Mem: 1009428 944012 65416 0 5428 37088
  4. -/+ buffers/cache: 901496 107932
  5. 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:

  1. $ 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.

4 kommentarer.  Hop til debatten
Denne artikel er gratis...

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

Debatten
Log ind eller opret en bruger for at deltage i debatten.
settingsDebatindstillinger
4
29. april 2019 kl. 07:25

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.

3
25. april 2019 kl. 11:28

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 :)

2
25. april 2019 kl. 09:42

Artiklen har intet med DevOps at gøre, om noget så er det det stik modsatte bl.a. i og med intet er automatiseret.