Testrapport. periode noe som er et godt tegn i et operativsystem, gruppen har derfor ikke klart å konstruere en slik situasjon for testing.

Like dokumenter
Innhold Forord...3 Begreper og akronymer...4 Systembeskrivelse...5 Generelt...5 Funksjonelle krav...7 Ikke-Funksjonelle krav...9 Prioritering...

Forord. Brukerveiledning

IN2010: Algoritmer og Datastrukturer Series 2

JSP - 2. Fra sist. Hvordan fungerer web? Tjenerside script HTML. Installasjon av Web-tjener Et enkelt JSP-script. Ønsker dynamiske nettsider:

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

Fra Python til Java, del 2

Socket og ServerSocket

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

Løsningsforslag Test 2

INF2100. Oppgaver uke 40 og

INF1010 Tråder J. Marit Nybakken Motivasjon. Å lage en tråd

Forelesning inf Java 5

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Forelesning inf Java 5

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Tuva Kristine Thoresen

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Jentetreff INF1000 Debugging i Java

INF2100. Oppgaver 6. og 11. oktober 2011 C 100 X 10

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

UNIVERSITETET I OSLO

Installasjonsveiledning

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

INF2100. Oppgaver 23. og 24. september 2010

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Eksamen i Internetteknologi Fagkode: ITE1526

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

Videregående programmering 6

I et Java-program må programmøren lage og starte hver tråd som programmet bruker. Er dette korrekt? Velg ett alternativ

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

INF Uke 10. Ukesoppgaver oktober 2012

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

JavaServer Pages (JSP)

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF1010 Tråder II 6. april 2016

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Side 1 av 11, prosesser, tråder, synkronisering, V. Holmstedt, HiO 2006

NB!!! Veldig korte svar er gitt her. Disse burde det vært skrevet mer på ved en eksamen..

INF 1010, vår 2005 Løsningsforslag uke 11

2 Om statiske variable/konstanter og statiske metoder.

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Forelesning inf Java 4

Threads Threads (tråder) threads vs prosesser threads vs prosesser Definisjoner av

UNIVERSITETET I OSLO

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

INF2100. Oppgaver 26. september til 1. oktober 2007

Operativsystemer og grensesnitt

UNIVERSITETET I OSLO

GUI («Graphical User Interface») del 2

Kapittel 8: Programutvikling

INF1010 Sortering. Marit Nybakken 1. mars 2004

SQL Server guide til e-lector

Del 3: Evaluere uttrykk

Seminaroppgaver IN1010, uke 2

Brukerveiledning for ArkN4

UNIVERSITETET I OSLO

IN våren 2019 Onsdag 16. januar

IN våren 2018 Tirsdag 16. januar

Testsituasjon Resultat Kommentar. Fungerer som det skal!

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Løsningsforslag 2017 eksamen

IN1010 våren januar. Objektorientering i Java

1,r H øgs kolen i Østfol d

INF Notater. Veronika Heimsbakk 10. juni 2012

Hva er Derby og Java DB? Denne forelesningen. Java Database Connectivity (JDBC) Hva er Derby og Java DB?

UNIVERSITETET I OSLO

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

"Nelsons kaffebutikk"

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

Oblig 4 (av 4) INF1000, høsten 2009 Værdata, leveres innen 6. nov. kl

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

En algoritme for permutasjonsgenerering

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

Kom forberedt til tirsdag. INF1000 Tips til obligatorisk oppgave 4. Noen generelle tips. Oblig4: Komme igang

HØGSKOLEN I SØR-TRØNDELAG

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

TOD063 Datastrukturer og algoritmer

Programmeringsspråket C

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

MAT-INF 1100: Obligatorisk oppgave 1

Tilkobling og Triggere

UNIVERSITETET I OSLO

(MVC - Model, View, Control)

INF 1000 høsten 2011 Uke september

Fra problem til program

UNIVERSITETET I OSLO

INF1000 Metoder. Marit Nybakken 16. februar 2004

Dagens tema: Mer av det dere trenger til del 1

INF1010 våren januar. Objektorientering i Java

INF våren 2017

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Transkript:

Forord Dette dokumentet er skrevet for personer som vil benytte seg av produktet men vil ha en validering av de ulike pluginene før de tas i bruk. Det er forutsatt at produktdokumentet er lest før dette dokumentet blir lest for å få en best mulig forståelse av dokumentet. Det er også beregnet at leseren også har SQL-kunnskaper. Noen av forklaringene vil være på engelsk da det er hentet ut fra JavaDoc, I testkoden vil det være mange kommentarer på norsk og engelsk blandet. Årsaken til det er at gruppen har kun benyttet dette for sin egen del og er ikke en del av produktet. Gruppen har ikke brukt tid på å rettskrive kommentarene i koden. Testing av dokumentet har vært en meget viktig del av prosjektet. Uviklingsmetoden gruppen benyttet la til rette for mye testing både i utviklingsfasen og av sluttproduktet. I dette dokumentet vil gruppen presentere sine hypoteser og funn. Det vil gi et innblikk i hvordan grafene endrer seg når belastningen av applikasjonen endrer seg. Dokumentet er delt i to deler hvor gruppen i den første delen viser sine tester og funn under utviklingen av produktet. I den andre delen utfører gruppen testing av de ulike pluginene isolert sett gjennom applikasjonen pluginene overvåker, i deres tilfelle Tomcat. Den andre delen er derfor en validering av produktet og den første delen har vært testing av gruppens teknikker gjennom ad-hoc metoder. Verdiene gruppen har funnet og endringene som har tredd i kraft vil ikke nødvendigvis endres på samme måte i en annen applikasjon, på en annen Java distribusjon eller maskin. Derimot vil endringene bekrefte og avkrefte gruppens hypoteser med gitte variable i et spesifikt miljø. Alle tester har blitt kjørt på samme plattform med samme oppsett og derfor korrelerer grafene med hverandre. I stor grad har endringene vært like. Gruppen mener at deres tester i stor grad har bekreftet at pluginene fungerer og oppfører seg slik antatt isolert sett. Det finnes enkelte plugin som ikke lar seg teste like enkelt og gruppen har derfor unngått å teste dem i dette prosjektet. Derimot mener gruppen at da andre plugin som har lik oppbygning og metodene og objektene blir benyttet på samme måte oppfører seg slik forventet, vil også disse oppføre seg slik det er ment. Et eksempel på en slik plugin er DeadlockedThreads. Det er i ytters få tilfeller at en tråd forblir deadlocked i en 5 minutters 2

periode noe som er et godt tegn i et operativsystem, gruppen har derfor ikke klart å konstruere en slik situasjon for testing. Testing Testing under utviklingen Gruppen skrev tidlig i utviklingsfasen et enkelt vindusbasert program i Java hvor gruppen hentet ut informasjon fra mange MXBean. Dette gjorde gruppen for å danne seg et bilde over hva slags data de kunne hente ut og som lot seg representere i en graf. Gruppen fant raskt ut at det finnes metoder for å hente ut data som ikke lar seg representere i en graf og som ikke har en hensikt å presentere i en graf. Metodene de benyttet var ad-hoc og er ikke en del av produktet. Produkttestingen Da gruppen hadde valgt å hente ut data fra Tomcat hadde vi flere måter å teste applikasjonen på. Her kunne vi velge å programmere servlets direkte, JSP, JSF eller annen servlet basert applikasjon. Gruppen valgte for enkelhets skyld JSP. Dette var den enkleste måten å komme i gang på med minst kode. Her skrev vi flere kodesegmenter som hovedsaklig belastet Heap minnet, men også CPU og andre ressurser. Deretter pakket gruppen applikasjonene ned til WAR og kopierte de inn i /var/lib/tomcat5.5/webapps/. Dette er måten man importerer prosjekter inn i Tomcat. Deretter pakker Tomcat ut war filen og oppretter en mappe med prosjektnavnet. Når det er gjort vil JSP siden være tilgjengelig og klar for å kjøres på nettsiden. Eksempelvis http://hoved34.vlab.iu.hio.no:8180/array/test.jsp. Koden ble deretter kjørt ved at flere datamaskiner aksesserte websiden og test.jsp programmet ble kjørt i flere instanser innenfor Tomcat JVM. 3

Innhold Forord...2 Hvordan testet gruppemedlemmene... Feil! Bokmerke er ikke definert. Testing under utviklingen...3 Produkttestingen...3 Del 1...5 1.1 Testing underveis...5 1.1.1 Generelt...5 1.1.2 Testing av alle klassene...5 1.1.3 Databasen... 11 1.1.4 Tomcat... 15 Websiden... 16 Del 2... 17 2.1 Generelt... 17 Vedlegg... 28 4

Del 1 1.1 Testing underveis 1.1.1 Generelt I denne delen av testrapporten tar gruppen for seg testingen vi gjorde mens vi utviklet pluginene. Her har vi testet programmene ved å sende dataene til Munin og vurdert grafene for å fastslå en normal. Deretter har vi belastet applikasjonen samtidig som vi har sendt dataene til en SQL-database hvert 5te sekund. Gruppen har vurdert dataene og notert endringene. På denne måten har vi sjekket om nyquist teorien har blitt oppfylt, denne har blitt oppfylt for samtlige plugin. Se kravspesifikasjon for mer info om nyquist teorien. 1.1.2 Testing av alle klassene Dette er den første testen gruppen utførte. Her skrev vi en kort ad-hoc metode for å hente ut en verdi fra ClassLoadingMXBean. Koden under viser hvordan klassen ser ut. import java.lang.management.*; public class test{ public static void main(string args[]) { ClassLoadingMXBean classmxbean = ManagementFactory.getClassLoadingMXBean(); int a=classmxbean.getloadedclasscount(); // denne retunerer antall klasser som er lastet i JVM System.out.println(""+a); Kode 1.1 5

Klassen ble utvidet etter hvert og så slik ut til slutt. import java.lang.management.*; import javax.swing.*; public class Main { public static void main(string[] args) { //int x=getloadedclasscount(); // TODO code application logic here ClassLoadingMXBean classmxbean = ManagementFactory.getClassLoadingMXBean(); ThreadMXBean threadmxbean = ManagementFactory.getThreadMXBean(); MemoryMXBean memorymxbean = ManagementFactory.getMemoryMXBean(); OperatingSystemMXBean osmxbean = ManagementFactory.getOperatingSystemMXBean(); JTextArea utskrift=new JTextArea(); JVM int a=classmxbean.getloadedclasscount(); // denne retunerer antall klasser som er lastet i utskrift.settext("antall klasser : "+a+"\n"); long b=classmxbean.gettotalloadedclasscount(); //retunerer antall klasser som er lastet siden JVM har startet utskrift.append("klasser som er lastet opp siden JVM startet : "+ b+"\n"); long c=classmxbean.getunloadedclasscount(); // antall klasser som er ikke lastet opp siden JVM har startet utskrift.append("klasser som er ikke lastet opp siden JVM startet : "+c+"\n"); boolean d=classmxbean.isverbose(); utskrift.append("er verbose : "+d+"\n"); 6

//classmxbean.setverbose(true); //threadmxbean.dumpallthreads(d, d) // Returns the thread info for all live threads with stack trace and synchronization information. long[] mm=threadmxbean.finddeadlockedthreads(); // Finds cycles of threads that are in deadlock waiting to acquire object monitors or ownable synchronizers. String ut=""; /*for(int y=0;y<mm.length;y++) { ut+=mm[y]+", "; utskrift.append("cycles of threads that are in deadlock : "+ ut+"\n");*/ long[] bb=threadmxbean.findmonitordeadlockedthreads();//finds cycles of threads that are in deadlock waiting to acquire object monitors. String ut2=""; /*for(int y2=0;y2<bb.length;y2++) { ut2+=bb[y2]+", "; utskrift.append("cycles of threads that are in deadlock waiting to acq : "+ut2+"\n");*/ long[] m=threadmxbean.getallthreadids(); // Returns all live thread IDs. String ut3=""; for(int i=0;i<m.length;i++){ ut3+=m[i]+", "; utskrift.append("alle live Threads IDS : "+ut3+"\n"); long e=threadmxbean.getcurrentthreadcputime(); //Returns the total CPU time for the current thread in nanoseconds. utskrift.append("total tid for CPU : "+e+"\n"); long f=threadmxbean.getcurrentthreadusertime(); // Returns the CPU time that the current thread has executed in user mode in nanoseconds. utskrift.append("cpu tid in user mode : "+f+"\n"); int h=threadmxbean.getdaemonthreadcount(); // Returns the current number of live 7

daemon threads. utskrift.append("antall daemon threads (live) : "+h+"\n"); int g=threadmxbean.getpeakthreadcount(); // Returns the peak live thread count since the Java virtual machine started or peak was reset. utskrift.append("peak live thread count : "+g+"\n"); int t=threadmxbean.getthreadcount(); //Returns the current number of live threads including both daemon and non-daemon threads. utskrift.append("number of live threads (daemon and non-daemon) : "+t+"\n"); //long dd=threadmxbean.getthreadcputime(long id); // Returns the total CPU time for a thread of the specified ID in nanoseconds. //threadmxbean.getthreadinfo(long id); // Returns the thread info for a thread of the specified id with no stack trace. //threadmxbean.getthreadinfo(long[] ids); //Returns the thread info for each thread whose ID is in the input array ids with no stack trace. //threadmxbean.getthreadinfo(f, t); // Returns the thread info for each thread whose ID is in the input array ids, with stack trace and synchronization information. // threadmxbean.getthreadinfo(long[] ids, int maxdepth); // Returns the thread info for each thread whose ID is in the input array ids, with stack trace of a specified number of stack trace elements. //threadmxbean.getthreadinfo(long f,int maxdepth); // Returns a thread info for a thread of the specified id, with stack trace of a specified number of stack trace elements. //threadmxbean.getthreadusertime(long id); //Returns the CPU time that a thread of the specified ID has executed in user mode in nanoseconds. long s=threadmxbean.gettotalstartedthreadcount();// Returns the total number of threads created and also started since the Java virtual machine started. utskrift.append("total number of threads created and started : "+s+"\n"); boolean te=threadmxbean.iscurrentthreadcputimesupported(); // Tests if the Java virtual machine supports CPU time measurement for the current thread. utskrift.append("jvm support CPU time measurement : "+te+"\n"); boolean te2=threadmxbean.isobjectmonitorusagesupported(); // Tests if the Java virtual machine supports monitoring of object monitor usage. utskrift.append("jvm supports monitoring of Bbject : "+te2+"\n"); boolean te3=threadmxbean.issynchronizerusagesupported(); // Tests if the Java virtual 8

machine supports monitoring of ownable synchronizer usage. utskrift.append("jvm supports monitoring of ownable synch. : "+te3+"\n"); boolean te4=threadmxbean.isthreadcontentionmonitoringenabled(); // Tests if thread contention monitoring is enabled. utskrift.append("thread contention monitoring is enabled : "+te4+"\n"); boolean te5=threadmxbean.isthreadcontentionmonitoringsupported(); // Tests if the Java virtual machine supports thread contention monitoring. utskrift.append("jvm supports thread con. monitoring : "+te4+"\n"); boolean te6=threadmxbean.isthreadcputimeenabled(); // Tests if thread CPU time measurement is enabled. utskrift.append("threads CPU time measurement is enabled : "+te6+"\n"); boolean ss=threadmxbean.isthreadcputimesupported(); // Tests if the Java virtual machine implementation supports CPU time measurement for any thread. utskrift.append("jvm implementation supports CPU time measur. : "+ss+"\n"); //threadmxbean.resetpeakthreadcount(); //Resets the peak thread count to the current number of live threads. //threadmxbean.setthreadcontentionmonitoringenabled(boolean enable); // Enables or disables thread contention monitoring. //threadmxbean.setthreadcputimeenabled(boolean b); // Enables or disables thread CPU time measurement. //memorymxbean.gc(); //Runs the garbage collector. //memorymxbean.getheapmemoryusage(); //Returns the current memory usage of the heap that is used for object allocation. //memorymxbean.getnonheapmemoryusage(); // Returns the current memory usage of non-heap memory that is used by the Java virtual machine. //memorymxbean.getobjectpendingfinalizationcount(); // Returns the approximate number of objects for which finalization is pending. //memorymxbean.isverbose(); // Tests if verbose output for the memory system is enabled. //memorymxbean.setverbose(boolean value); //Enables or disables verbose output for the memory system. String ff=osmxbean.getarch(); //Returns the operating system architecture. utskrift.append("os architecture : "+ff+"\n"); 9

int av=osmxbean.getavailableprocessors(); // Returns the number of processors available to the Java virtual machine. utskrift.append("number of processors available to JVM : "+av+"\n"); String name=osmxbean.getname(); // Returns the operating system name. utskrift.append("navn på OS : "+name+"\n"); double tr=osmxbean.getsystemloadaverage(); //Returns the system load average for the last minute. utskrift.append("system load average for the last minute : "+tr+"\n"); String ver=osmxbean.getversion(); //Returns the operating system version. utskrift.append("version : "+ver); JOptionPane.showMessageDialog(null,utskrift); 10

Figur 1(applikasjon til koden over) Denne klassen innholdt verdier for de fleste MXBean og gruppen dannet seg et bilde av informasjonen vi kunne få ut. Men det var vanskelig å vite om dataen endret seg eller ikke, derfor valgte gruppen å skrive til databasen. 1.1.3 Databasen Gruppen begynte med å sette inn verdier i databasen og sjekket ved å utføre select * from prosjekt; for hvert 5te minutt. public static void leggtil(string tid,int x,long y, long z,string verbose,long e,long f,int h,int g,int t,long s,string s1,string s2,string s3,string s4,string s5,string s6,string s7) { try{ new com.mysql.jdbc.driver(); 11

Connection con = DriverManager.getConnection("jdbc:mysql://IP /brukernavn", "brukernavn", "Passord"); Statement st = con.createstatement(); st.execute("insert INTO prosjekt values('"+tid+"','" + x + "','"+y+"','"+z+"','"+verbose+"','"+e+"','"+f+"','"+h+"','"+g+"','"+t+"','"+s+"','"+s1+"','"+s2+"',' "+s3+"','"+s4+"','"+s5+"','"+s6+"','"+s7+"')"); catch(exception stt) { System.out.print(stt.getMessage()); public static String now(string dateformat) { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); return sdf.format(cal.gettime()); Denne metoden ble kjørt via en Main metode der sendte data hvert 5te sekund til databasen. Som det kommer frem er det mange kolonner i denne tabellen og det ville vært upraktisk å skrive ut hele, derfor har gruppen lagt ved et utsnitt av tabellen. 12

Forklaring for tabellens kolonner A= Time B= The current number of live threads including both daemon and non-daemon threads. C= The number of classes that are currently loaded in the Java virtual machine. D= The total number of classes unloaded since the Java virtual machine has started execution. E= Is Verbose F= Total CPU time for the current thread in nanoseconds G= The CPU time the current thread has executed in user mode in nanosecunds H= The current number of live daemon J= The peak live thread count since the JVM started or Peak wa reset K= The current number of live threads including both daemon and non-daemon threads L= The total number of threads creadted and also started since the JVM started. 13

mysql> select * from prosjekt; +-------------------+------+------+------+-------+-----------+-----------+------+------+------+------+ A B C D E F G H J K L +-------------------+------+------+------+-------+-----------+-----------+------+------+------+------+ 09.02.08/05:06:32 978 1065 0 false 218401400 124800800 6 8 8 8 09.02.08/05:06:38 1406 1406 0 false 546003500 452402900 7 9 8 9 09.02.08/05:06:43 1406 1406 0 false 561603600 468003000 7 9 8 9 09.02.08/05:06:48 1421 1421 0 false 561603600 468003000 7 9 8 9 09.02.08/05:06:53 1422 1422 0 false 561603600 468003000 7 9 8 9 09.02.08/05:06:58 1422 1422 0 false 577203700 468003000 7 9 8 10 09.02.08/05:07:04 1423 1423 0 false 592803800 483603100 7 9 8 10 09.02.08/05:07:09 1423 1423 0 false 592803800 483603100 7 9 8 10 09.02.08/05:07:14 1424 1424 0 false 608403900 499203200 7 9 8 10 09.02.08/05:07:19 1424 1424 0 false 608403900 499203200 7 9 8 10 09.02.08/05:07:24 1424 1424 0 false 608403900 499203200 7 9 8 10 09.02.08/05:07:29 1424 1424 0 false 624004000 514803300 7 9 8 10 09.02.08/05:07:35 1424 1424 0 false 624004000 514803300 7 9 8 10 09.02.08/05:07:40 1424 1424 0 false 639604100 530403400 7 9 8 10 09.02.08/05:07:45 1424 1424 0 false 639604100 530403400 7 9 8 10 09.02.08/05:07:50 1426 1426 0 false 639604100 530403400 7 9 8 10 09.02.08/05:07:55 1429 1429 0 false 655204200 546003500 7 9 8 10 09.02.08/05:08:01 1429 1429 0 false 655204200 546003500 7 9 8 10 09.02.08/05:08:06 1429 1429 0 false 655204200 546003500 7 9 8 10 09.02.08/05:08:11 1429 1429 0 false 655204200 546003500 7 9 8 10 09.02.08/05:08:16 1429 1429 0 false 655204200 546003500 7 9 8 10 09.02.08/05:08:22 1429 1429 0 false 655204200 546003500 7 9 8 10 09.02.08/05:08:27 1429 1429 0 false 670804300 546003500 7 9 9 11 09.02.08/05:08:32 1429 1429 0 false 670804300 546003500 7 9 8 11 14

Da gruppen testet koden fant ut at verdiene endrer seg minimalt selv ved høy last og visste at noe var galt. Gruppen kunne se at Load og CPU ressursene hadde økt betraktelig for operativsystemet men ingen endringer for CPU og andre grafer for JVM. Gruppen dannet seg noen hypoteser for dette resultatet. Den første hypotesen var at vi hentet ut data fra tidligere opprettet MXBean objekt. Denne hypotesen viste seg raskt å være feil da noen grafer hadde små endringer. Neste hypotese var at vi hentet ut data fra feil JVM instans. Her gikk det litt tid og mer studeringav JMX før de oppdaget at vi hadde gjort en fundamentalt feil antagelse. Antagelse var at vi hentet ut ressursbruken til JVM i sin helhet for operativsystemet. Men det vi i realiteten hentet ut var ressursbruken til vår plugin (som kun utførte en kort System.out.print() operasjon på objektet). Vi hentet dataene på feil metode for deres bruk. De aksesserte MXBean objektene direkte, men måtte aksessere objektene ved å benytte ManagementFactory.newPlatformMXBeanProxy(). På denne måten kunne vi aksessere en spesifik MBean server ved en nettverkstilkobling. 1.1.4 Tomcat 1.1.4.1 Teste om Tomcat kjører Installasjon av Tomcat gikk bra, så måtte gruppen sjekke om den kjørte på serveren. Koden nedenfor viser Tomcat som kjører på serveren. server:/etc/munin/java/java# ps aux grep tomcat5.5 tomcat55 32015 0.0 0.0 2544 1012 ttyp0 S 11:15 0:00 su -p -s /bin/sh tomcat55 -c /usr/sbin/rotatelogs "/var/lib/tomcat5.5/logs/catalina_%f.log" 86400 tomcat55 32022 0.0 0.1 7708 1764 ttyp0 S 11:15 0:00 /usr/sbin/rotatelogs /var/lib/tomcat5.5/logs/catalina_%f.log 86400 tomcat55 32035 0.1 3.8 278592 40584 ttyp0 Sl 11:15 0:12 /usr/lib/jvm/java-6- sun/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager - 15

Djava.util.logging.config.file=/var/lib/tomcat5.5/conf/logging.properties - Djava.awt.headless=true -Xmx128M -Dcom.sun.management.jmxremote - Dcom.sun.management.jmxremote.port=5400 -Dcom.sun.management.jmxremote.ssl=false - Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote - Dcom.sun.management.jmxremote.port=5400 -Dcom.sun.management.jmxremote.ssl=false - Dcom.sun.management.jmxremote.authenticate=false - Djava.endorsed.dirs=/usr/share/tomcat5.5/common/endorsed -classpath :/usr/lib/jvm/java-6- sun/jre//lib/jcert.jar:/usr/lib/jvm/java-6-sun/jre//lib/jnet.jar:/usr/lib/jvm/java-6- sun/jre//lib/jsse.jar:/usr/share/tomcat5.5/bin/bootstrap.jar:/usr/share/tomcat5.5/bin/commonslogging-api.jar -Djava.security.manager - Djava.security.policy==/var/lib/tomcat5.5/conf/catalina.policy - Dcatalina.base=/var/lib/tomcat5.5 -Dcatalina.home=/usr/share/tomcat5.5 - Djava.io.tmpdir=/var/lib/tomcat5.5/temp org.apache.catalina.startup.bootstrap start root 29356 0.0 0.0 1656 516 ttyp0 R+ 13:39 0:00 grep tomcat5.5 Websiden Linken viser at Tomcat installert og websiden er klar for bruk på port 8180. http://hoved34.vlab.iu.hio.no:8180/ 1.1.4.2 Teste webapplikasjoner Tomcat har en administrasjonsside for applikasjoner som kjører. Her kan man dobbelt sjekke at war filen er installert og prosjektet er opplastet i minnet. http://hoved34.vlab.iu.hio.no:8180/manager/list Her kan man logge seg inn og få oversikten Brukernavn: mammut Passord: tcpa 16

Del 2 2.1 Generelt I denne delen av prosjektet skal Gruppen gå gjennom pluginene og teste om alle virker og gjør det de skal. War filene ble lastet opp til /var/lib/tomcat5.5/webapps/ og deretter kjørt via nettsidene Plugin CollectionUsageSurvivor Comitted øker Max Hypotese Init Used øker Threshold Test Kode nummer 1 Antall PC-er 3 Comitted Max Utfall Init Used Threshold Resultat Hypotese var riktig 17

Plugin CollectionUsageTenuredGen Comitted Max Hypotese Init Used Threshold Test Kode nummer 1 Antall PC-er 3 Comitted Max Utfall Init Used Threshold Resultat Hypotese var riktig 18

Plugin PeakUsageEden Comitted Max Hypotese Init Used Threshold Test Kode nummer 1 Antall PC-er 3 Comitted Max Utfall Init Used Threshold Resultat Hypotese var riktig 19

Plugin GarbageCollectorCount Hypotese MinorCount MajorCount Test Kode nummer 1 Antall PC 3 Utfall MinorCount MajorCount Resultat Hypotese var riktig 20

Plugin GarbageCollectorTime Hypotese MinorTime MajorTime Test Kode nummer 1 Antall PC 3 Utfall MinorTime MajorTime Resultat Hypotese var riktig 21

Plugin Hypotese Test Uptime Venter en dag Antall PC 1 Utfall Resultat Hypotese var riktig 22

Plugin PeakUsageSurvivor Hypotese Comitted øker Max Init Used Threshold Inegn endring øker Test Kode nummer 1 Antall PC 3 Utfall Comitted øker Max Init Used Threshold øker Resultat Hypotese var riktig 23

Plugin PeakUsageTenuredGen Hypotese Comitted Max Init Used Threshold Test Kode nummer 1 Antall PC 3 Utfall Comitted Max Init Used Threshold Resultat Hypotese var riktig 24

Plugin UsageEden Hypotse Comitted Used Max Init Threshold Test Kode nummer 1,2,3 Antall websider 10 Utfall Comitted Used Max Init Threshold Resultat Hypotese var riktig 25

Plugin UsageSurvivor Hypotse Comitted Used Max Init Threshold Test Kode nummer 1,2,3,4,5 Antall websider 10 Utfall Comitted Used Max Init Threshold Resultat Hypotese var riktig 26

Plugin UsageTenuredGen Hypotse Comitted Used Max Init Threshold Test Kode nummer 1,2,3,4,5 Antall websider 10 Utfall Comitted Used Max Init Threshold Resultat Hypotese var riktig 27

Vedlegg Kode nummer 1 1 <html> 2 <head> 3 <title>time on the server</title> 4 </head> 5 <body bgcolor="red"> 6 The time is <%= new java.util.date() %> 7 <h3>hei.vet du hva du gjør her nå?du fyller 15 String array med 8 tekst. </h3> 9 <% 10 String[] array1=new String[1000000]; 11 String[] array2=new String[1000000]; 12 String[] array3=new String[1000000]; 13 String[] array4=new String[1000000]; 14 String[] array5=new String[1000000]; 15 String[] array6=new String[1000000]; 16 String[] array7=new String[1000000]; 17 String[] array8=new String[1000000]; 18 String[] array9=new String[1000000]; 19 String[] array10=new String[1000000]; 20 String[] array11=new String[1000000]; 21 String[] array12=new String[1000000]; 22 String[] array13=new String[1000000]; 23 String[] array14=new String[1000000]; 24 String[] array15=new String[1000000]; 25 26 for (int i=0;i<1000000;i++) 27 { 28 array1[i]="en string kommer inn"; 29 array2[i]="en annen string kommer inn her"; 30 array3[i]="en til kommer her"; 31 array4[i]="en string kommer inn"; 32 array5[i]="en annen string kommer inn her"; 33 array6[i]="en til kommer her"; 34 array7[i]="en string kommer inn"; 35 array8[i]="en annen string kommer inn her"; 36 array9[i]="en til kommer her"; 37 array10[i]="en string kommer inn"; 38 array11[i]="en annen string kommer inn her"; 39 array12[i]="en til kommer her"; 40 41 %> 42 </body> 28

43 </html> Kode nummer 2 <html> <head> <title>time on the server</title> </head> <body bgcolor="red"> The time is <%= new java.util.date() %> <h3> Dette er en matte oppgave. </h3> <% int max=10000000; int i=0; int sum=0; int s=1; while(s<500000000) { while(i<max) { i+=1; sum+=i; Thread.sleep(1000); i=0; s++; sum=0; %> </body> </html> Kode nummer 3 29

<html> <head> <title>time on the server</title> </head> <body> The time is <%= new java.util.date() %> <% for (int i=0;i<1000000;i++) { %> Dette er kun test <%= i %> <br> <% %> </body> </html> Kode nummer 4 <html> <head> <title>time on the server</title> </head> <body> The time is <%= new java.util.date() %> <% String[] array1=new String[1000000]; 30

String[] array2=new String[1000000]; String[] array3=new String[1000000]; for (int i=0;i<1000000;i++) { array1[i]="en string kommer inn"; array2[i]="en annen string kommer inn her"; array3[i]="en til kommer her"; %> Dette er kun test <%= i %> <br> <% %> </body> </html> Kode nummer 5 <html> <head> <title>time on the server</title> </head> <body> The time is <%= new java.util.date() %> <% String[] array1=new String[1000000]; String[] array2=new String[1000000]; 31

String[] array3=new String[1000000]; for (int i=0;i<1000000;i++) { array1[i]="en string kommer inn"; array2[i]="en annen string kommer inn her"; array3[i]="en til kommer her"; %> Dette er kun test <%= i %> <br> <% %> <% long test=1; while(test!=0) { %> Dette er en annen test <% test++; %> </body> </html> 32