You are on page 1of 148

UNIVERSIDAD DE VALLADOLID ESCUELA TCNICA SUPERIOR DE INGENIEROS DE TELECOMUNICACIN

I.T. TELECOMUNICACIONES SISTEMAS DE TELECOMUNICACIN FEBRERO 2010

PROYECTO FIN DE CARRERA

AUTOR: PABLO NAVARRETE ALMARZA TUTORES: JUAN PABLO DE CASTRO FERNNDEZ RICARDO GARCA MARTN

BENCHMARKING DE SERVICIOS WMS-C

INDICE

0.Introduccin 1 0.1Introduccinalosserviciosdemapas 1 0.2Objetivosdelproyecto 2 0.3Estructuradelamemoria 3 1.ServiciosWebdeMapas 5 1.1ServicioWebMapService(WMS) 5 1.2PropuestaWebMapTilingService(WMTS) 7 1.3PropuestaWMSC 7 2.ImplementacionesWMSC 10 2.1CacheadoenWMS 10 2.2TileCache 11 2.3Geowebcache 11 2.4WMSCwrapper 12

3.BenchmarkingdeserviciosWebdeMapas 16 4.DesarrollodelaaplicacindeBenchmarking 20 4.1Objetivosdelaaplicacin 20 4.2Estructuradelaaplicacin 20 4.2.1ArchivodeJmeter 20 4.2.2GeneradordeBboxes 23 4.2.3Reportederesultados 34 4.2.4EstructuraMavenSVN 39 4.2.5Scripts 40 4.2..6Resumen 42 4.3Conclusiones 43 5.AnlisisdeResultados 44 6.Conclusionesylneasfuturas 75 Bibliografa ApndiceI.Instalacindelascachs ApndiceII.Manualdeusodelaaplicacin ANEXOS:Cdigocompletodelaaplicacin

INTRODUCCIN

0.1.INTRODUCCINALOSSERVICIOSDEMAPAS
Histricamenteelhombrehautilizadomapasconlosmasdiversosfines[1],ysibienpocotienen encomnlostoscosdibujosefectuadosenelneolticoconloscomplejossistemasdeinformacin quesemanejanhoyenda,larealidadesquecompartendoselementosbsicos:unaimagen asociadaconunatributodeinformacin. LosSistemasdeInformacinGeogrfica(SIGoGISensunomenclaturainglesa)definidoscomo unaintegracindesoftwarehardwareydatosgeogrficos,nacieronenCanad[2]enelao1962 cuando el Canadian Geographic Information System (CGIS) cartografi parte de su territorio nacional,incluyendodatosreferentesatiposdesuelo,especiesvegetales,especiesanimales, recursosfluviales..... conelfindellevaracabounagestinintegraldesusrecursosnaturales medianteelusodefactoresdeclasificacinparapoderanalizartodalainformacin ElCGISsupusounconsiderableavanceconrespectoalasaplicacionescartogrficasexistentes hasta entonces, puesto que permita superponer capas de informacin, realizar mediciones y llevaracabodigitalizacionesyescaneodedatos.Asimismo,soportabaunsistemanacionalde coordenadas que abarcaba todo el continente norteamericano, una codificacin de lneas en "arcos"queposeanunaverdaderatopologaintegradayquealmacenabalosatributosdecada elementoylainformacinsobresulocalizacinenarchivosseparados.Estesistemajamasllega estar disponible al pblico general, y su uso qued reducido al entorno gubernamental y administrativo PosterioresproyectoscomolosllevadosacaboporlaUniversidaddeHarvardenladcadadelos 70oporM&SComputingenlosochenta,fueronperfilandolosmodelosquehanllegadohasta nuestrosdas. Elusocomercialdeestosserviciosnollegarahastaladcadadelosnoventa,coneltelnde fondodelimpresionantedesarrollodelhardwareyelaccesodelgranpblicoaordenadorescada vezmasmanejablesypotentesapreciosasequibles,as comounaconectividadcrecientealas redesglobalesdedatosyportantoamltiplesservidoresdemapasdecualquierclasesituados encualquierpartedelmundo

0.2.OBJETIVOSDELPROYECTO
Enlaactualidad,existeunagrandemandadeserviciosdeinformacingeogrficadeunaenorme diversidad tanto en temtica, contenidos, formatos y sobre todo de servidores tanto a nivel regional,nacionalosupranacional,quefacilitaninformacinvawebacualquierclientequela solicite.Dichainformacinsueleestarsoportadaenprotocolospropios,porloqueresultamuy complicadopoderintegrardatosprovenientesdemasdeunservidordistinto. Parapropiciar estaconvergencia,elOpenGeospatialConsortium (OGC)defini hacealgunos aoselsistemaWebMapServices(WMS),conelpropsitodeproducirmapasgeorreferenciados espacialmentedeformadinmica.Esteestndardefinecadamapacomolarepresentacindela informacingeogrficacontenidaenelservidor,enformadeunarchivodeimagendigital(png, jpeg,gif...).Cadamapanoconsistiraportantoenuncmulodeinformacincontenidaen la reginprecisada,sinoenunarepresentacinvisualdelamisma,creandodeestemodounforma rpidaycmodadeconsultardichainformacin Haciendousodeestasrecomendaciones,sehandesarrolladoherramientasparaoptimizareluso delosrecursostantodelservidordemapas comodelcliente, con elfinderealizarelmenor numerodepeticionesposiblesyevitar,enlamedidadeloposible,laexistenciadeinformacin redundanteeneltraficoservidorcliente,unodelosprincipalescuellosdebotellaenestetipode serviciosonline. Quiz elprincipaltipodeherramientasoptimizadorasenelcampodelosproveedoresdemapas seanlasdiferentesimplementacionesdememoriasdecachparaalmacenardatosderegionesy capas,disponiblesparaserconsultadasenunfuturosintenerquehacerusodenuevodelas peticionesalservidor,aligerandonotablementelascargasdecomputacin. , Enesteproyectosepretendecompararelfuncionamientodetresdeestasdiferentescaches ponindolasapruebabajodiferentescondicionesdeestrs,capas,usuarios....parapoderas establecer un uso ptimo de estas y propiciar mejoras que puedan ser de utilidad para la integracindelosservidoresdemapasylaoptimizacindelosrecursosdisponibles,tantoenel ladodelclientecomoeneldelservidor.

LastrescacheselegidashansidoTileCache,GeowebCacheyWMSCWrapper.Laprimera construidaenpythonylasotrasdosenJAVA,trabajandolatressobreestndaresWMS,porlo quelosresultadosobtenidosenlaspruebasparaunservidorconcreto(enestecasoGeoserver) pueden ser extrapolados a otro servidor de mapas cualquiera, dando as una clara idea del rendimientoqueofrecerncadaunadeellasentrminosabsolutosenfuncindelasdistintas condicionesalasquesernsometidos.

0.3.ESTRUCTURADELAMEMORIA
Losobjetivosprincipalesdelproyectosecentrarnendosaspectosdiferentes.Porunladoes necesariocrearunaaplicacinquepermitacontrolarlosdistintosparmetrosdecadaunadelas peticionesHttpquesernecesarioenviaralservidor,yporotroladosetendrqueponeraprueba cadaunadelastrescaches escogidasmedianteesusodelaanterioraplicacinsumadaa otrasyaexistentes. Paraellolamemoriaconstardelossiguientesapartados: 1.EnunprimercaptulosepresentarnlastecnologasdelosServiciosWebdeMapasascomo las propuestas WMSC (Web Map Service Cached) y WMTS (Web Map Tiling Service), destinadasamejorarlossistemasdemapas. 2.EnelsegundocaptulosedetallarnlasdistintasimplementacionesWMSCquevanaser testadasalolargodelproyecto, 3. Eneste captulo sedetallar cmose llevaa caboun Benchmarking o comparativaentre distintossistemasdeserviciosWebdemapas 4. Como continuacin se proceder a implementar las distintas aplicaciones que van a ser necesariasparalarealizacindelaspruebasanteriormentedescritas.Ennuestrocasohemos optadoporlacreacindedosaplicacionesdiferenciadas. 5.Posteriormentesernecesarioanalizarlosdiferentesresultadosobtenidosmedianteelusode lasaplicacionesanterioresyobtenerconclusionesacercadelfuncionamientoyrendimientodelas distintasimplementacionesanalizadas.

6. Finalmente se obtendrn las conclusiones y se sugerirn posibles lineas futuras de investigacinydesarrollo. Adems, se adjuntan dos anexos que complementan la redaccin del proyecto y sirven para ampliarconocimientosdecadaunodeloscaptulosprincipales. APENDICEI:instalacindelascachs APENDICEII:manualdeusodelaaplicacin

SERVICIOS WEB DE MAPAS

1.1.SERVICIOWEBMAPSERVICES

ElservicioWebMapServices(WMS)fuedefinidoporelOpenGeoespatialConsortium(OGC)[3] comoestndarparalageneracindemapasgeorreferenciadosdeformadinmicaapartirde informacingeogrfica.Esteestndarinternacionaldefineun"mapa"comounarepresentacinde lainformacingeogrficaenformadeunarchivodeimagendigitalconvenienteparalaexhibicin enunapantalladeordenador.Unmapanoconsisteportantoenlospropiosdatos,sinoenla representacinvisualdeestos.LosmapasproducidosporWMSsegenerannormalmenteenun formato de imagen como PNG, GIF o JPEG y opcionalmente como grficos vectoriales en formatoSVG(ScalableVectorGraphics)oWebCGM(WebComputerGraphicsMetafile). WMS proporciona una interfaz HTTP de fcil manejo para realizar peticiones de mapas georreferenciadassobreunaovariascapasprovenientes as mismodeunaomasbasesde datosgeoespaciales.Cadaunadeestaspeticionesdefinelacapayelreadeintersquevaa ser procesado. Del mismo modo, la respuesta va a consistir en una o varias imgenes georreferenciadasquepuedenservisualizadas endiferentesaplicaciones, desdenavegadores especficosasimplesvisoresdeimgenes.Estainterfaztambinimplementalaposibilidadde especificarciertosgradosdetransparenciasiserealizaunapeticinsobredistintascapaspero sobreunreaidntica.Deestemodopuedenservisualizadasdeformaconjuntayformandouna solaunidaddatosprovenientesdevarios servidoresy/ocapas,consiguiendoas unaabsoluta integracinentrediferentesfuentesdedatosyservidoresdemapasenunslosistema[4]. Elestndarimplementatresoperacionesdistintas[5]. 1. Devolvermetadatosdelniveldeservicio. 2. Devolverunmapacuyosparmetrosgeogrficosydimensionaleshansidobiendefinidos. 3. Devolverinformacindecaractersticasparticularesmostradasenelmapa(opcionales). Cada una de estas operaciones pueden ser invocadas por el cliente mediante un navegador estndarrealizandopeticionesenformadeURLsenlasqueseindicanlosdiferentesparmetros. Sianalizamosunejemplopodemosverdequemodoseincluyentodoslosparmetrosnecesarios paraqueelservidorenvelarespuestadeseadaporelcliente:

http://www.cartociudad.es/wms/CARTOCIUDAD/CARTOCIUDAD?LAYERS=Toponimo%2CDivisionTerritorial %2CFondoUrbano%2CVial&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetM ap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A4326&BBOX=180%2C 90%2C0%2C90&WIDTH=256&HEIGHT=256

Sepuedeobservarqueseefectalapeticinalservidorcartociudadindicndolequelascapas requeridas son Topnimo, FondoUrbano, Vial y Divisin territorial. Tambin se le especifica el formatodesalidadelmapa,queenestecasoser unaimagenpng.Paraindicaralservidorel reasobreelquesevaatrabajar(BoundigBoxoBBox)WMS implementaunareferenciacin absolutaindicadaporcuatroparmetros,correspondientesalosmximosymnimosdelBBoxen cadaunodelosdosejes(enelapartado4delapresentememoriasedetallanestascoordenadas as como el mtodo que se sigue para obtenerlas). Por ltimo se incluye en la peticin una referenciaaltamao(WIDTHyHEIGHT)delaimagenquesedeseaobtener. Estanormaseaplicaaunservidordemapasqueofrecesusserviciosparaproducirmapasms queasucapacidaddeaccesoadatosespecficos.UnservidorWMSbsicoclasificasusrecursos geogrficos encapas, y ofreceun nmerofinitode estilos predefinidos en elquemostrar las capas.EstanormaInternacionalsloadmitecapasyestilosconnombrespropiosyespecificados, ynoincluyeningnmecanismoparaqueelusuariopuedaefectuarunacaracterizacinpropiade losdatos. CadapeticinHTTPutilizadaparaobtenerlainformacindelosservidoreshadecumplirunos requisitosespecificadosenlanormaISO/DIS19128,queindicatantolosparmetrosquehande especificarse,elmodoqueseutilizacadaunodeellosascomolasoperacionesquepermitecada tipodeservidor. Estasnormasyrecomendacionestratandeconseguir unestndar dereferenciaalahorade implementar tanto servidores como clientes de mapas para permitir la obtencin de datos de maneraindependienteasuorigen.

1.2.PROPUESTAWEBMAPTILINGSERVICES(WMTS)

UnconceptomuyimportanteenelestndarWMSyportantoeneldesarrollodeesteproyectoes el de tesela (tile en su terminologa inglesa), definido mediante el TilingStandard y concebido como una representacin de una porcin de terreno correspondiente a una o mas capas determinadas.Deestemodouna reacualquieradeterrenopuedesersubdivididaenparcela regulares (generalmente de forma cuadrada) de tamao variable en funcin de la resolucin deseada,paradeestemodosimplificaryestandarizarlaspeticindedatosalservidorypoder,en casodedesearlo,obtenerdatosdediferentesservidores. Basadosenesteconcepto,yenlasmltiples recomendaciones efectuadas porOsGeo(Open Source Geospatial Foundation) en referencia a cmo deben implementarse estas teselas (TilingStandard [6]), las especificaciones concretas de los servicios implementados por los servidores [7] y otras varias que ataen a los clientes [8], nacen los actuales modelos de servidores y clientes de mapas orientados a la total convergencia y la interconectabilidad operativa. 1.3.PROPUESTAWMSC

Talcomosehavistoenelapartadoanterior,unavezdefinidoelreadelquesedeseanobtener losdatos,serprecisoefectuarunapeticinalservidorindicndolequeteselassonlasrequeridas yapartirdequecapasqueremosobtenerlosdatos.Encasodetenerqueefectuardenuevouna peticinsobreunateselayavisualizadaconanterioridad,elclientetendrquevolveraactuardel mismomodosinquelaanteriorpeticinagiliceenmodoalgunoelproceso. ElobjetivodeunapropuestaWMSTileCache(WMSC)esencontrarunamaneradeoptimizarla distribucindeimgenesdemapasatravsdeInternet.Lapropuestadebedeofreceralgunos mediosporloscualeslosclientespuedanobtenerteselas delos servidores existentes,detal manera que las imgenes pueden almacenarse en una cach en el servidor, en un lugar intermedio,oinclusosercompletamentegeneradossisedesea.Adems,lapropuestadebede sercapazdeadvertiralclientedequeunconjuntodeteselasyacacheadasestdisponiblepara unadeterminadacapadeunparticularproxyWMS.

ConestosobjetivossedefinielactualestndarWMSC,quebienpodradefinirsecomounperfil limitadodeWMSquepermitealmacenarteselasenalgnpuntointermedioentreelclienteyel servidor,conelfindeoptimizareltrficoentreambos.UnservicioWMSCprobablementeslo ofrecerimgenesdeBoundingBoxesajustadasaunorigendeterminadoyenrejillarectangular, ysloalosnivelesdeescalaparticularenquefueronalmacenados. Laideabsicaesque,adiferenciadeWMS,dospeticionesdiferentesparaunamismatesela WMSCdebegenerarunapeticinHTTPGETidntica.Estoinvitaaunaseriedelimitacionesa lassolicitudesdeWMSGetMap[9]: 1. Mnimacadenadeargumentosenlasconsultas(nosepermitenargumentosopcionales). 2. Cadenadeargumentosfija. 3. RangofijodeposiblesBoundingBoxes. 4. PrecisinfijaenlosvaloresdelosBoundingBoxes 5. Tamaofijodelasteselas(enpxeles) 6. Nombredecapafijo(oalmenossuorden) 7. Estilofijo 8. Formatodesalidafijo ObsrveseportantoquelosargumentosLAYERS,STYLES,SRS,HEIGHT,WIDTH,yFORMAT de una peticin GetMap estarn fijados para una capa WMSC de teselas, pero las especificacionesdeWMSobliganaqueestoscamposseincluyanentodasycadaunadelas peticiones. Porotrolado,unproxyWMSCdebedetenerlibertadparadevolverunaexcepcinoredirigirla peticinquerecibesistanoestotalmentecompatibleonocorrespondeaunBoundingBoxque correspondaexactamenteaunanicateselaenlacach. Todosestos procesotienencomofindinamizar los procesos devisualizacin delos mapas y agilizarlaobtencinderesultados.Porejemplo,activandoopcionescomoelmetatiling,podemos conseguirqueelclienteefectepeticionesnosloreferentesalasteselasindicadas,sinotambin alasteselasadyacentesenunradioconcreto,dandoas unasensacindecontinuidadabsoluta ensunavegacin.

Ennuestrocasolasteselassealmacenarnlocalmenteenelladodelcliente,dadoqueelservidor queutilizaremosser tambinunservidorlocal(concretamenteGeoServer),eliminandoas dela comparativaelfactordedependenciareferentealaconexinalservidoryaladisponibilidaddela lineadecomunicaciones.

IMPLEMENTACIONES WMS-C

2.1.CACHEADOENWMS

Segnlovistoenelcapituloanterior,lalabordelascachsparaWMSesactuardeintermediario entre el servidor encargado de proporcionar las teselas y el cliente que es quien va a demandarlas.Aprioriestalaborpodraserllevadaacaboencualquierpuntointermedioentre ambos,bienseaenelladodelservidoroeneldelcliente.Comoeslgico,cuantomscercadel clienteseimplementenestossistemasmsrendimientovamosaobtener,alcanzadounpunto mximosielcacheadoserealizademodolocal,dadoquelascomunicacionesatravsdeinternet suponenenprincipioelprincipalcuellodebotellaenestasconexiones. Portanto,loscasosquevamosaestudiarseencuentranenelextremomsaltodeeficienciaque se va a alcanzar con estos sistemas, dado que las respuestas que hayan sido cacheadas y vuelvanasersolicitadasestarnalmacenadasenlapropiamquinadelusuario,eliminandoen granpartelostiemposdeesperaparalainterconexin. Estosprocesosdeberandepropiciarunamayorvelocidadenlanavegacindelclienteatravs delmapa,yaqueenelprecisomomentoenelquesesolicitaunateselaalservidor,lasquela rodeansonpedidasdeformaconjunta,demodoquesideseamosaccederaellas(habitualenlas consultasrealizadasenlosservidoresdemapasvaweb)slotendremosqueaccederanuestra memorialocalparaobtenerlas,dandounasensacinabsolutadecontinuidadenlanavegacin. Comocontrapartida,elhechofsicodetenerquealmacenarlasteselas,yaseademodolocalo enalgnpuntoentreelservidoryelcliente,exigelanecesidaddereservarespaciosdememoria quepuedenllegaratenertamaosimportantessegnsealamquinaconlaquesetrabajeyla cantidad de teselas que se vayan a cachear, as como tambin acarrear una carga computacionalaadidaquepuedesuponerunlastreimportanteparaotrasoperacionesqueeste llevandoacaboelusuariodemanerasimultneaalaconsultadelmapa.Sertambinobjetivode esteproyecto,cuantificarestosparmetrosparaconocerculdelasimplementacionesposeeuna mayoreficienciatantoenelalmacenamientodelasteselas(ennuestrocasoenelpropiodisco durolocal)comoenelusoderecursosdelamquina.

10

2.2.TILECACHE

TileCache [10] es una implementacin del WMSC en la parte del servidor desarrollado por Metacarta Labs. Es un proyecto basado en Python que realiza la funcin de proxy entre un servidorWMSyunclienteWMSCproporcionandounagestindeCacheparaelalmacenamiento delasteselas. TileCachenaci comounprototipoopruebadeconceptoparatestearlascapacidadesdeesta formaderecuperarcartografaenla web,intentandoacercarlaexperienciadeusuariodeestos sistemasaotroscomolospopularesGoogleMapsoYahooMaps. Ensumodomsbsicodeuso,Tilecacheslonecesitapermisosdeescriturayaccesoaundisco dememoria,lacapacidaddeejecutarscriptsPythonCGIyunservidorWMSparasercacheado. Consloestosrecursos,yapodemoscrearnuestrapropiacachlocaldecualquierservidorWMS yutilizarlosresultadosenalgnclientequesoporteWMSC. Fueelprimerintentoseriodeimplementar unamemoriacach queagilizasela comunicacin servidorclientealmacenandolaspeticionesparasuposterioruso,peroenlaactualidadsuusoha decadoengranmedidadebidoasuquesuconstruccinenPythonleresta,comoeslgico, integrabilidadendiferentesmquinasrespectoalasimplementacionesenJAVA.Ser necesario tenerencuentaesteaspectodesuarquitecturaalahoradeanalizarlosresultadosfinales,dado que entre las tres cachs que van a ser analizadas, es la nica que no est construida ntegramenteenJAVA. 2.3.GEOWEBCACHE

Dado que Geowebcache naci como una adaptacin de Tilecache construida en Java, [11] compartecon stamuchasdesuscaractersticas,funcionandoigualmentecomoproxyentreel clienteyelservidoryalmacenandoteselasamedidaque stassonrequeridas.Deestamanera laspeticionesqueincluyanteselaspedidasconanterioridadnosernremitidasalservidorsino quesernrespondidasmedianteelusodeesainformacinalmacenada.

11

Evidentemente, al estar construido ntegramente en JAVA, aade a las caractersticas de TilecachelaposibilidaddetrabajarencualquiermquinaqueimplementeunentornodeJAVAy presumiblemente,aprioriunmayorrendimientoefectivoalahoradegestionarlaspeticionesylas teselas GeoWebCachehaadelantadoaTileCachecomoimplementacinmsutilizadaenlaactualidad, engranmedidadebidoaquelasversionesmsrecientesdeGeoServer(1.7.1enadelante)ya incluyenestaimlementacinpordefecto.Adems,enlaactualidadseconsideralatecnologade referenciaeneldesarrollodecachsdestinadasaalmacenarteselasenestetipodeserviciosde informacingeogrfica.

2.4.WMSCWRAPPER

AligualqueGeoWebCache,est desarrolladocompletamenteenjavaporelIDELab(laboratorio de Infraestructura de Datos Espaciales) perteneciente al grupo de investigacin universitario ITAST (Infraestructuras, Tecnologas, Aplicaciones y Servicios de Telecomunicaciones) de la UniversidaddeValladolid. WMSCwrapperconsisteenunfiltroquepermitetransformarcualquierservidordemapasestndar enunpotenteservidordeteselasyunafuentedeimgenesparaGoogleEarth.[12].Paraello solamenteserequiereundiscoduropararealizarcach yuntipodeinformacinquenodeba actualizarseinstantneamente.Deestemodoconseguimosquecualquierservidordeinformacin geogrfica ofrezca un formato de salida compatible con los clientes que utilizamos, pudiendo compaginarysuperponerdeestemodocapaseinformacinprovenientesdefuentestotalmente distintasdeunamanerafcilyrpida. Elsistemaseencargaderespetarlostiemposrecomendadosdeactualizacindelainformaciny deasegurarsedequelacach atiendealamayoradelaspeticionesdeforma ptimagraciasa susistemadecacheadoespacialyestadstico.Estesistemaseencargadeadaptarlasdistintas peticionesdeteselasparacachearlasdistintasreascontiguasalasolicitadasinqueenningn casohayaunarepeticinenlasolicitud.

12

ElmetatilingtantoenTileCachecomoenGeowebCachefuncionararealizandopeticionessobre lasteselasadyacentesalaquehemossolicitado,formandoanillosconcntricoscentradosenella, mientrasqueenWMSCwrapperestecomportamientovienetambininfluenciadoporelhechode silasteselasadyacentesestnonocacheadas.Enlaimagenvemoscmofuncionaelmetatiling paralastrescachssinotenemosningunazonaprecacheada(Enrojoteselasolicitadayen negrolasquevanaserpedidasdebidoalmetatiling)

Imagen2.1:metatiling3x3

Imagen2.2:metatiling4x4

13

Sinembargo,sitenemosunazonaprecacheada(enazul)antesdesolicitarlamismatesela,los resultadosnovanaserlosmismosparaTileCacheyGeoWebCachequeparaWMSCwrapper.Lo vemosenunaimagen:

Imagen2.3:TileCacheyGeowebCache

Imagen2.4:WMSCwrapper

14

Como puede observarse, en el caso de TileCache y GeowebCache, existen tres teselas ya cacheadasquesonsolicitadasdenuevo,mientrasqueenWMSCwrapper,todaslasteselasque vanasersolicitadasnohansidopedidasenningnmomento,yportantotendremosunazonaya almacenadaenlascachesmayorqueenelprimercaso.EstesistemadeWMSCwrapper,sibiense adapta mejor a las zonas cacheadas, es posible que genere un retardo mayor que sus competidoresaltenerquesolicitarunporcentajemayordeteselasalservidor(enelcasodela imagen,seran3) La instalacin y configuracin de las diferentes implementaciones puede consultarse en el ApndiceIdeesteproyecto.

15

BENCHMARKING DE SERVICIOS WEB DE MAPAS

3.1.RETARDOSENWMS

Dadalaaperturadelossistemasdemapasalgranpblico,sehaproducidouncambioenel modoenelcuallosusuariosaccedenalainformacin,eltipodeservicioquedemandanyeltipo de informacin que tratan de obtener. En origen estos sistemas fueron diseados para uso administrativoomilitar,porloqueenlaspeticionesqueserealizabanalservidornoprimaban criterios de velocidad uoptimizacin de la atencin a varios clientes simultneos, sino que el servidorsloatendapeticionesdeunnicoclientealavezynormalmentedeunasolateselapor cliente. Elingentedesarrollodelasredesdecomunicacionesglobalesydelacapacidaddeprocesadode los terminales de usuario propici que cada vez ms clientes se interesaran por acceder a informacin geogrfica, cambiando en gran medida el sistema de trabajo de los distintos servidores.Siantescadaservidorsetenaquepreocupardeservirunaspocasteselasaunos pocosusuarios,elaumentodelademandallevaparejadounaumentonoslodelosclientesque realizabanpeticionessinotambindelnmerodepeticionesporcliente.Estecambioenelratiode peticiones por cliente fue debido en gran medida a la sustitucin del usuario institucional o administrativo, que demandaba un plano concreto para un fin determinado, por un usuario particularconunpatrndebsquedasmuchomsirregularycomplejoparaelservidor. Enelprimerescenarioenelcualeranlasadministracionesquienesdemandabanlosrecursos,los tiemposdeesperasibieneranimportantes,noerandeterminantesenlacomunicacin,dadoque lainformacintenaqueserobtenidaapartirdeunservidorconcretoqueeraelnicoquealojaba esemapa.Enladisposicinactualelretardoenelofrecimientodelasteselasesquizelprincipal factor de calidad que rige la comunicacin entre el usuario y el servidor, dado que el cliente demandaprincipalmenteunagraninteractividadyunasensacindecontinuidadenlosmapas.Ya noresultaadmisiblemanteneruntiempodeesperaqueseapercibidoporelusuariocomouna molestiaensunavegacin.Aojosdelclienteelmapasiemprehademantenerunacontinuidady no ha de percibir el modo en el que las teselas van siendo cargadas y visualizadas en su navegador. Parahacernosunaideadelosignificativoonodeestostiemposdeesperayportantodela calidaddeservicioqueofreceundeterminadoservidorsurgenlosBenchmarksocomparativas entrecadaunadelasdiferentescachs.

16

3.2.BENCHMARKSENWMS

Alolargodelahistoriadelainformtica,elusodepruebasendetalleobenchmarkshasidoalgo muycomn,deformaquelosresultadosobtenidosdeformaobjetivaenlasdistintasarquitecturas mediante estas pruebas podan ser comparados. En general, la realizacin de pruebas comparativas no suele ser una tarea fcil y requiere de sesiones repetitivas para llegar a conclusiones tiles,siendotambindifcillainterpretacindelosresultadosdelaspruebas.Un factoratenerencuentadurantelarealizacindelaspruebasesquelosfabricantessuelenafinar susproductosespecficamenteparalosbenchmarksmscomnmenteutilizadosensusector,por loquehayquetenerespecialprecaucinalahoradeinterpretarlosresultados.Adems,los benchmarksgeneralmente,apartedelasmedicionescuantitativasdelrendimientodeunsistema, nosuelentenerencuentaningunamedicincualitativaacercadelserviciocomopuedenserla seguridad,ladisponibilidad,laconfiabilidad,laescalabilidad,oelgradodeconformidadconlas especificaciones,lascualessontanomsimportantesquelasanteriores[15].Dentrodelamplio espectrodepruebasdeBenchmarkingqueexistenparaevaluarelrendimientodecasicualquier componentesoftwareohardware,haydoscamposquesondeespecialrelevanciaparaelcaso quenosocupaenestetrabajo:lasbasesdedatosylosserviciosweb.Dentrodelosobjetivosde esteproyectonoseencuentraelhacerunestudioenprofundidaddelrendimientodelosdistintos gestoresdebasesdedatos,yaseanlibredistribucincomoMySQLyPostgreSQLopropietarias comoOracleServeryMicrosoftSQLServer.Peroesinteresantehacermencindelaexistencia demultituddebenchmarksorientadosalaevaluacinde stos,yaquelasbasesdedatos,yen concreto aquellas que disponen de extensin espacial, son comnmente utilizadas como repositoriosparaelmanejoyaccesoalainformacingeoespacial,bienseadeformadirectaa travsdeclientes,oindirectamentepormediodeservicioswebdegeoprocesamientocomoesel casodelosWebMapServices. Existeademsalgunosestudioscomparativosacercadelosrendimientostantodelosservidores (nosotrosslousaremosgeoserver)comodelascachsens.Este ltimogrupoeselquems nosinteresaporserelmsparecidoalestudioquevamosallevaracabo.Comoejemplotenemos unestudiollevadoacaboporOpenGeobajoelttuloComparingthePerformanceofOpenSource Web Map Servers, en el que se incluye entre otros muchos, un apartado comparativo entre GeoWebCacheyTilecacheparaunasdeterminadascondiciones.

17

LosresultadosobtenidossonparaTilecache2.04yGeoWebCache1.0beta0(enesteproyecto lasversionesaanalizarsern 2.10y1.1.3paraTilecacheyGeoWebCacherespectivamente),e indicanunresultadomuyparejoenunasimulacinconcretasobreGeoserver1.7.0(ennuestro casoserlaversin1.7.5)

Imagen3.1:EstudiosobreTileCacheyGeoWebCache
Estosresultadossehanobtenidosaturandounalneadeconexinconelservidorde100Mbps, llegando a alcanzar en ambos casos (sus comportamientos son prcticamente iguales) una velocidadde450teselasporsegundo.Dadoquelasdistintasimplementacionesdelascachs hanidomejorandoyqueennuestrocasoelservidorser local,esdeesperarquesemejoren sensiblementelosresultadosobtenidosenestamedicin.

18

As pues,lacomparativaquellevaremosacabosebasarprincipalmenteeneltiempodeespera quehadesoportarelclientealahoraderecibirunarespuestaasupeticin,dadoqueser ste el principal parmetro de medicin de la calidad de servicio en este tipo de comunicaciones. Ademstambinsereflejar unamedicindelatasadetransmisindeteselas porpartedel servidor,quedar ideadelrendimientocomparativoparacadaunadelasimplementacionesque vamosaestudiar. Apartirdelosdatosanterioresesdeesperarquelleguemosalasconclusionesnecesariaspara afirmarqucachsecomportamejorencadaunodelosescenariosyculeselmotivodedicha diferencia.

19

DESARROLLO DE LA APLICACIN DE BENCHMARKING

4.1.OBJETIVOSDELAAPLICACIN
Losobjetivosgeneralesenesteapartado,sernlosmarcadosalcomienzodelproyecto,quese puedenresumiren6principalmente: GenerarunarchivolegibleporJmeterconcadaunodeloscamposyparmetrosnecesarios paralaspeticionesHttp.

GenerarunarchivolegibleporJmeterconvaloresdelosbboxesvlidos. Gestionardemanerarpidaysencillatodasycadaunadelasvariablesincluidasenellas peticiones. Generaruninterfazcmodoysimplequepermitaunarpidagestindelasvariablesydelos campos. Flexibilidad suficiente para poder ser adaptada en posteriores pruebas en entornos suficientementesimilares. Nogenerardemasiadacargacomputacionalquepuedaalterarlosresultadosobtenidosenlas medidasdeeficiencia.

Para cumplir estos objetivos contaremos adems con otras aplicaciones ya desarrolladas y presentadasenanterioresapartadosdentrodeestemismoproyecto.

4.2.ESQUEMADEFUNCIONAMIENTO

Enesteapartadosedetallar laestructuraquehadeseguirnuestraaplicacin,as comolas partesdelasqueestarcompuestaparasucorrectofuncionamiento.Dadoqueesnecesarioque realiceunbuennmerodefunciones,sernecesariodividireltrabajoarealizarentremsdeuna aplicacin, cada una construida en el lenguaje y formato mas adecuado parasus respectivas funcionalidades.

4.2.1.ARCHIVODEJMETER Paralarealizacindelaspeticionesseutilizar laaplicacinJmeter,quepermitegenerartrfico httpconlacondicionesquesedeseenencadamomento.

20

Elarchivoquehadecrearseyejecutarsecadavezquesequierarealizarunapeticinser del tipo.jmxydeberdetenerlossiguientescomponentes:


grupodehilos cuatrobloquesdeparmetrosdefinidosporelusuario bloquedeconfiguracindecsvdataset valorespordefectoparaunapeticinHTTP unbloquedepeticinHTTP unescritordedatossimple ungeneradordeunsumarioderesultados.

Elesquemageneraldelarchivo.jmxunavezejecutadoporelJmeterquedar portantodela
siguiente forma (el nombre elegido es NonGUIText.jmx cuyo significado ser explicado mas adelante):

Imagen4.1:EstructurageneradaenJMeter
En archivos de Jmeter existe la posibilidad de no asignar un valor numrico concreto a las variablesdecadaunodelosbloquesquehemoscolocado.Estosepuedehacermedianteeluso devaloresdevariabledeltipo${__P(variable,valor_por_defecto)}endeterminadoscampos.De estamanera,cuandoejecutemoslaaplicacin,esposibleintroducirelvalorconcretodeestos camposmediantelautilizacindeargumentosdeltipoJvariable=valor_deseado,oencasodeno hacer uso de estos argumentos, el programa tomar por defecto el valor_por_defecto que hallamosagregado.

21

Deestamanera ennuestrocasolasvariablesquehemoscolocadoencadaunodenuestros bloqueshansidolassiguientes: GRUPODEHILOS: Nombre:WMSCUsers NumerodeHilos:${THREADS} PeriododeSubida:${RAMP_UP}


VARIABLESDEFINIDASPORELUSUARIO(paraelgrupodehilos) THREADS:${__P(threads,1)} RAMP_UP:${__p(ramp_up,0)}

VARIABLESDEFINIDASPORELUSUARIO(paralapeticinHTTP) HOST:${__P(host,localhost)} PORT:${__P(port,)} PATH:${__P(path,tilecache/tilecache.py)} CSV:${__P(csv,bboxes/bboxes.csv)}

VARIABLESDEFINIDASPORELUSUARIO(valorespeticinWMSC)

LAYERS:${__P(layers,topp:hidrografia)} SERVICE:${__P(service,WMS)} VERSION:${__P(version,1.1.1)} REQUEST:${__P(request,GetMap)} SRS:${__P(srs,EPSG:4326)} WIDTH:${__P(width,256)} HEIGHT:${__P(height,256)} FORMAT:${__P(format,image/png)}

VARIABLESDEFINIDASPORELUSUARIO(listener)

OUT:${__P(out,results.txt)}

VARIABLESPORDEFECTOPARAPETICIONHTTP(listener)

LAYERS:${LAYERS} SERVICE:${SERVICE} VERSION:${VERSION} REQUEST:${REQUEST SRS:${SRS} WIDTH:${WIDTH} HEIGHT:${HEIGHT} FORMAT:${FORMAT

22

CONFIGURACINDELCSVDATASET NOMBRE:BBoxfromCSV NOMBREDEARCHIVO:${CSV} VARIABLE:BBOX

PETICINHTTP

NOMBRE:WMSCRequest

ESCRITORDEDATOSSIMPLE

NOMBRE:ResultListener NOMBREDEARCHIVO:${OUT}

GENERARSUMARIODERESULTADOS

NOMBRE:ResultsSummary

Todos estos datos tendrn que ser proporcionados al Jmeter en funcin de la cach que queramosprobar,lacapaquedeseemos,elnumerodethreads....Portantotendremosquecrear un sistema para poder hacerlo, pero con la configuracin actual, podramos realizar ya una simulacindetraficosatisfactoria.

4.2.2.GENERADORDEBBOXES

Todas las implementaciones de cachs con las que vamos a trabajar manejan sistemas de
teselas(otilesensunomenclaturainglesa),porloquelasaplicacionesquecreemostienenque adaptarseaestefuncionamiento. Unateselaesunaporcindemapa(ennuestrocasodeformacuadrada)detamaovariableen funcindelaresolucin,querepresentaunaseccindeunacapa.Eltamaodelasteselasno puedeserarbitrario,hadeestarenunosrangospreestablecidos.EnlossistemasWMSCque vamosautilizar,lalongituddeloslateralesdecadateselavavenirdeterminadoporunaseriede valoresnumricosconcretospropiosdeestatecnologa.Portantosehaceimprescindibleconstruir una aplicacin que genere grupos de teselas vlidos o bounding boxes (bboxes) para las peticiones.

23

Dicha aplicacin ser generada en Java a travs de eclipse dado que as podemos crear un
sistemaportableaotrasmaquinasydistribuciones,ademsdepoderrealizareltrabajoconpoco esfuerzotantodedesarrollocomodecargacomputacionalalahoradesuejecucin. A.GENERACINALEATORIADETESELAS

EnprimerlugarveamoscmopodemosgenerarunBBoxvlidoapartirdelosvaloresmximoy mnimotantoenelejeXcomoenelYdeltrozodemapaquequeremostomar(paraservlidos estosvalorestambinvanatenerquecumplirunascondicionesqueveremosmsadelante),as comodelasresolucionesmximaymnimayeltamaodecadatesela(anchoyalto).Adems sernecesariaunamatriz(resmat[])conlosvaloresvlidosdelostamaosdelasteselas.Dicha matrizestdefinidaenlosestndaresdeWMS. Podemos visualizar lo que significa una teselizacin global a partir de las siguientes dos imgenes.Laprimeralaobtendramosparalaresolucinmnima(0),constandoportantodeslo dosteselas,ylasegundoparaunaresolucinde2:

Imagen4.2:Teselizacinpararesolucin=0

Imagen4.3:Teselizacinpararesolucin=2 24

ParaqueelBBoxseavlidoypodamostrabajarconelsinproblemas,esnecesarioquecontenga unnmeroexactodesubdivisionesoteselas,porloqueelhechodequeseaonovlidovaa depender de la resolucin a la que se trabaje. Por ejemplo, en las siguientes dos imgenes podemosvercomoenuncasoelBBoxelegidonosercorrectoparalaresolucindada,mientras queelsegundosi:

Imagen4.4:BBoxnovlido

Imagen4.5:BBoxvlido
Portantoelprimerobjetivoquetendr quesalvarnuestraaplicacinesimplementaruncorrector de coordenadas que nos calcule qu Bounding Box vlido es el mayor dentro del que le indiquemos.Enlaprimerafiguraelprogramatendraquesercapazdedetectarquenoleestamos indicandounazonacorrectayportantoelegirautomticamentelateselas que contiene.Silo vemosenundibujo,lazonaqueseleindicaalaaplicacinesladibujadaennegroylazonaque ldebedetomareslaroja.Sepuedeobservartambinquelaprecisinconlaquesevaaajustar alcontornodelazonadeseadavaadependerengranmedidadelaresolucinalaqueestemos trabajando:

25

Imagen4.6:Resolucinbaja=>poco ajuste

Imagen4.7:Resolucinmayor=>mayor ajuste

EnestepuntoyatenemosunBBoxqueincluyeunnumeroenterodeteselas,porloquepodemos trabajarcon lsinriesgoalguno.Elsiguientepasoconsistir enirproporcionandocadatesela contenida en esta zona de manera individual y aleatoria conforme a las especificaciones que deseemos. Dadoqueconocemoslaresolucinalaqueestamostrabajando,eltamaoenpxelesquevaa tenercadaunadelasimgenesquevamosaobtenerylascoordenadasdelBBoxconelque estamostrabajando,resultasencillosabercuantasfilasycolumnasdeteselastenemosdentrodel readetrabajo.Lasiguienteimagenrepresentaestehecho.

Imagen4.8:parmetroquecaracterizanunBBox 26

Sabemosqueelanchodeunatesela(queserigualqueelaltodadoquelasteselasconlasque trabajamosvanasercuadradasydenominaremosTileSpanX)vaaserelproductodeltamaoen pxeles (por defecto normalmente sern 256x256) por un factor sacado de una matriz de elementosyquevaadependerdelaresolucin.Porlotanto,comoconocemosambosfactores, conocemoseltamaoexactodecadaunadelasteselas. ParasaberelnmerodefilasdeteselasquecontienenuestroBBoxbastaconoperarmaxYminY ydividirloentreeltamaodelasteselasyacalculado.Paralascolumnasseoperar deigual forma,perotomandocomoparmetrosmaxXyminX.Debidoalarestriccinantesimpuesta,este nmerodefilasydecolumnasvaaresultarsiempreunnmeroentero.Evidentementeelnmero defilasydecolumnasseirmultiplicandoamedidaquevayaaumentandolaresolucintomada. Finalmentebastar conelegirdemaneraaleatoriaunafilayunacolumnaparatenerunatesela concreta.Enelsiguienteejemplosehabraelegidoaleatoriamentelasegundafila(numrow=1)y terceracolumna(numcol=2).Lasfilassecuentandearribaaabajoylascolumnasdeizquierdaa derecha

Imagen4.9:Teselaseleccionadaaleatoriamenteysusparmetros 27

Paracalcularlosdistintosparmetrosdelateselapedidaseoperardelasiguienteforma: tileminX=minX+numcol*TileSpanX tilemaxX=minX+(numcol+1)*TileSpanX tilemaxY=maxYnumrow*TileSpanY tileminY=maxY(numrow+1)*TileSpanY DeestemodoyatenemosunateselaconlaresolucinpedidaydentrodelBBoxindicado.En nuestraaplicacinsehaimplementadounmecanismoparaquelaresolucinalaquesetoman lasteselaspuedavariardentrodeunrangoindicado,demaneraqueaunquelazonadetrabajo quede fija desde un primer momento, el tamao de las teselas depender de otro generador aleatorioqueirescogiendolaresolucinentrelosvaloresindicados. Finalmenteslorestaescribirlosdatosdecadateselaenunarchivo.csvparasuposterioruso. Caberesearqueelordenenelqueseescribecadaunadelascuatrocoordenadasdecada tesela no es permutable, y ser el siguiente (segn se han nombrado en el dibujo): tileminX, tileminY,tilemaxXytilemaxYseparandocadaelementoporunacomayescribiendocadatesela enunalineaseparadadelarchivo. B.OBTENCINAPARTIRDEUNABASEDEDATOS Puederesultarinteresanteteneralmacenadasenunabasededatoslasdistintasteselasquevan aserutilizadas,demodoquecuandoqueramosobtenerunarchivolegibleporJmeterquelas contengaslotengamosqueefectuarunaccesoadichabasededatosyunatranscripcinal archivo.csv.Ennuestrocasocontamosconunabasededatosproporcionadaporcartociudaden laqueseincluyeunalistadeteselasdediferentestiposyresolucionesconjuntamenteconotros datosquenovanaserutilizadosenlarealizacindeesteproyecto. Parapermitirquelaaplicacinaccedaalabasededatos,ser necesariohacerusodeJDBC (JavaDataBaseConectivity),herramientadeJavaquepermiteestablecerconexionesconbases dedatos.Laformadeefectuarestaconexinessimple,bastar conestablecerunaconexin medianteundriver,indicndoleunusuarioyunpasswordvlidosparaelaccesoadichabasede datos(quehabremoscreadoconanterioridad).

28

Una vez establecida la conexin de manera correcta, podemos obtener los datos contenidos medianteconsultas,demaneraanlogaacomopodrarealizarseconpostgresqloconcualquier otrogestor. Conociendoelnmerodeteselasquedeseamosobtenerbastarconleerunnmeroderegistros igualaaesenmerodepeticiones,accediendosloalacolumnadeseadaytransformarlosdatos queobtendremos(escritosenformapoligonal)alformatodecuatrocoordenadasqueestamos utilizando.Elformatoenelqueestnregistradaslasteselasseracomoseindicaenlaimagen:

Imagen4.10:ParmetrosdeunateselaenformatoPolygon
Cadateselaestarrepresentadacomo((x1,y1;x2,y1;x2,y2;x1,y2;x1,y1)). Siloadaptamosanuestrosistema,tendriamosque: tileminX=X1 tileminY=Y2 tilemaxX=X2 tilemaxY=Y1

29

Denuevoyaslorestaescribirloenelarchivo.csvcorrespondienteycortarlaconexinconla base de datos para no consumir recursos de una manera innecesaria, ya que no existe la posibilidadderomperlaconectividadpordefecto. C.INTERFAZGRFICA.

Paraqueelmanejodeestaaplicacin resultemassencillo, hemos optadopor introducirleun interfazgrficoquepermitagestionartodoslosparmetrosdeunaformamassencillayvisual. Dado que eclipse incluye opciones para crear aplicaciones grficas de una manera sencilla y eficaz,nosernecesarioconfigurarmanualmentecadaunodeloscomponentesnilasrelaciones queseestablecenentreellos. Elaspectoquevaatomarnuestrainterfazvaaserelsiguiente

Imagen4.11:InterfazgrficadelaaplicacinBBoxgenerator
comopuedeobservarsenocontieneunagrancantidaddeinformacin,perosilaprecisapara podergestionardemaneraeficazlageneracindeBboxesvlidosuobtenerlosapartirdelabase dedatosdecartociudad.

30

Estcompuestaporcuatrozonasoapartados:

Imagen4.12:ComponentesdelaInterfazgrficadeBBoxGenerator
Enlazona1podemosestablecerlasresolucionesmnimaymximaconlasquevamosagenerar losBboxes.Hayqueresearqueaefectosdelclculodelavalidezdelazonaqueposteriormente indicaremoscomolazona deseada,laaplicacintomar elvalor mnimodentrodel rangode resolucionesquelehayamosintroducido. Lazona4permiteestablecerelnombredelarchivoquevaasergeneradocontodoslosBboxes vlidos.Pordefectogenerarunficherollamadobboxes.csv En la zona 3 podemos introducir el numero de teselas que deseamos pedir as como una indicacindelasquedeseamosqueestnrepetidasdemaneradirecta.Funcionadelasiguiente manera:laaplicacingeneralosparmetrosdeunBBoxparticularyloescribeenelarchivo.csv, posteriormenteevalalaprobabilidaddequeestateselaest onorepetida(prob1repenel interfaz).Encasodequestaserepita,volverahacerlomismoconlaposibilidaddequeest repetidaunasegundavez(prob2rep)yas sucesivamentehastacuatroveces.Portantosipor ejemploindicamosquelasprobabilidadesrespectivasparauna,dostresycuatrorepeticiones son:100,100,0,0cadateselaaparecertresveces.

31

Hay que tener en cuenta que en el proceso aleatorio de eleccin de teselas es posible que tambinseproduzcaalgunarepeticin.Si pensamos en elcasovistoanteriormenteparauna resolucinqueseestablezcaen0,elprogramaslotendrdosteselasdondeelegir,porloquesi lepedimosquenosgenere100Bboxes,esseguroque98deelloscomomnimosernrepetidos. Lazona2esquiz laquetieneunmanejomascomplejo.Enlascuatrocasillassuperioresse debedeescribirlascuatrocoordenadasdelBBoxquedeseemos,queser elquelaaplicacin tomara.Comosehavistoanteriormente,losvaloresquehayamosintroducidonotienenporqu servlidos,porloquesehadiseadounsistemaquecorrigedichosvaloressinqueelusuario tengaporquadvertirlo.Noobstantesisedeseaunavisualizacindelazonaquesehaescogido enreferenciaaunmapadelmundo,sehaimplementadolaposibilidaddevernoslolazonaque hemoselegidocomonuestroBBoxdeseado,sinotambinlazonaquelaaplicacintomarcomo correccindelaintroducidaporelusuarioyqueserelBBoxvlidomasgrandedentrodelquese lehayaindicado.Laventanaquedadeestemodo:

Imagen4.13:EjemplodeautocorreccindeBBox
Ademsdemostrarloenunmapa,enlascuatrocasillasqueestainmediatamentebajolasque hemos escrito los valores del BBox deseado aparecern los valores vlidos con los que la aplicacintrabajar.

32

EncasodequeresulteimposiblegenerarunBBoxvlidoapartirdelosqueleindiqueelusuario aparecer una ventana de advertencia y los valores que tomar entonces la aplicacin como correctosserlosvalorespordefecto,esdecir,todoelmapacompleto. EnestazonatambinseencuentraelbotnBBDD,quepermiteobtenerelnmerodeteselasque se indique en en la casilla number of Bboxes directamente a partir de la base de datos de cartociudad. Finalmentesisehanintroducidotodoslos datosdemaneracorrectaysepulsaelbotnOK, emerger unaventanaindicandoquelaoperacinhasidorealizadacorrectamenteyelarchivo .csvhasidogenerado. Dadoquealgunosparmetrospuedequetenganquesermodificadosunavezfinalizadalalabor deprogramacin,hemosdecididoincluirunarchivodepropiedadesparaquenoseanecesario cambiar nada ms que los valores precisos de estos. Tambin ha sido necesario incluir un mecanismoparaleerestearchivodepropiedadesyproporcionarlosresultadosalaaplicacin.

33

4.2.3.REPORTEDERESULTADOS

CadasimulacinefectuadaporelJmetergenerar (comosevioanteriormente)unarchivo.csv contodosycadaunodelosresultadosobtenidos.Porlotantoalfinalizartodaslasiteraciones existirnvariosarchivosdeltipotilecache1.csv,tilecache5.csv,geowebcache1.csv.......enfuncin del numero de threads de la simulacin y del tipo de cach testada. Dado que no toda la informacinquecontienenestosarchivosesdeutilidadparanuestrainvestigacin,sehaoptado porgenerarapartirdeellosunsoloarchivoqueresumalosdatosmasimportantesenunasola tablayque staseavisualizadagrficamentemedianteunarchivo.xls.Adems,estearchivo puedealmacenarsucesivaspruebasparaunnumerodethreadsrepetido,esdecir,sirealizamos unasimulacinpara5threadsyposteriormenteotrapara5threadsigualmente,losresultadosse almacenarndeformaindividual,mientrasquesinofueranescritosenunarchivo.xlsexistiraun conflictoalahoradegenerarlosnuevosficheroscsv. Elsistemahadeserlosuficientementeflexiblecomoparaadaptarseaundiferentenmerode archivos.csv(dadoqueapriorinoconoceremoselnmerodethreadsutilizados)yaquecada unocontengaunnmeroindeterminadodelineas(enfuncindenmerodebboxes). A.Template.xls Paralageneracindelarchivo.xlspartiremosdeunmodeloflexiblequepermitavisualizarlos resultadosdemaneragrfica.Estemodelotendrdosgrficasparalosdosjuegosderesultados queobtendremos,eltiempomedioporteselaylasvelocidadmedidaenteselasporsegundoque alcanzacadacache. Paraesteproyecto,sehautilizadoExcel2003paralageneracindelarchivomodelo,as como OpenOffice2.4parasugestin. Parapoderconseguirquelasgrficasrepresentenunnmerovariabledeentradas,haremosuso dedefinicionesdereamediantenombres,delmodosiguiente.SeleccionamoslaopcinInsertar Nombre Definir. Definimos un nombre para la variable, en nuestro caso tilecache, geowebcache,wmscwrapperythreads,ylesasignamosvaloressiguiendoelsiguientepatrn: nombre=DESREF(hoja1!primera_celda;;;CONTARA(hoja1!$A:$A)1;1)

34

Conestafuncinconseguimosdefinirun reaquevariar enfuncindelnmerodevaloresque contengalaprimeracolumna,porloquesileindicamosaunagrfica,quehadetomarlosvalores incluidos en dicha variable, obtendremos una grfica de mas o menos numero de columnas dependiendodelascasillasconvalorendichacolumna.Deestemodoelmodelo,quecontendra lasdosgrficasquedaradelsiguientemodo

ModelodeTemplate.xlszonasuperior

Imagen4.14:ModelodeTemplate.xlszonainferior
Enelmodeloquealmacenaremos,noseencontraranvaloresenlascasillasnumricas,perose hanincluidoenelejemploparaunamejorvisualizacin. Finalmenteindicarquela nicatareaquenosresta,essobreescribirlosvaloresquesedeseen incluirenelgrficoencadaunadesuscorrespondientescasillasmedianteunaaplicacinque generaremos.

35

B.ALMACENAMIENTODERESULTADOSYGENERACINDEREPORTE

Encadaejecucinhemosdecididoalmacenarlosdatosrelevantesenunarchivoconelfinde podertenerunndicedelsejecucionesconsusresultadospropios,paraluegopodercalcularlos parmetrosquesecreaconvenientesypodermostrarlosenelmodeloanterior. Cuandofinalicentodaslasejecuciones,sernecesariosobreescribirlahojamodelodeexcelcon losdatosobtenidosygenerarunavisualizacinenlineadecomandosconlosmismos. Paraellopartiremosde losarchivos .csv quegeneraJmeter en cadauna delas ejecuciones (tilecacheNUMERODETHREADS.csv, geowebcacheNUMERODETHREADS.csv y wmscwrapperNUMERODETHREADS.csv),ycalcularapartirdecadaunoeltiempomediopor teselaylatasamediadeemisindeteselasporpartedelservidor. Tpicamenteunodeestosarchivostendrelsiguienteformato:
timeStamp elapsed 1258446582713 141 1258446582868 25 1258446582896 2 1258446582901 3 1258446582907 3 1258446582913 3 label WMSCRequest WMSCRequest WMSCRequest WMSCRequest WMSCRequest WMSCRequest responseCode 200 200 200 200 200 200 responseMessage OK OK OK OK OK OK threadName dataType success bytes bin 562 WMSCUsers11 true bin 562 WMSCUsers11 true WMSCUsers11 true bin 562 WMSCUsers11 true bin 562 bin 562 WMSCUsers11 true bin 562 WMSCUsers11 true

TimeStampesuncdigotemporalcorrespondientealmomentoexactodelenvodecadapeticin porpartedelJmeteryelapsedeseltiempoquetardacadateselaenserrespondidaporpartedel servidor. Estos dos sern los parmetros que utilizaremos para calcular tanto la tasa de transmisindelservidorcomoeltiempomedioportesela. Paracalculareltiempomedioqueempleacadaimplementacinenresponderunatesela,bastar consumareltiempoindividualqueempleaencadaunadeellasycalcularlamedia.Paracalcular latasaser necesarioconocerellapsodetiempototaldesdequeseenvalaprimeradelas teselas hasta que la ltima es recibida por el usuario. Para ello calculamos el mnimo de la columna TimeStamp, y lo establecemos como tiempo de origen o tiempo cero, seguidamente hallamoselmomentoexactoenelcuallaltimateselallegaalreceptorhallandoelmximovalor deunahipotticacolumnaquenosreflejaseelcdigotemporalenelquecadarespuestallegaal usuario(TimeStamp+elapsed)

36

Una vez hallados los valores inicial y final del experimento, bastar dividir el numero total de teselaspedidasentreeltiempototaldelensayoytransformarloensegundosmultiplicandopor 1000. Deestemodoobtenemoslosdatosdecadaunadelascachsparacadapruebaindividual.Como sedijoanteriormente,resultanecesarioalmacenarestosdatosindividualesenunarchivo .xls parasuposterioruso.ParaelloharemosusodePOI,unAPIparaJAVA[16]quepermitecreary gestionarhojasdeclculodeunamanerarpidaysencilla. Comoslosequieretenerunaaplicacinpararealizardosfunciones(iralmacenandolosdatosa medida que se generan y generar el archivo grfico al finalizar todas las ejecuciones), ser necesariointroducirunabifurcacindentrodelcdigo.Ennuestrocasohemosoptadoporhacerlo apartirdelosargumentosqueseintroduzcanenlaejecucin:storeseguidodelnumerode threadsenelcasodequesepretendaalmacenarlosdatososimplemente0paraelcasodeque sequieranmostrarlosresultadosfinales. Elmtodousadoparaalmacenarlosdatosessencillo.Enprimerlugarsepartedeunahojade clculo vaca, a la cual se aade una linea, con los datos obtenidos como se explic anteriormente,porcadapruebaindividualparaunnumerodethreadsconcreto.Asporejemplosi serealizantresejecucionesconunosvaloresdelnumerodethreadsde1,1y2respectivamente, bastar conejecutaralfinaldecadaiteracin(cuandolosarchivos.csvestncompletosyensu lugar)laaplicacinJmeterReports.jarprimeroconlosargumentosstore1,despuesstore1de nuevoyfinalmentestore2. Alfinaldelastresiteracionessiconsultamoselarchivostore.xls,podremosencontrarnosconlos siguientesresultados:
threads 1 1 2 WMSCwrapper 1,11 1,02 1,6 AVG TIME GeoWebCache 1,74 1,46 2,01 TileCache 1,83 1,82 2,54 WMSCwrapper 601,94 646,45 858,52 AVG RATE GeoWebCache 431,69 499,7 703,19 TileCache 27,7 419,83 602,99

Cadaunadelaslineasserportantoelresultadodeunasimulacindistinta.Comosepuedever dosentradasdistintastienenelmismovalorparalacolumnathreads,perodiferentesvalorespara elrestodadoquepertenecenapruebasindependientes.

37

Unavezquesehacreadoelarchivodealmacenamientostore.xlsyhabiendofinalizadotodasy cada una de las diferentes pruebas que se quieren mostrar, bastar con ejecutar JmeterReports.jarconelargumento0. Enprimerlugar,dadoqueesposiblequealgunaspruebashayansidorepetidas,ser necesario calcularlamediaentrelasdistintasentradasconunvalorigualdelacolumnathread. Esteprocesosellevar acaboendosfases.Enunaprimeraoperacin,seordenarntodaslas entradas en funcin del numero de threads de cada una, para posteriormente ir leyendo las distintaslineasdelarchivoyeircalculandolasmediasdelasqueestnrepetidas. Unavezquetenemosslolosvaloresquequeremosmostrar,bastar conaccederalmodelo template.xlsquetenemosalmacenadoenlaseccinderecursosyescribirlasceldasadecuadas paraquestemuestrelasgrficasdeseadas. Para una visualizacin rpida, hemos decidido implementa otrafuncionalidad que escribe una tabla de resultados en la linea de comandos con todos los datos obtenidos en las distintas iteraciones.Estatablatomaslosdatosdirectamenteapartirdelarchivostore.xls,porloquesi existendosomaspruebasrepetidas,latablalasmostraradeformadiferenciada. AligualqueenelcasodeBboxGenerator.jar,sehaincluidounarchivodeconfiguracinyun sistemainternoparaleerloconelfindesimplificarlaconfiguracindelasaplicacionesypoder introducircambiosenlasrutasalosarchivosdeentradaysalidaconfacilidad.

38

4.2.4.ESTRUCTURAMAVENSVN

Dadoquesepretendeintegrarlosresultadosylosmtodosquecomponenesteproyectocon otrosproyectosytrabajosllevadosacaboporelIDELAB,sehacenecesariolacreacindeuna estructura que permita su portabilidad a cualquier mbito y su accesibilidad dentro de los servidoresenloquesetrabaja. Paraellosehacreadounaestructuraquedefinaelsoftwareaconstruirysusdependencias,as comounrepositorioapartirdelcualsepueda,tantodescargarlaaplicacincomoactualizarla, modificarlaosimplementeintegrarlaenotrosproyectosMaven. Estasestructuraspermitentambinalojarrecursos (comotemplate.xls)dentrodelaestructura reduciendoaselnmerodearchivosexternosqueelusuariovaatenerquemanejar. ElusodeSVNpermiteademsquevariaspersonasestntrabajandoymodificandoelmismo proyecto de manera simultanea, pudiendo as fomentar la colaboracin de una manera muy notableypermitiendoademstrabajarreutilizandomdulosyaexistentes. TantoladefinicindelaestructuradeMavencomolacreacinderepositoriosenelservidordel laboratorio,corrieronacargodetcnicosdelpropiolaboratorio,dadoquelanaturalezadeestas tareasrequieredeunadministradorconsuficientespermisosparaello.

39

4.2.5.SCRIPTS

Alahoradellevaracabo cadaunadelas pruebas,seranecesariorealizarunaordenque incluyesecadaunadelasvariablesrecogidasenelarchivodeJmeter(OUT,PATH,HOST.....) paratodasycadaunadelasiteraciones,loquesupondraralentizarelprocesoyprovocarla existenciadeposibleserrores.Parasolucionaresteproblemanoshemosplanteadolaopcinde creartressencillosscriptsquefacilitansensiblementelatareayreducenlaposibilidaddeerroral introducirtodoslosdatosqueserequierenparacadaunadelassimulaciones. A.Benchmark.sh

Estescriptconsisteenunaseriedeordenesencaminadasaintroducirtodoslosdatosqueson necesariosparaelcorrectofuncionamientodelaestructuraquehemosconstruidoconelJmeter, as como proporcionar una visualizacin del punto en el que se encuentra el proceso en un determinadomomento. Ademsfuncionacomoelementodecohesinentrelosdistintoselementosypermitedireccionar losflujosdedatosenfuncindedondeseencuentrenubicadoscadauno.Estofacilitalatareade configuracindetodoelsistemamedianteunospocoscambiosensucdigo. B.Clean_caches.sh

Enmuchoscasosesnecesarioprocederalvaciadodelascachesparapodercontrolaryrestringir suusoendeterminadassituaciones.Parafacilitarlalaborhemoscreadoestesencilloscript.Su funcionamientoesmuysimple.Dadoquelasteselassonalmacenadasenformato.png,lo nico quehayquehacereslocalizarestosarchivosdentrodelasdireccionesdelascachesyeliminarlos ,siemprequesetenganlospermisosnecesariosparaello. Enfuncindelacapaalaquesehayaaccedidoesposiblerealizarunvaciadoparcial,dejandolos datosobtenidosdeotrascapasintactos. TantoTileCachecomoWMSCwrapperpierdensuscachesalcabodeuntiempodeterminado, dadoqueseencuentraubicadosenlacarpeta/tmp/delsistemadearchivos

40

C.Bench_start.sh Tiene como finalidad ejecutar el script benchmark.sh para distintos valores de la variable THREADS, as como la gestin del script clean_caches.sh y la eliminacin de los archivos pertenecientesaanterioresejecuciones. Estescriptofrecelaposibilidaddeindicarleelnumerodethreadsdeseadosparacadaejecucin, ascomoordenarleonolalimpiezadecachesentrecadaunadelasejecuciones,obienefectuar unapruebapordefecto,conlosvaloresdethreadsigualesa1,5y10respectivamentesinrealizar vaciadoenlascachs. Asiportantounaejecucindeltipo./bench_start.sh4cleancache78,provocarqueejecutemos un ./benchmark.sh 4, luego un ./clean_caches.sh, posteriormente ./benchmark.sh 7 y finalmente ./benchmark.sh 8. Justo despus de la ejecucin de ./benchmark, realizar automticamenteunallamadaalaaplicacinJMeterReportconelfindealmacenarlosresultados deesaiteracinconcreta. Sinosedeseaaadirargumentosalahoradelaejecucin,lafuncintomar losvaloresquele hemos asignado por defecto, es decir, ejecutar ./benchmark.sh 1, luego ./benchmark.sh 5 y finalmente./benchmark.sh10. FinalmenteejecutamoslaaplicacinJmeterReports.jarconelargumentocorrespondienteparala realizacindelreportedelosresultados(0).

41

4.2.6.RESUMEN

Elesquemafinaldelmontajerealizadoquedaracomoindicalafigura:

Imagen4.15:Estructuradelmontajefinal
ElclienteejecutarlaaplicacinBboxGenerator.jarparagenerarelarchivoconlosbboxesconlas caractersticasquedeseeencuantoaresolucin,tamao,zonadeseada,obienlastomardela basededatosdecartociudad. Posteriormente bastar con ejecutar el script bench_start.sh para que ste limpie las cachs, llamealscriptbenchmark.shparacadavalordelavariableThreadindicadoygenerelosarchivos desalida,tantoenformato.csvcomolasgrficasenformato.xls

42

4.3.CONCLUSIONES

Si analizamos las funcionalidades de las aplicaciones creadas y las caractersticas que buscbamosalcomienzodelapartado,podemosverquenoslosecumplentodasycadaunade ellas,sinoqueademssehanaadidootrasqueoriginalmentenoseencontrabanenelproyecto. Hemos conseguido una aplicacin que adems de generar bboxes vlidos para realizar las peticionesconuninterfazdefcilcomprensin,permitedelimitarunazonacualquieradelmundoy calcularapartirdeellalosbboxesvlidossiempreycuandolaresolucinsealosuficientemente grandecomoparapermitirlo.Porotroladosehaaadidotambinlaposibilidaddeobtenerlos bboxesapartirdeunabasededatosdata. EncuantoalaaplicacinJmeterReports.jarapartedeconseguirigualmentetodoslosobjetivos marcados en un principio, se ha implementado la posibilidad de promediar entre las distintas pruebasrepetidassinelmenorperjuicioparaelrendimientodelprograma. Laprincipalpreocupacinalahoradelarealizacindelasaplicacioneshaconsistidonosloen aportar una funcionalidad garantizada y robusta, necesaria en este proyecto, sino tambin un manejosencilloyunagranportabilidadaotrasmquinasparalafuturarealizacindepruebas similares.

43

ANLISIS DE RESULTADOS

5.0.INTRODUCCIN
Enprimerlugarcabeindicarquelossiguientesresultadospuedevariarentrminosabsolutosen funcindelamquinaenlaqueserealicen,lascondicionesdetrabajoenlasqueseencuentreo delaconexinainternetdelaquesedisponga,perodadoqueesteproyectotratadeestablecer una comparativa entre las distintas cachs, y todas han sido testadas bajo las mismas condiciones,podemosafirmarquelosresultadoscualitativossernextrapolablesacualquierotra situacin. LaspruebassehanrealizadoenunamquinaCompaqPresarioC700conunaconexinainternet vaADSLde2Mb,conunsistemaoperativoUbuntu8.04. Elservidorutilizado,comoyaseha indicadoconanterioridadserGeoServer[13],alojadocomoservidorlocal,mientrasquelosdatos sobrelosqueserealizarnlaspeticioneshansidoobtenidosdecartociudad[14]. Para que las pruebas tengan el mayor rigor posible, han de ser realizadas sobre un nmero suficientementegrandedepeticiones,conelfindeevitarlasdistorsionesquesepuedenproducir altomarunnmeroquenosearepresentativodelassituacionesycargasnormalesdetrabajo. Resulta adems igual de interesante saber como se va a comportar cada cach al variar el nmerodeusuariosquetratan deaccederaunos mismos recursos, paralocualpodemos ir aumentandoprogresivamenteelnmerodehilosgeneradoshastaunmximoquesehatomado en 20. Cabria esperar que el rendimiento del servidor vaya variando en funcin del nivel de saturacinalquevaaestarsometido,establecindoseunvalormximoestablesiseproduceen luncuellodebotella,esdecir,sielfactorlimitantedelacomunicacineslacapacidadde procesadodelservidor(comoesesperable).

44

5.1.RETARDOAADIDO
Antesdeprocederalanlisisdelasdiferentescachsquesevanaanalizar,esinteresanteveren que medida va a afectar el hecho de tener que pasar todas las peticiones por un sistema intermedioenlugardeenviarlasdirectamentealservidor.Paraelloutilizamosunservidorlocal WMS (GeoServer), al cual le enviamos peticiones de manera directa, para posteriormente envirselasatravsdecadaunadelasdiferentesimplementacionesdecach.Evidentemente paraesteestudionopuederepetirseningunateseladadoqueseraalmacenadaenlascaches diferenciaentrecadatecnologayunasituacindeenvodirectodepeticionesalservidor: ysedesvirtuaranlosresultados.Encadaunadelassiguientesgrficaspodemosobservarla

Imagen5.1:RetardoprovocadoporTileCache

Imagen5.2:ReduccinenlatasadeserviciodeteselasparaTileCache 45

Enlaimagen5.2puedeobservarsecomoelservidordeteselasofreceunatasaconstantede40 teselas por segundo independientemente del numero de usuarios que tenga, mientas que si tenemosqueenviarlaspeticionesatravsdeTileCache,estatasaefectivasesitaentrelos 3035teselasporsegundo

Imagen5.3:RetardoprovocadoporGeowebcache

Imagen5.4:ReduccinenlatasadeserviciodeteselasparaGeowebcache

46

EnelcasodeGeowebcachetalycomopuedeverseenlaimagen5.4,latasaefectivadeservicio deteselassevaasituarenunas18porsegundo,porloquesepierdemasdeun50%dela eficienciainicialdelservidor

Imagen5.5:RetardoprovocadoporWMSCWrapper

Imagen5.6:ReduccinenlatasadeserviciodeteselasparaWMSCWrapper
Eneste ltimocasolareduccinenlatasadeprovisindeteselasporpartedelservidorllega hastacasiun25%respectoalobtenidaenunescenariosincachesentreenclienteyelservidor WMS.

47

Vemosengeneralcomoelefectoqueprovocanlasdistintascachesqueinterponemosentreel servidoryelclienteralentizanelprocesodecomunicacinentreambosentreun50%enelcaso deGeowebcacheyun15%paraTileCache.Esteaumentoenlostiemposdeesperatendr que sercompensadoporelaumentoenlosrendimientosqueseobtendr cuandoseestudienlas ventajasdelalmacenamientodeteselasparacadaunadelascaches.

48

5.2.GANANCIA
Unavezcuantificadoelretardoqueaadeelhechodetenerquepasartodaslaspeticionesa travsdeunnuevosistemaintermedioentreelclienteyelservidor(lascaches)vamosaanalizar ahoraelahorrodetiempoquesuponeobtenerlasteselasapartirdelascachesenlugarde recibirlasdesdeelservidor.Paraelloutilizamoslamismaconfiguracindelapruebaanteriorpero rellenandopreviamentelascachescontodaslasteselasquevanasersolicitadas.Deestemodoel clientenotendrqueenviarningunapeticinhastaelservidor. Enprimerlugarvemosladiferenciaexistenteentreunasituacinsincaches,yportantoteniendo que recibir las solicitudes desde el servidor, y los resultados obtenidos para cada una de las cachesqueestamostestando:

Imagen5.7:Tiempomedioderespuesta;comparativacachesservidorlocal

49

Imagen5.8:Tasadeprovisindeteselas;comparativacachesservidorlocal

Podemosverenlagrficaanteriorcomoseobtienenunastasasdeserviciomuysuperioresenel casodesolicitarlasteselasalascachesqueenelcasodetenerqueconseguirlasdesdeelservidor. Sicuantificamoslasgananciascomoelresultadodedividirlasdistintastasasdeprovisinde teselasdelascachesentrelatasadelasituacinsincaches,obtenemoselsiguientegrafico:

Imagen5.9:Tasadeprovisindeteselas;gananciasdelascachesrespectoaservidorlocal

50

Podemos ver como el rendimiento del sistema se multiplica por un factor entre 8 y 12 aproximadamente en funcin de la cache utilizada y del numero de usuarios simultneos. Se puedeobservartambinquelarespuestadelservidoressiemprelineal,independientementedel numerodeusuariosqueestnenviandosolicitudes,mientrasqueenelcasodelascacheseste parmetrosiquevaacondicionarligeramenteelrendimiento.

51

5.3.VELOCIDADDEALMACENAMIENTO
Inicialmentelascachesrespectivasdelasdiferentesimplementacionesvanaestarvac as,por

loqueesinteresanteconoceraquvelocidadpuedenprocesarlaspeticionesquevanatenerque serenviadasobligatoriamentealservidor.Paraelloprobamosenprimerlugararealizarpeticiones sobreteselastotalmentediferentesyconunrangovariablederesoluciones.

Imagen5.10:Tiempomedioderespuestaenalmacenamiento
threads 1 2 3 4 5 6 7 8 9 10 15 20 WMSCWrapper 755,51 782,49 630,55 500,01 1072,25 806,65 1286,7 1459,28 1963,95 2303,35 2140,15 2797,42 GeoWebCache 539,67 395,2 491,61 461,38 419,95 444,86 400,28 431,47 470,33 539,14 629,02 960,3 TileCache 1024,78 673,26 708,54 487,27 1335,74 750,6 1360,69 1313,69 1490,86 1793,65 3458,72 5341,05

SepuedeobservarqueelmejorcomportamientovaasersiempreparaGeowebcache,quese mantiene estable en el entorno de los 500 ms hasta que se superan los 10 usuarios simultneamente.Deelhechodequesemantengaestableeltiempoderespuestaaunquese vayanaadiendomsusuariossepuedededucirqueelfactorlimitanteenestecasonovaaestar enlacapacidaddelservidordeofrecerteselas,sinomsbienenlatasadesolicitudesquetenga

52

elcliente. EnelcasodeWMSCwrapperyTileCache,puedeobservarsecomoexisteunpuntodemnimo tiempodeesperaparacuatrousuariosyqueapartirdeestepunto stesedispara,porloque podemosdeducirqueelsistemaalcanzasumximorendimientoantesqueparaGeowebcache. Estosehacemsobviosianalizamoslosresultadosobtenidosparalastasasorendimientodelos tressistemas:

Imagen5.11:Tasamediadetransmisinenalmacenamiento
threads 1 2 3 4 5 6 7 8 9 10 15 20 WMSCWrapper 1,36 3,26 4,69 7,56 4,59 7,43 5,17 5,18 4,04 3,91 5,36 4,63 GeoWebCache 1,93 5,06 6,47 8,52 11,65 12,69 16,5 16,54 17,54 16,94 19,55 12,46 TileCache 1,08 3,24 4,25 7,88 4,09 8,04 4,81 4,84 4,17 4,37 2,73 2,07

EnestagrficapuedeversequeelmximorendimientoparaGeowebcachesesitaencasi20 teselas por segundo para 15 usuarios, mientras el mximo tanto para TileCache como para WMSCwrapperest entre7y8teselasporsegundoparaunmximode4usuarios,apartirde estepuntoambascachsparecenestarsaturadas.

53

Tambinesinteresanteanalizarelespacioenmemoriaqueocupacadaunadelascachspara almacenarlasteselas.LaimplementacinmenoseficienteesclaramenteTileCache,queocupa 3,07Kbdememoriaporcadateselaalmacenada,seguidoporGeowebcachecon0.745Kbpor teselayfinalmenteWMSCwrapperquetansloocupa0.714Kb/tesela.Estosedebeclaramentea la forma de estructurar las memorias y al nmero de archivos que genera cada una, ya que TileCachealmacenalasteselasconunampliosistemadecarpetasqueconsumenunabuena cantidaddememoria,mientrasquelasotrasdosgeneranmuchosmenos. ConcretamenteTileCachegenera1.64elementosporcadateselamientrasqueGeowebCache genera 1.1 y WMSCwrapper slo uno (datos tomados para un total de 100.000 teselas almacenadasencadacach).

54

5.3.VELOCIDADDEACCESO

Quiz elfactormsimportanteeslavelocidadquepuedealcanzarcadaunadelasdiferentes implementacionesalahoradeservirteselasyacacheadasenmemoria.Paraellocacheamosen primerlugar100.000teselasyposteriormenteefectuamoslaspruebasparadistintonmerode usuariossinvaciarlasmemorias.Losresultadossonlossiguientes:

Imagen5.3:Tiempomedioderespuestaenserviciodesdecachs

threads 1 2 3 4 5 6 7 8 9 10 15 20

WMSCWrapper 1,03 1,61 2,5 3,88 5,31 6,67 8,46 12,37 13,61 17,59 27,85 28,98

GeoWebCache 1,47 2,02 3,09 4,68 6,44 7,8 11,15 13,56 16,35 16,69 27,59 31,53

TileCache 1,82 2,51 4 5,48 7,2 8,82 14,41 15,84 23,96 27,92 44,17 55,87

55

Comoeradeesperarenunprincipio,eltiempoquetardacadapeticinensercontestadaporel servidoraumentacuantosmsusuariosintentanaccederdemanerasimultanea,loquedaidea dequeelsistemaest trabajandoamximorendimientodesdeelmismomomentoenelque tenemosunslousuario.LosresultadosindicanqueWMSCwrappereslaimplementacinque tieneunamayorvelocidaddeacceso,seguidoporGeowebcacheconunaaumentodel9,63%en eltiempoderespuestadecadatesela.TileCacheobtienelospeoresresultadosconun63.24%de incrementoensustiemposmedios. Encuantoalatasaorendimiento,comoesobvioelmejorcomportamientorespondeexactamente alosmismospatronesquelagrficaanterior:

Imagen5.13:Tasamediaderespuestasenserviciodesdecachs

threads 1 2 3 4 5 6 7 8 9 10 15 20

WMSCWrapper 642,65 849,24 867,27 783,53 720,2 695,73 631,43 547,57 535,01 476,78 468,25 513,81

GeoWebCache 494,93 709,38 721,36 669,84 615,63 610,29 521,52 493,3 470,45 485,74 443,45 475,88

TileCache 381,95 605,49 599,33 595,72 576,3 570,73 439,09 424,92 353,12 330,35 313,43 317,78

56

Enestaltimagrficaquedaclaroqueelrendimientodelasdistintasimplementacionessiguelas mismas normas, yaque sepuede observar que las tres siguen un patrn casi idntico en la situacindesuspuntosmximosymnimos,porloquepodemosafirmarquetodastienenun mximorendimientoparauntrficogeneradoporentre2o3usuarios,alcanzandoenelcasode WMSCwrappertasasdehasta867teselasporsegundo,mientrasqueGeowebcacheyTileCache llegana721y605respectivamente.

57

5.5.PETICIONESMIXTAS
Paradarideadelrendimientoensituacionesreales,esimportantesabercmosecomportacada unadelascachesantedistintosescenariosyporcentajesdeteselascacheadas.Enprimerlugar vamosaprobarcmosecomportanenunasituacinenlacualel75%delaspeticionessehagan alascachesinternas,mientrasquesetenganqueobtenerdelservidorexternoun25%.

Imagen5.14:Tiempomedioderespuesta75%cacheado

threads 1 2 3 4 5 6 7 8 9 10 15 20

WMSCWrapper 232,8 376,7 503,95 565,38 620,75 664,3 1048,26 1340,65 1520,26 1872,18 2278,2 3084,32

GeoWebCache 125,88 221 321,57 435,24 334,42 384,7 474,43 486,9 413,4 425,06 450,7 537,55

TileCache 176,14 321,62 479,39 712,08 658,73 936,16 889,25 1196,77 1400,67 1819,35 2756,59 5109,99

58

EnestecasovemosqueGeowebcacheesel nicoquemsomenosmantieneunostiempos constantesderespuestaapesardeiraumentandolosusuarios,mientrasquetantoTileCache como WMSCwrapper se saturan y provocan un tiempo de respuesta siempre creciente. Si analizamoslastasasdecadaunodeellos:

Imagen5.15:Tasamediadeservicio75%cacheado
threads 1 2 3 4 5 6 7 8 9 10 15 20 WMSCWrapper 4,61 5,43 5,78 7,26 8,09 8,9 6,84 6,65 5,13 4,67 4,86 4,97 GeoWebCache 8,61 9,5 9,48 9,16 15,71 15,79 14,85 16,22 22,18 22,72 30,93 36,58 TileCache 5,85 6,12 6,25 5,32 6,39 5,6 7,09 6,54 5,7 4,75 4,53 3,28

VemosqueGeowebcachepuedecontinuaraumentandosutasadedevolucindepeticionespara manteneraproximadamenteconstanteeltiempoderespuestadecadatesela,mientrasquetanto TileCachecomoWMSCwrappersesaturandesdeelprincipioyportantonosoncapacesdeir aumentandosurendimientoalaparqueaumentaelnumerodeusuarios.

59

Analizamosahoraunasituacinanlogaperoconun50%derespuestascacheadas.Elresultado paralostiemposderespuestaporteselaserelsiguiente:

Imagen5.16:Tiempomedioderespuesta50%cacheado

threads 1 2 3 4 5 6 7 8 9 10 15 20

WMSCWrapper 270,76 543,22 631,63 629,56 865,97 677,5 976,16 1205,54 1594,38 1643,5 2314,75 2575,58

GeoWebCache 169,68 384,67 352,21 440,51 451,92 518,38 584,2 566,18 518,27 533,13 466,15 549,07

TileCache 294,33 484,13 731,26 589,15 724,77 790,79 1038,52 1196,41 1456,24 1601,77 2545,24 3861,3

60

Imagen5.17:Tasamediadeservicio50%cacheado

threads 1 2 3 4 5 6 7 8 9 10 15 20

WMSCWrapper 3,98 3,84 4,88 6,72 6,22 8,65 7,49 6,34 5,28 4,77 4,3 5,31

GeoWebCache 5,87 5,23 8,53 9,05 10,72 11,09 12,01 13,54 16,45 16,94 28,42 30,31

TileCache 3,49 4,21 5,12 6,93 7,66 7,53 7,07 6,98 5,9 4,28 5,32 3,77

Puedeobservarsetambinunpatrnidntico,salvoquealtenermenosrespuestascacheadas, todaslastasassevenunreducidasenun27,%33%y18%respectivamenteparaWMSCwrapper Geowebcache y TileCache. Este porcentaje est en consonancia con el 25% de respuesta cacheadasquehemosreducido. Por ltimo, hacemos la misma prueba pero limitando en este caso el nmero de respuestas cacheadasal25%.Aprioricabriaesperaruncomportamientomuysimilarperoconunaumento en los tiempos de respuesta y una disminucin en las tasas efectivas proporcionales a la disminucindeotro25%enlacantidadderespuestasquevanasercacheadas.Losresultados paralostiemposderespuestason:

61

Imagen5.18:Tiempomedioderespuesta25%cacheado
threads 1 2 3 4 5 6 7 8 9 10 15 20 WMSCWrapper 795,23 880,05 1110,81 1099,19 984,45 1012,98 1163,16 1405,53 1034,4 1843,25 3384,6 3003,64 GeoWebCache 433,27 548,76 507,7 623,04 597,65 595,29 696,27 672,96 787,56 584,61 616,98 697,86 TileCache 704,67 1126,81 1113,81 1502,91 1305,33 1183,96 1276,72 1426,55 1649,18 1143,55 2006,12 3631,99

Yenelcasodelastasas:

Imagen5.19:Tasamediadeservicio25%cacheado 62

threads 1 2 3 4 5 6 7 8 9 10 15 20

WMSCWrapper 1,39 2,45 2,76 3,22 5,27 5,37 6,11 5,16 8,65 3,6 4,34 5,67

GeoWebCache 2,74 3,84 6,18 6,61 8,24 9,87 9,95 11,49 10,48 11,11 20,68 23,55

TileCache 1,49 1,68 2,5 2,11 3,49 4,6 4,29 4,83 4,36 5,14 4,98 3,3

Si calculamos de nuevo la variacin respecto al caso anterior, vemos que en este caso la reduccindelastasassesitaen20,3%,25,8%y37,4%respectivamenteparaWMSCwrapper, GeowebcacheyTileCache.Estoconfirmanuestraideainicialenlaestabilidaddelcomportamiento delasdistintascachs. Como puede observarse en el desarrollo de las pruebas mixtas, el comportamiento de Geowebcachesemantieneestabledentrodentrodelrangodeusuariosalquelohemossometido, mientras que TileCache y WMSCwrapper se saturan con un nmero relativamente bajo de usuariosysemantienenenesastasas. ParaconocereltechodelatasadedevolucindeteselasparaGeowebcacherealizamosuna pruebaextraaadiendounrangomuchomsamplioaunquemenosdetalladodeusuarios,para unasituacindeobtencindeteselassincachear:

63

Imagen5.20:TiempomedioderespuestaGeowebcache

Imagen5.21:TasamediadeservicioGeowebcache
Puede observarse que se mantiene en tiempos de espera ms o menos estables hasta un mximode20usuariossimultneos,llegandoenesemomentoalasaturacindelsistema. Puede decirse por tanto que Geowebcache tiene una capacidad de admisin de teselas simultneasmuysuperioraloquehandemostradotantoTileCachecomoWMSCwrapper.

64

5.6.METATILING
Comoyaseexplic enapartadosanteriores,elmetatilingconsistebsicamenteenlasolicitud automticadeteselasalrededordelazonaindicadaporelcliente.Deestemodoselograpre cachearreasdeterrenoqueesprobablequeelclienteconsulteconposterioridad,ahorrandopor tantolarealizacindemspeticionesqueacarrearanunretardomayor. Porcadapeticinquerealicemos,nuestroclientesolicitar conjuntamenteunnmerodeteselas mayor,porloquecabeesperarquelostiemposdeesperahastarecibirrespuestadelservidor aumentenconsiderablemente.Porotrolado,tambinseraconvenientequeesteaumentoenel tiempodeesperaporcadateselasolicitada,sevieracompensadoporelhechodelogrartener cacheadaunreaimportanterodeandoadichazona. Ennuestrocasovamosaestudiarunmetatilingde1x1,3x3y5x5,estoes,queporcadatesela quedeseemossolicitaralservidor,enrealidadrealizaremosunaconsultaaunazonade1,9025 teselascentradaenladeseada.Esteestudiohasidollevadoacaboenotramquinadistinta,por lo que los resultados absolutos no tienen por qu coincidir con otros tomados anteriormente, aunque dado que el objetivo es realizar un benchmark comparativo no tiene porqu afectar. Adems,elestudioserealizaparaunnicousuariosimultaneoysobreunazonadelimitada,por lo que al aumentar el numero de teselas solicitadas en cada peticin, cabe esperar que los retardosdisminuyancomoconsecuenciadelainclusindemasteselasenlascaches:

Imagen5.22:Comparativadeltiempomedioderespuestaenfuncindelreademetatiling

65

Imagen5.23:Comparativadelatasadeprovisindeteselasenfuncindelreademetatiling
Comosepuedeverenlasimgenes5.22y5.23,amedidaqueaumentamoselnmerodeteselas solicitadasconcadapeticin,latasaefectivafinalaumentademaneraconsiderabledebidoaque cadavezunmayorporcentajedeteselassernobtenidasdelascachs. Sicomparamoslosresultadosdecadaunadelasdistintascachesentres,podemosobservar cmoWMSCwrapperproporcionaunmenortiempodeesperayportantounatasadetransmisin efectiva deteselas superior para unmetatilingde 5x5, mientras que para unvalor de3x3 se encuentraempatadoconTileCache.EsteaumentodelrendimientodeWMSCwrapperrespectoa suscompetidoresalaumentareltamaodelazonacacheadaencadasolicitudsedebealdistinto tratamientoquecadaunadelastecnologashacedelmetatiling,dadoqueWMSCwrappertratade adaptarelcontornodelaszonassolicitadasdemodoquenoselepidaalservidorningunatesela queyahayasidocacheada,mientrasqueTileCacheyGeowebcachespuedenrepetirsolicitudes.

66

5.7.USODERECURSOS
EsimportantetenertambinencuentaelniveldeutilizacindelosrecursosdelaCPUquevana consumircadaunadelasdiferentescaches.Paraellovamosarealizarunamedici nutilizando la herramienta Jmeter, configurada para calcular los parmetros de utilizacin de aplicaciones web.Estoseconsigueaadiendoalaconfiguracinexplicadaenelapartado4.2.1otrogrupode hilosconlossiguientescomponentes: GestordeAutorizacionesHTTP:sernecesariointroduciruserypassworddeltomcat. UnbloquedepeticinHTTPconlossiguientesdatos:

NombredeServidoroIP:localhost Puerto:8888 Path:/manager/status Ser tambinnecesariomandarunparmetroconlapeticinconNombreXMLyelvalor true.

Temporizadorconstante,paranoentorpecerlaactuacindelaaplicacin,obteniendodatos slocada5000ms. UnbloquedeResultadosdelMonitorparavisualizarlosresultados.

Imagen5.24:ConfiguracindeJmeterparalamedicindelusoderecursos
Deestemodopodemosobtenerlosdatosreferentesalasdosimplementacionesquetrabajan sobreelgestordecontenedoresApacheTomcat,esdecir,GeowebcacheyWMSCwrapper. Obviamentecompararemosresultadosobtenidosparaambascachsenlasmismascondiciones detrabajodelamquina,ordenndolasenbasealnmerodeusuariosencadaprueba.

67

Lalinearojarepresentaelporcentajedehilosocupadosrespectoalmximopermitido,lalinea azul representa el porcentaje de la carga computacional, la linea amarilla el porcentaje de memoriautilizadarespectoaltotal,ylalineaverdedaunaideadelasaludgeneraldelsistema paralapruebaconcreta. NoseincluyenresultadosparaTileCachedadoqueelsistemademedicindeberadeserotro completamentedistintoanoestargestionadoporelcontenedordepaquetestomcatdelamisma maneraqueGeowebcacheyWMSCwrapper,porloquelosresultadosnopodransercomparados con los obtenidos de este modo. Adems en todos los apartados anteriores, TileCache ha demostradoserlaimplementacinmenosefectivaentodasycadaunadelassituaciones,porlo quesuutilizacinnovaaserenningncasolamsindicada. Comenzamoslapruebaconunsolousuario:

Imagen5.25:Comparativadelconsumoderecursosparaunusuario
Losresultadossonprcticamentelosmismosenamboscasos,haciendounusodelamemoriay unacargacomputacionalanloga.Elindicadordelasaluddelaaplicacinenamboscasoesdel 100% para esta prueba. Probamos a continuacin para un nmero de usuarios de cinco simultneos:

68

Imagen5.26:Comparativadelconsumoderecursospara5usuarios
Vemos que de momento los resultados se siguen manteniendo muy parejos en ambas situaciones,porloqueaestasalturasdelapruebalasdoscachssiguenfuncionandoalmismo ritmoysinaparentesproblemasdesobrecarga.Aumentamosahoraelnumerodeusuarioshasta los15:

Imagen5.27:Comparativadelconsumoderecursospara15usuarios 69

Sepuedeobservarahoracomoesevidenteelaumentoenelporcentajedehilosqueestnsiendo utilizadosrespectoalmximopermitido,peronosenotaunaumentoconsiderablenienlacarga computacionalqueestsoportandoelsistemanienlautilizacindelamemoriatotal,quesibien sehanvistosutilmenteincrementadasrespectoaloscasosanteriores,estealzanollegaaafectar alasaludtotaldelaaplicacin,quesemantieneentodomomentoaltopedesusposibilidades, exactamentedelmismomodoqueparaunnumeromenordeusuarios. Aumentamosahoraelnmerodeusuarioshastasituarloen35.Dondesepodraesperarquela saluddelsistemacomenzasearesentirse.

Imagen5.28:Comparativadelconsumoderecursospara35usuarios

Lacargatotalqueimplicaelaumentodeusuariossuperaahoraenalgunosmomentosel50%del total,yelusodelamemoriaseacercaenalgunospuntosal100%,perotodavanopuededecirse que la salud de las aplicaciones se encuentre comprometida. En cuanto a la diferencia entre ambascaches,sibienpuedenobservarseunascargasyunosusosdememorialigeramente importante. inferiores en WMSCwrapper que en Geowebcache, esta diferencia no es sustancialmente

70

Aumentamoselnmerodeusuarioshasta50simultneos,porloqueahorasi,vemoscomoel sistema empieza a resentirse y se alcanzan puntos en los cuales la salud del sistema se ve comprometida y desciende hasta un 6570%. Estos efectos generales sobre los distintos parmetrosqueestamosmidiendosoncompartidosporlasdoscachs,perosonmsacusados paraGeowebcachequeparaWMSCwrapper,quesibienalcanzatambincotasigualmentebajas enelniveldesalud,stastienenunaduracinmenor.

Imagen5.29:Comparativadelconsumoderecursospara50usuarios

Porltimorealizamoslaspruebaspara75usuariossimultneos:

71

Imagen5.30:Comparativadelconsumoderecursospara75usuarios
Enestasdosltimaspruebaspodemosobservarcomounexcesodeusuariossimultneossatura elsistemaimpidiendoquelaaplicacincorrespondienterespondalaspeticionesquerecibe.De los distintos resultados podemos concluir que para un numero relativamente bajo de usuarios (hasta3035)elsistemamantienesusparmetromsomenosconstantesyparejosparaambas, mientrasquesisuperamosesteumbralGeowebcachedegradasusprestacionesaunmayorritmo queWMSCwrapper,llegandoinclusoenasufrirunacadaenelusoefectivodememoriayenla cargacomputacionaldebidoadichasaturacinalalcanzarlos75usuarios.

72

5.8.RESUMEN
Deloscompletostestsquehemosrealizadosobrecadaunadelastrescachessometidasaestudio podemosllegaravariasconclusionesgeneralesquesesubdividenendoscampos.Porunlado tenemos los resultados referentes a la capacidad y velocidad de los sistemas, y por otro los relativosalascargasyusosdememoria. Cindonosalostiemposdeesperaylastasasdeprovisindeteselasquetienencadaunade las tres implementaciones, podemos concluir que Geowebcache posee unos resultados muy superioresasusdoscompetidoresalahoradepedirteselasyalmacenarlasenlamemorialocal, muyporencimadelosresultadosdeWMSCwrapperyTileCache,queeslaqueofreceunos tiempos de espera mayores. En cuanto al servicio de teselas ya cacheadas TileCache sigue manteniendo el peor resultado, mientras que WMSCwrapper es la que obtiene unas mayores tasasderespuestasporsegundo. Comoconsecuenciadeestoscomportamientos,sianalizamossituacionesmixtasenlascuales tengamosunporcentajedeteselascacheadasyotrodeteselasporcachear,losresultadosde Geowebcache yWMSCwrapper irn convergiendo cuanto mayor sea el ratio entre las teselas cacheadasylasteselassincachear.Debidoaladiferenciaqueexisteentreeltiempodeespera porcadateselasincachearyporcadateselacacheada(entre500y1000vecessuperiorenel casodetenerquerealizarlapeticinalservidor),bastar queunpequeoporcentajedeteselas tenganquesersolicitadasalservidorparaquelosresultadosdeGeowebcacheseanmejoresque los de WMSCwrapper. Por su parte TileCache obtiene en todos los estudios los peores comportamientos en relacin con sus competidores, tanto a la hora de almacenar las teselas comoalahoradeservirlas. Tambinsehaanalizadoelefectodelmetatilingencadaunadelasimplementaciones,llegndose a la conclusin de que tanto en el caso de WMSCwrapper como en el de Geowebcache o TileCacheseproduceunretardoporpeticinsimilarparaunazonademetatilingde1x1.Enel caso de extenderla a 3x3 WMSCwrapper y TileCache obtienen mejores resultados que Geowebcache, mientras que si aumentamos mas este parmetro, siempre se va a ver cmo WMSCwrapperobtieneunosresultadoscadavezmsdistantesdesuscompetidoresdebidoal sistemaadaptativodepeticindeteselasenfuncindelasyasolicitadas.

73

Encuantoalestudiodelosrecursoqueconsumecadacach,noshemosceidosolamentea WMSCwrapperyGeowebcache,quesonlasimplementacionesquefuncionandeunmodosimilar sobreelcontenedor de aplicacionesApacheTomcat. Engenerallos resultados obtenidos son realmenteparejosparaunonmerodeusuariosrelativamentebajo(menosde3035usuarios), manteniendo una salud general del sistema ptima y unos usos de memoria y de carga computacionalquesevanincrementandoamedidaqueaumentamoselnmerodeclientes.A partirdeesteumbralenelnmerodeusuarios,lasaluddelsistemasevadeteriorandoconmayor velocidadenelcasodeGeowebcachequeeneldeWMSCwrapper,peroenambascachesse notaunasaturacinimportanteporencimadelos6075usuariossimultneos,llegandoincluso paraGeowebcacheaproducirsecadasimportantesenelusodememoriayenelporcentajede carga.

74

CONCLUSIONES Y LNEAS FUTURAS

6.1.CONCLUSIONES
AlolargodeesteproyectosehailustradoelfuncionamientodelosservidoresdemapasWMS,su utilizacinypropiedades,ascomounadescripcindelatecnologaWMSCyenparticulardelos distintossistemasdecacheadodeteselasqueseimplementan.Sehaestablecidounmtodopara la comparacin de tres de las opciones disponibles en el mercado y se han construido las aplicaciones necesarias para su correcto desarrollo, as como las interconexiones necesarias. Tambin se han descrito las distintas herramientas que se utilizan en las mediciones y las configuracionesquerequierenparasucorrectofuncionamiento. Encuantoalosobjetivosfijadosalprincipiodelproyectopuededecirsequesehancumplidotodos ycadaunodeellos,yaquesehaconseguidoconstruirunslidomecanismodepruebasparalas distintascaches,portable(alestarconstruidoenJAVA),robusto,modularydeunmanejo rpido y sencillo, y que adems puede ser adaptado para posteriores pruebas en entornos similaressinunexcesivotrabajo. Enloreferentealaspruebasens,losresultadossonclarosy,sibiennoeranpredeciblesapriori, ssonlosuficientementeslidosyconsistentescomoparasertomadoscomocorrectos. Personalmente,lavaloracinquehagodeltrabajorealizadoalolargodeldesarrollodelproyecto es francamente positiva, ya que se ha conseguido alcanzar los objetivos que se marcaron al comienzo del proyecto de una forma totalmente satisfactoria, permitindome ahondar en conocimientos ya esbozados durante algunas asignaturas de la carrera, como pueda ser la programacinenJAVA,oelmanejodeaplicacionesWeb,perotambininiciarmeenelmundode lossistemasgeogrficosylastecnologasdelossistemasdemapas,campodegranaugeenla actualidaddebidoamultituddesoportesmuypopularesymuyutilizadoshoyenda.Adems considero que hemos realizado un trabajo que ha abarcado diferentes cuestiones (teora, investigacin,software,etc.)quemepermitentenerahoraunavisingeneralsobrecmotrabajan ycomosedesarrollanherramientasorientadasalagestindemapas.

75

6.2.LNEASFUTURAS
Elanlisisllevadoacaboenesteproyectosehabasadoenunassecuenciasdepeticionesde teselasaleatoriasdentrodeunasdeterminadascondicionesfijadas(resolucin,rea,capa...),pero nocindosealcomportamientoquesueleseguirunusuario.Existenestudiosqueestablecen patrones de comportamiento en las peticiones efectuadas por el cliente, y que arrojaran resultadosmascoherentesaunusorealdeestosservicios.Ennuestrocasosehanestablecido los rendimientos estadsticos basndonos en dos posibles circunstancias, que la tesela se encuentrecacheadaenlamemoriaoquestatengaquesersolicitadaalservidor,peroenningn casoseharelacionadolapeticindeunateselaconlasiguiente,demodoqueendefinitivaslo tenemosunaideageneraldecomosecomportanlasdistintasaplicaciones. Resultarainteresanteestablecerplanesdepeticionesenbaseaconsultasrealesparaconocer ademselverdaderoalcancedelmetatiling.Enesteproyectosehaestudiadosolamenteelefecto delmetatilingenelretrasoquesufrecadapeticinrespectoaunasituacinanlogaperosinesta opcinactivada,porloqueseranecesariorealizarunestudiosobrelasmejorasenelrendimiento generaldelaaplicacinque vaapercibir elusuariofinal delserviciocomoconsecuenciadel sobrecacheadodeteselas.Delmismomodoserainteresanteconocerculessonlostiemposde latenciadelasteselasenlascachesqueoptimizanelgastoderecursosfrentealaposibilidadde demandarzonasyaalmacenadas. Porotroladotambinpuederesultarinteresantecombinarlasdistintastecnologasquehemos probadoconotrosservidoresdemapasosimplementeconfigurarlasparaquenoalmacenenlas teselas de forma local, sino que se establezca un punto a partir del cual se distribuyan las peticionesyaalmacenadasalosclientessinnecesidaddeconsumirlosrecursoslocales.

76

6.3.AGRADECIMIENTOS
Paraacabar,megustaraagradeceratodalagentequemehaapoyadodurantelarealizacinde esteproyecto.DadoqueestatareaseenmarcadentrodelostrabajosdeldepartamentoITNT ITASTdelauniversidaddeValladolid,nohabrasidoposiblesurealizacinsinlacolaboracinde susintegrantes,especialmentedeRicardo,porsutiempo,saberhacerysobretodosupaciencia. TambinagradeceraCeciliasucontribucinartsticaysuapoyoabsolutoenlosbuenos,malosy regulares momentos a lo largo de todo este tiempo, as como a mi familia por la tremenda pacienciaentantosaosdeestudiomsalldelosxitosylosfracasos,yporsupuestoatodos losamigosqueenestosaosmehanhechosentirencasafuerademicasa.

77

BIBLIOGRAFA

[1]www.abcdatos.com(ltimaconsulta10/10/09) [2]http://es.wikipedia.org/wiki/Sistema_de_Informaci%C3%B3n_Geogr%C3%A1fica(ltima consulta18/11/09) [3]http://www.opengeospatial.org/standards/wms#schemas(ltimaconsulta07/10/09) [4]en.wikipedia.org/wiki/Web_Map_Service(ltimaconsulta10/12/09) [5]OGCImplementationSpecification(http://portal.opengeospatial.org)(ltimaconsulta21/10/09) [6]http://wiki.osgeo.org/wiki/TilingStandard(ltimaconsulta10/10/09) [7]http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification(ltimaconsulta21/12/09) [8]http://wiki.osgeo.org/wiki/WMS_Tiling_Client_Recommendation(ltimaconsulta21/10/09) [9]http://wiki.osgeo.org/wiki/WMS_Tile_Caching(ltimaconsulta21/10/09) [10]http://tilecache.org/(ltimaconsulta03/10/09) [11]http://geowebcache.org(ltimaconsulta03/10/09) [12]wmscwrapperdocumentationhttp://localhost:8888/WMS_C_wrapper/(ltimaconsulta 03/01/10) [13]geoserver.org/(ltimaconsulta19/11/09) [14]www.cartociudad.es(ltimaconsulta01/12/09) [15]http://presentations.opengeo.org/2008_FOSS4G/WebMapServerPerformance FOSS4G2008.pdf(ltimaconsulta10/12/09) [16]poi.apache.org/(ltimaconsulta1/11/09)

APNDICE I

INSTALACIN DE LAS CACHS

1.INSTALACINDECOMPONENTES
Paraelensamblajedelosdistintoselementosquevanasernecesariosenelcorrectodesarrollo delproyecto,esnecesarioseguirunasciertasinstruccionesproporcionadasporlosdistribuidores de las distintas herramientas e instalarlas en el orden apropiado, ya que algunas de ellas necesitandeotrasparasucorrectaimplantaciny/oconfiguracin,Porlotantoaqu seexponen enelordenyconelmtodoconelcualfueroninstaladas.Todoslostrabajosypruebasefectuados en este proyecto fueron realizados en una mquina Compaq C700 bajo un sistema operativo Ubuntu8.0.4hardyhaeron.

1.1.REQUISITOSPREVIOS

Dadalanaturalezadelproyectoquesevaadesarrollar,esnecesariolainstalacinyconfiguracin de ciertos elementosque se encuentran fcilmente en muchas mquinas sin los cuales sera imposible llegar a los resultados deseados. En este primer apartado de requisitos previos se enumeranlosdistintoscomponentesnecesariosparasoportarelrestodelaestructuraquese crear. Dado que en muchos casos son bastante comunes y no requieren un esfuerzo ni de configuracin, ni de instalacin, se har un breve comentario sin entrar a detallarlos en profundidad. 1.1.1.JAVA

Dado que tanto la aplicacin que vamos a crear como muchas otras ya existentes est programadasenJava,sehacenecesariolainstalacintantodelJavadevelopmentkitcomodel Javaruntimeenviroment. Java development kit(jdk): es un software que provee herramientas de desarrollo para la creacindeprogramasenjava.Ennuestrocasoseinstalar apartirdelosrepositoriosoficiales deUbuntuymedianteelusodelgestordepaquetesSynaptic Javaruntimeenviroment:permitelaejecucindeprogramasenJava.Seinstalardelamisma formaqueelanterior,apartirdelosrepositoriosoficialesdisponiblesparaUbuntuyhaciendouso delgestordepaquetespordefectoSynaptic.

1.1.2.APACHEWEBSERVER

EsteservidorwebHTTPdecdigoabiertoescritoenC,ydiseadoparacasicualquierplataforma (Unix,Windows,Macintosh...),estdesarrolladoporlaApacheSoftwareFoundation,siendoenla actualidadelmasutilizadoenelmundodebidoprincipalmenteasugrancapacidaddeadaptarsea mltiplesentornosdebidoaqueesfcilmenteconfigurable,sibiencarecedeinterfazgrficaque faciliteesteproceso. Ennuestroproyectosehacenecesarialapresenciadeunservidorwebdadoquelaspruebasde losdistintosmodelosdecachserealizanmediantepeticionesHTTPdirigidasalservidoratravs decadaunadelastecnologas,porloqueesindispensableunservidordeestetipoquelas gestione. Ennuestrocasoseinstal laversinApache2directamentedesdelosrepositoriosoficialesde UbuntuymedianteelusodelgestordepaquetesSynaptic,porloqueladescarga,instalaciny configuracinserealizarondeformacasiautomtica. 1.1.3.APACHETOMCAT

ApacheTomcatfuncionacomouncontenedordeservlets(programasejecutadosenunservidor)y deJavaServerPages(desarrolladasporSunMicrosistems).Aunquepuedefuncionardeforma autnomacomoservidorwebporsimismo,seconsideraqueseoptimizansusprestacionessise combinaconotroservidormaspotente,comoennuestrocasoApache. Estaherramientaest desarrolladabajoelproyectoJakartaenlaApacheSoftwareFoundation, estandoescritaenJava,loquepermitesufuncionamientoencualquiermquinaquecontengala maquinavirtualJava. Ennuestrocasosehainstaladolaversin6.0,cuyocdigofuenteseencuentradisponibleensu pginaweboficial(http://tomcat.apache.org).

Acontinuacinsedetallaelmtododeinstalacin:

Noslogeamoscomoroot: su passwd:

Copiamoselarchivodescargadoa/usr/local/

#cp /media/Datos/Software/Sistemas\ Linux/Servidores\ Web/Apache\ Tomcat/ apache- tomcat-6.0.18.tar.gz /usr/local/ Descomprimimosydesempaquetamos:

#tar -zxvf apache-tomcat-6.0.18.tar.gz Entramosanuestrodirectoriohogarennuestrocaso/home/pablo/

#cd /home/pablo

Ahora,vamosaconfigurarlasvariablesdeentornoJAVA_HOMEyCATALINA_HOME

Probamos:

#ls /usr/lib/jvm/ Sinossale:java6sunjava6sun1.6.0.06 EntonceslavariabledeentornoJAVA_HOMEdebeapuntarausr/lib/jvm/java6sun. Nota:Losnmerosvaransegnlaversin,sinonossaleesto,debemosbuscarlarutaendonde seinstalojava Ahora agregamos la variables de entorno a nuestro archivo .bashrc, las siguientes lineas se agreganalfinaldearchivo:

#vim .bashrc

Agregamosalfinal:

export JAVA_HOME=/usr/lib/jvm/java-6-sun export CATALINA_HOME=/usr/local/apache-tomcat-6.0.18 Salimosyguardamoscambios. AhoralevantamosnuestroservidorApacheTomcat

#/usr/local/apache-tomcat-6.0.18/bin/startup.sh

Nosmuestranlossiguientesmensajes:

Using CATALINA_BASE: /usr/local/apache-tomcat-6.0.18 Using CATALINA_HOME: /usr/local/apache-tomcat-6.0.18 Using CATALINA_TMPDIR: /usr/local/apache-tomcat-6.0.18/temp Using JRE_HOME: /usr/lib/jvm/java-6-sun Probamosenunnavegadorweb:

http://localhost:8080/ SinosaparecelapginadeApacheTomcat,todoestacorrecto,ahoratendremossoportepara cdigodejspyservletsdejava. Sideseamospararnuestroservidorweb:

#/usr/local/apache-tomcat-6.0.18/bin/shutdown.sh Eldirectoriodepublicacines:

#cd /usr/local/apache-tomcat-6.0.18/webapps/ROOT/ ElarchivodeconfiguracindeApacheTomcates:

#vim /usr/local//apache-tomcat-6.0.18/conf/server.xml

Podemoseliminarelficherodescargadoalterminarlainstalacin:

#rm -r /usr/local/apache-tomcat-6.0.18.tar.gz

1.2.COMPONENTESESPECFICOS

Enesteapartadoseincluirndescripcionesmasdetalladasdelasherramientasutilizadasalo largodelproyecto,as comounaguadecmohansidoinstaladasyconfiguradasennuestra mquina. 1.2..1.ECLIPSE LaplataformaEclipsepermitequelasaplicacionesseandesarrolladasapartirdeunconjuntode componentesdeSoftwarellamadosmdulos.UnmduloesunarchivoJavaquecontieneclases dejavaescritasparainteractuarconlasAPIsdeEclipseyunarchivoespecial(manifestfile)quelo identificacomomdulo.Lasaplicacionesconstruidasapartirdemdulospuedenserextendidas agregndole nuevos mdulos. Debido a que los mdulos pueden ser desarrollados independientemente,lasaplicacionesbasadasenlaplataformaEclipsepuedenserextendidas fcilmenteporotrosdesarrolladoresdesoftware,lograndoas queaplicacionescomolanuestra, ideadaparaunfinmuyconcreto,puedaserextendidaparasuusoenotrosentornossimilaresal quenosocupa. Eclipse es tambin una comunidad de usuarios, extendiendo constantemente las reas de aplicacincubiertas. EclipsefuedesarrolladooriginalmenteporIBMcomoelsucesordesufamiliadeherramientas para VisualAgel. Eclipse es ahora desarrollado por la Fundacin Eclipse, una organizacin independientesinnimodelucroquefomentaunacomunidaddecdigoabiertoyunconjuntode productoscomplementarios,capacidadesyservicios. Encuantoalainstalacinennuestramquinaresultaextremadamentesencilla,yaquenoes necesariomasquebajarseelinstaladordelaversindeseadadirectamentedesdesupginaweb http://eclipse.org(ennuestrocasoinstalamoslaversin3.5,laltimadisponiblehastalafechade

realizacindelproyecto),ejecutarelarchivodelinstaladoryseguir los pasos indicadosporel mismoparasuconfiguracin. Dado que tambin sern necesarios otros componentes que interactan con Eclipse, ser necesarioinstalarungestor deproyectos,ennuestrocasonoshemosdecantadosporutilizar Maven. MavenutilizaunProjectObjectModel(POM)paradescribirelproyectodesoftwareaconstruir, susdependenciasdeotrosmdulosycomponentesexternos,yelordendeconstruccindelos elementos.Vieneconobjetivospredefinidospararealizarciertastareasclaramenteespecificadas comolacompilacindelcdigoysuempaquetado. UnacaractersticaclavedeMavenesqueest listoparausarenred.Elmotorincluidoensu ncleopuededinmicamentedescargarpluginsdeunrepositorio,elmismorepositorioqueprovee accesoamuchasversionesdediferentesproyectosOpenSourceenJava,deApacheyotras organizacionesydesarrolladores.Esterepositorioysusucesorreorganizado,elrepositorioMaven ,pugnanporserelmecanismodefactodedistribucindeaplicacionesenJava,perosuadopcin hasidomuylenta.Mavenproveesoportenosloparaobtenerarchivosdesurepositorio,sino tambinparasubirartefactosalrepositorioalfinaldelaconstruccindelaaplicacin,dejndolaal accesodetodoslosusuarios.Unacach localdeartefactosactacomolaprimerafuentepara sincronizarlasalidadelosproyectosaunsistemalocal. Maven est construido usando una arquitectura basada en plugins que permite que utilice cualquieraplicacincontrolableatravsdelaentradaestndar. Enteora,estopodrapermitiracualquieraescribirpluginsparasuinterfazconherramientascomo compiladores, herramientas de pruebas unitarias, etctera, para cualquier otro lenguaje. En realidad,elsoporteyusodelenguajesdistintosdeJavaesmnimo.Actualmenteexisteunplugin para.NetFrameworkyesmantenido,[1]yunpluginnativoparaC/C++fuealgunavezmantenido porMaven. Adems seutilizar tambin un sistema de control de versiones, en nuestrocaso Subversion (SVN) para poder actualizar los distintos repositorios creados a medida que vayan siendo modificados.

ParalainstalacintantodeMavencomodeSVNbastaconabrirelEclipse,iraHelpInstallNew SoftwareAdd.Yespecificarladireccindecadaunodelosrecursoquesedeseansolicitar (http://subclipse.tigris.org/update_1.6.x para SVN y http://m2eclipse.codehaus.org/ para Maven). En el siguiente paso se seleccionan los paquetes que van a ser descargados e instalados y finalmentesereiniciaEclipse. 1.2.2.JMETER

JMeter esunaherramientadecargaparallevaracabosimulacionessobrecualquierrecursode Software. Inicialmente diseada para pruebas de estrs en aplicaciones web, hoy en da, su arquitecturahaevolucionadonosloparallevaracabopruebasencomponenteshabilitadosen Internet (HTTP), sino adems en Bases de datos, programas en Perl, requisiciones FTP y prcticamentecualquierotromedio. Adems, posee la capacidad de realizar desde una solicitud sencilla hasta secuencias de peticiones que permiten diagnosticar el comportamiento de una aplicacin en condiciones de produccin. Enestesentido,simulatodaslasfuncionalidadesdeunNavegador,odecualquierotrocliente, siendocapazdemanipularresultadosendeterminadapeticinyreutilizarlosparaserempleados enunanuevasecuencia. Ennuestrocasoutilizaremosestaaplicacinparasimulareltrficoquegeneraunvisordemapas haciaelservidorenlaspeticionesdeinformacinyparainterpretarlasrespuestasqueproduzca este, ya sean en forma de imgenes (resultado deseado) o en forma de mensajes de error debidosacualquiercausa. La instalacin nuevamente resulta extremadamente sencilla, ya que basta con descargar el programadesdesupginaweboficial(ennuestrocasolaversinelegidaesla2.3.4,lamas reciente hasta el momento de la realizacin del proyecto) http://jakarta.apache.org/JMeter , descomprimirelficheroyejecutarelarchivoJMetersituadoenlacarpetabin.

1.2..3.GEOSERVER

GeoServeresunsoftwaredecdigoabiertoescritoenjavaquepermitealosusuarioscompartiry editardatosgeoespaciales.Diseadoparaserinteroperable,publicadatosdecualquierfuentede datosespacialesqueutiliceestndaresabiertos. Setratadeunproyectodirigidodemaneracomunitaria,yestadesarrolladotestadoymantenido por diversos grupos y organizaciones de todo el mundo. Geoserver es la implementacin de referenciadelosestndaresWFS(WebFeatureService)yWCS(WebCoverageService)del OpenGeospatialConsortium(OGC),ascomodelsistemaWMSutilizadoenesteproyecto Paralainstalacinbastacondescargarselaltimaversindisponibledesdelapginaweboficial paranuestradistribucinUbuntu(http://geoserver.org/display/GEOS/Stable),descomprimirenla ubicacindeseadayarrancarlomedianteelejecutablestartup.shsituadodentrodelacarpetabin. Ennuestrocasoesteservidorhasido desplegadoenenlacarpetalocal dadoquenohade funcionarcomoservidordemapasfueradeestembito. Para comprobar la correcta instalacin y activacin bastar con acceder a travs de http://localhost:8080/geoserver.

1.2.4.TILECACHE Parasuinstalacindebemosdescargarlosarchivosbinariosdesdelapaginawebdelproyecto (www.tilecache.org) y descomprimirlos, aunque en ocasiones si se desea una instalacin mas rpidaycompleta,esposibleusarelPythonPackageIndex(pypioCheeseshop).Deestemodo slotendremosqueescribir:typeeasy_installTileCache. Unavezhechoesto,bastar coninstalarelarchivodeconfiguracindeTileCache.Pararealizar estaaccinbastaraconhacerusodelaherramientallamadaTileCache_install_config.pyquese habrinstaladopordefecto.Demodoquelainstalacinquedarcomosigue:

$ sudo easy_install TileCache ... Installed

/usr/lib/python2.5/site-packages/TileCache-2.10-py2.5.egg $ sudo tilecache_install_config.py Successfully copied file /usr/lib/python2.5/site-packages/TileCache-2.10py2.5.egg/TileCache/tilecache.cfg to /etc/tilecache.cfg.

TileCacheesttambindisponiblecomounpaqueteDebiandirectamentedesdeelhomepagedel proyecto.Almomentodelarealizacindelproyecto,existenpaquetesparadistribucinFeistyo Gutsy. Unavezrealizadalainstalacin,bastarconcargarlascapasquevanaserutilizadasaloslargo delproyecto,incluyndolasenelarchivoTilecache.cfg,indicandolaurldeprocedencia,elnombre delacapa,eltipoyelformatodelarchivodesalida.Enelsiguienteejemplosecargaunacapa contenidaenelservidorlocalgeoserver. [topp:hidrografia] type=WMS url=http://localhost:8080/geoserver/wms extension=png Ennuestrocaso,lasteselascacheadassernalmacenadasenlacarpeta/tmp/tilecache,porlo queser estacarpetalaqueesnecesariovaciarparalimpiarlacachealahoraderealizarlas pruebas. Tilecacheimplementapordefectoopcionesdemetatiling,loqueimplicaqueanteunapeticinde unateselaconcreta,tilecacheefectuaraunapeticindeAxBteselasalrededordeladeseadacon elobjetivodedinamizarlasbsquedasparaelusuariofinalcargandolasteselascontiguasala consultada. Esta opcin falseara los resultados obtenidos dado que en nuestro protocolo de pruebas no es necesario que las teselas demandadas al servidor sean contiguas, por lo que aumentara de manera innecesaria el trfico y por tanto la eficiencia. Para desactivar esta funcionalidad bastaconeditarelarchivodeconfiguracinTilecache.cfgyestablecer laopcin metatilea1x1

1.2.5.GEOWEBCACHE

Geoserveryaincluyeunaversin deGeowebCache, peroennuestrocasohemosoptadopor instalarotrademaneraindependientealservidor. Paralainstalacinbastar condescargarnoselarchivo.wardesarrolladoparacontenedoresde aplicaciones,ennuestrocasotomcat.Acontinuacininiciamoselapachetomcat,seleccionamos la pestaa Tomcat Manager y tras introducir loggin y password accedemos al gestor de las aplicaciones. Tomcat tiene una funcionalidad que permite desplegar de manera muy simple archivos.war,proporcionndolesolamentelaubicacindelarchivo. Unavezdesplegadoelarchivoslorestaconfigurarloparaobtenerlosresultadosquebuscamos paranuestroproyecto.Ser necesariocargarlacapasobrelaquevamosatrabajareditandoel archivogeowebcache.xmlintroduciendounacapamas:

</wmsLayer> <wmsLayer> <name>cartociudad</name> <wmsUrl> <string>http://www.cartociudad.es/wms/CARTOCIUDAD/CARTOCIUDAD</string > </wmsUrl> <wmsLayers>DivisionTerritorial</wmsLayers> </wmsLayer> Aligualquesucedi contilecache,ser necesariodeshabilitarlaopcindemetatiling.Eneste caso el archivo que es necesario editar es geowebcacheservlet.xml, modificando la opcin metatilinga1x1.

Enestepuntoyapodemosprobarsihemosinstaladoyconfiguradocorrectamentelaaplicacin accediendoatravsdelmnagerdetomcat,accediendoalaopcinDinamicallygeneratedlistof layersyseleccionandolacapacartociudad.

10

1.2.6.WMSCWRAPPER

Al igual que Geowebcache esta construido en java, por lo que para su instalacin slo ser necesario descargarse los archivos correspondientes y desplegarlos en un contenedor de aplicacionesjava,ennuestrocasoTomcat.Dadoquepordefectoyaest configuradalacapade cartociudadnosernecesarioaadirlacomoenloscasosanteriores. Podemoscomprobarsihemosrealizadocorrectamentelainstalacinaccediendoalaaplicacina travsdeltomcatmanageryprobandolasdistintasfuncionalidadesdisponibles.

1.2.7.RESUMEN

La idea global del montaje final del proyecto quedara como indica la imagen, con las tres tecnologas obteniendo las teselas de un mismo servidor en paralelo y con la aplicacin que generaremosrealizandolaspeticioneshttp:

11

APNDICE II

MANUAL DE USO DE LA APLICACIN

1.INSTALACIN
Parasuinstalacinencualquiermquina,esprecisocontarcontodosloscomponentesquese detallan en el Apndice I configurados de forma correcta. Una vez en este punto podemos proceder a colocar las distintas aplicaciones y archivos que vamos a necesitar de manera adecuada. Dada la flexibilidad de todos los componentes, stos pueden ser colocados casi en cualquier ubicacindentrodeldiscoduro,pudindoseestablecerlasconexionesentretodosellosmediante susrespectivosmodosdeconfiguracin.Detodosmodosaqu sevaadetallarcomohansido dispuestosennuestrocaso. El ejecutable Bboxgenerator.jar puede colocarse indistintamente en cualquier ubicacin dadoqueensuinterfazpuedeindicarselelarutaexactadondecrearelarchivo.csvconlos distintosBboxes.

El ejecutable JMeterReports.jar ha sido colocado directamente dentro de la carpeta principaldeinstalacin. Enesamismacarpetaseincluyenlostresscripts.Dentrodeestosscripts,sernecesario especificar las rutas tanto a JmeterReports.jar como a las distintas ubicaciones de las distintascachesquevanaserutilizadas.Ennuestrocasoydadalainstalaci n y configuracindeellasquesehizoenelApndiceIestascorrespondena/tmp/tiilecache para tilecache, /tmp/cache para WMSCwrapper y /usr/local/apache tomcat/temp/geowebcacheenelcasodeGeowebcache. Enelscriptbenchmark.shtambinhabrqueindicarlarutahastaelejecutabledeJmetery hastaelarchivoquehemosgenerado(apartado4.2.1)pararealizarlaspeticiones.Tambin seindicar enestearchivolasdireccionesatravsdelascualesaccedemosacadauna de las tres implementaciones (en nuestro caso /tilecache/tilecache.py /geowebcache/service/wms /WMS_C_wrapper/wms para TileCache, GeowebCache y WMSCwrapperrespectivamente). Enelscriptbench_start.shtambinsehadeindicarlarutahastaJMeterReports.jaras como la ruta hasta los archivos .csv generados en cada prueba, con el fin de poder eliminarlosantesderealizarotra.

Finalmente, ser necesario indicar en el archivo config.properties dentro del archivador JMeterReports.jarladireccindondesealmacenanlosdistintosarchivos.csvconlosdatos decadapruebaydondesedeseacolocarlosarchivosdesalida.

Demaneraadicional,sisedeseahacerusodelaopcinqueimplementaBboxGenerator.jarpara obtenerlosdistintosBboxesapartirdeunabasededatos,habrqueindicarletambindndese encuentralabasededatosyelusuarioypasswordparapoderaccederaella.

2.UTILIZACIN
Elusoesbastantesencillo,ysepuederesumiren3pasos,aunquesugranflexibilidadlepermite adaptarseaotrasformasdeactuacin: 1. Ser necesarioarrancartantoelservidorapacheyelapachetomcatcomoelservidorde mapasgeoserver. En nuestro caso esta tarea se puede efectuar en tres simples ordenes en linea de comandos:

$sudo/etc/init.d/apache2startparaarrancarelservidorapache2 $sudo/usr/local/apachetomcat6.0.20/bin/startup.shparaeltomcat $sudo/usr/local/geoserver1.7.5/bin/startup.shparageoserver 2. EjecutamosBboxGenerator.jaryelegimoslasopcionesquesedesean,pudiendovisualizar la zona sobre la que queremos trabajar con la opcin BUILD. Una vez elegidos los parmetros, seleccionamos un nombre y una ubicacin para el archivo resultante y pulsamoselbotndeOK.Comoyasedijoconanterioridad,sisedeseautilizarlaopcin BBDDparaobtenerlosdatosdirectamentedesdelabasededatosdecartociudad,ser imprescindiblehaberconfiguradoanteriormenteelaccesoalamisma,medianteelarchivo config.propertiesqueseadjuntaconBboxGeneratos.jarenlaseccinresources.

3. UnavezgeneradoelarchivoconlosdatosdelosBboxesquevamosapediralservidor,ya slorestaejecutarelscriptBench_start.shconlasopcionesquesedeseen.Caberecordar en este punto que es preciso tener bien configurado las distintas rutas dentro de los archivosdeconfiguracinparaevitarerroresnodeseados.Ladosopcionesconfiguradas ennuestrocasohansidolaopcindeindicarleelnmerodethreadsencadaiteracinyla posibilidad en el momento que se desee de vaciar las caches mediante el comando cleancache. Una vez realizados estos tres pasos, tendremos un archivo results.xls con una visualizacin grficadelosresultadosyotroarchivostore.xlscontodoslosresultadosobtenidosencadauna delasiteraciones.Laubicacindeestosarchivosdepender deloquelehayamosindicadoa cadaunodelosarchivosdeconfiguracin.

3.EJEMPLO
Comocomplementoalaexplicacinanterior,vamosaconcretarlospasosquehemosdadoyel modoenquetenemosconfiguradosnuestroarchivosenunejemplo.

Enprimerlugarestossonlosdistintoparmetrosquehemoscolocadoenlosdistintosarchivosde configuracin:

BboxGenerator.jar:ensuarchivoconfig.propertiestenemoslosiguiente:
#user user=postgres #password password=navarrete #connectstring connectstring=jdbc:postgresql:test #driver driver=org.postgresql.Driver #BBDDName bbddname=cartociudad

#outfilepath outfilepath=/home/pablo/proyecto/resultados/bboxes/

JmeterReports.jar:essuarchivconfig.propertiestenemoslosiguiente:
#template template = /template.xls #outfilename outfilename = /home/pablo/proyecto/resultados/results.xls #path csv files csvpath = /home/pablo/proyecto/resultados/files/

#store file path storepath = /home/pablo/proyecto/resultados/files/store.xls

Enelscriptbenchmark.shtenemoslosiguienteeneliniciodelarchivo: JMETER="/home/pablo/proyecto/jakartajmeter2.3.4/bin/jmeter.sh" JTL2CSV="/home/pablo/proyecto/resultados/files/jtl2csv.py" JMX_FILE="/home/pablo/proyecto/resultados/files/NonGUITest.jmx" PATH_TILECACHE="/tilecache/tilecache.py" PATH_GEOWEBCACHE="/geowebcache/service/wms" PATH_WMSCWRAPPER="/WMS_C_wrapper/wms" CACHE_TILECACHE="/tmp/tilecache/" CACHE_GEOWEBCACHE="/usr/local/apache

tomcat6.0.20/temp/geowebcache/cartociudad" CACHE_WMSCWRAPPER="/tmp/cache/cartociudad/" CSV_FILE="/home/pablo/proyecto/resultados/bboxes/bboxes.csv" YenelscriptBench_start.sh,bastarconescribir: JMeterReportspath=/home/pablo/proyecto/resultados/app/JMeterReports.jar Unavezquetenemosestoconfigurado,abrimosunterminalyejecutamosBboxGenerator.jar: $javajar/home/pablo/proyecto/resultados/app/BboxGenerator.jar SeleccionamoslasopcionesqueindicalaimagenypulsamosBUILD

ImagenA2.1:interfargrficadelgeneradordeBBoxes
Elareadelapeticin,dibujadoenunmapaserelsiguiente:

ImagenA2.2:Representacinvisualdelazonadetrabajo

AcontinuacincerramoselmapapulsandoOKypulsamosdenuevoOKenlaventanadelas opciones.Sitodoescorrectonossaldrelsiguientemensaje:

ImagenA2.3:Mensajedeinformacin
ConestosdatoshabremoscreadounarchivocondiezBboxesdeunaresolucinentre5y10cada una,conelnombrebboxes.csvubicadoenlacarpeta/home/pablo/proyecto/resultados/bboxes/,en elcualcadabboxtieneun100%derepetirseunavez,loqueimplicaqueel50%delaspeticiones estarcacheadasalahoradeseremitidas. Ahoraejecutamosenunterminallasiguienteorden: $/home/pablo/proyecto/resultados/bench_start.shcleancache1cleancache23

Estaordenejecutaelscriptbench_start.shconlasopcionescleancache,1,cleancache,2y3,o lo que es lo mismo, limpia las caches, ejecuta benchmark.sh para thread=1, luego vacia las caches de nuevo, ejecuta benchmark.sh para thread=2 y finalmente ejecuta de nuevo benchmark.shparathread=3. Losresultadosalfinaldelaejecucin,visualizadosenelmismoterminalsernlossiguientes:
pablo@laptop:~/proyecto/resultados$/home/pablo/proyecto/resultados/bench_start.shcleancache1cleancache 23

++++++++++++++++++++++ Deletingcsvfiles... ++++++++++++++++++++++

\n\n***RemovingTileCache'scache...*** willremove64tilesinthecache Cacheentriesfound:64 Removed64files. \n\n***RemovingGeoWebCache'scache...*** willremove0tilesinthecache \n\n***RemovingWMSCWrapper'scache...*** willremove0tilesinthecache numberofcommandlineargumentare1

++++++++++++++++++++++ 1usersrunningsimultaneously. ++++++++++++++++++++++

********************************* *BenchmarkingTileCache* *********************************

:>0tilesinthecachebeforeexecution Createdthetreesuccessfullyusing/home/pablo/proyecto/resultados/files/NonGUITest.jmx Startingthetest@ThuNov2612:23:58CET2009(1259234638015) Waitingforpossibleshutdownmessageonport4445 ResultsSummary+5in1,8s=2,8/sAvg:346Min:4Max:670Err:0(0,00%) ResultsSummary+5in1,1s=4,7/sAvg:209Min:2Max:552Err:0(0,00%) ResultsSummary=10in2,8s=3,5/sAvg:277Min:2Max:670Err:0(0,00%) Tidyingup...@ThuNov2612:24:01CET2009(1259234641170) ...endofrun :>5tilesinthecacheafterexecution

********************************* *BenchmarkingGeoWebCache* *********************************

:>0tilesinthecachebeforeexecution Createdthetreesuccessfullyusing/home/pablo/proyecto/resultados/files/NonGUITest.jmx Startingthetest@ThuNov2612:24:02CET2009(1259234642565) Waitingforpossibleshutdownmessageonport4445 ResultsSummary+1in0,6s=1,7/sAvg:590Min:590Max:590Err:0(0,00%) ResultsSummary+9in2,0s=4,4/sAvg:222Min:2Max:610Err:0(0,00%) ResultsSummary=10in2,6s=3,8/sAvg:258Min:2Max:610Err:0(0,00%)

Tidyingup...@ThuNov2612:24:05CET2009(1259234645511) ...endofrun :>5tilesinthecacheafterexecution

********************************* *BenchmarkingWMS_C_Wrapper* *********************************

:>0tilesinthecachebeforeexecution Createdthetreesuccessfullyusing/home/pablo/proyecto/resultados/files/NonGUITest.jmx Startingthetest@ThuNov2612:24:06CET2009(1259234646950) Waitingforpossibleshutdownmessageonport4445 ResultsSummary=10in1,4s=7,0/sAvg:136Min:2Max:383Err:0(0,00%) Tidyingup...@ThuNov2612:24:08CET2009(1259234648709) ...endofrun :>5tilesinthecacheafterexecution \n\n***RemovingTileCache'scache...*** willremove5tilesinthecache Cacheentriesfound:5 Removed5files. \n\n***RemovingGeoWebCache'scache...*** willremove5tilesinthecache \n\n***RemovingWMSCWrapper'scache...*** willremove5tilesinthecache numberofcommandlineargumentare1

++++++++++++++++++++++ 2usersrunningsimultaneously. ++++++++++++++++++++++

********************************* *BenchmarkingTileCache* *********************************

:>0tilesinthecachebeforeexecution Createdthetreesuccessfullyusing/home/pablo/proyecto/resultados/files/NonGUITest.jmx Startingthetest@ThuNov2612:24:11CET2009(1259234651076) Waitingforpossibleshutdownmessageonport4445 ResultsSummary=10in3,8s=2,7/sAvg:616Min:2Max:3764Err:0(0,00%) Tidyingup...@ThuNov2612:24:15CET2009(1259234655158)

...endofrun :>5tilesinthecacheafterexecution

********************************* *BenchmarkingGeoWebCache* *********************************

:>0tilesinthecachebeforeexecution Createdthetreesuccessfullyusing/home/pablo/proyecto/resultados/files/NonGUITest.jmx Startingthetest@ThuNov2612:24:16CET2009(1259234656609) Waitingforpossibleshutdownmessageonport4445 ResultsSummary=10in1,2s=8,1/sAvg:239Min:172Max:383Err:0(0,00%) Tidyingup...@ThuNov2612:24:18CET2009(1259234658154) ...endofrun :>5tilesinthecacheafterexecution

********************************* *BenchmarkingWMS_C_Wrapper* *********************************

:>0tilesinthecachebeforeexecution Createdthetreesuccessfullyusing/home/pablo/proyecto/resultados/files/NonGUITest.jmx Startingthetest@ThuNov2612:24:19CET2009(1259234659544) Waitingforpossibleshutdownmessageonport4445 ResultsSummary=10in1,6s=6,3/sAvg:300Min:3Max:513Err:0(0,00%) Tidyingup...@ThuNov2612:24:21CET2009(1259234661491) ...endofrun :>5tilesinthecacheafterexecution numberofcommandlineargumentare1

++++++++++++++++++++++ 3usersrunningsimultaneously. ++++++++++++++++++++++

********************************* *BenchmarkingTileCache* *********************************

10

:>5tilesinthecachebeforeexecution Createdthetreesuccessfullyusing/home/pablo/proyecto/resultados/files/NonGUITest.jmx Startingthetest@ThuNov2612:24:23CET2009(1259234663847) Waitingforpossibleshutdownmessageonport4445 ResultsSummary=10in0,1s=94,3/sAvg:23Min:2Max:73Err:0(0,00%) Tidyingup...@ThuNov2612:24:24CET2009(1259234664258) ...endofrun :>5tilesinthecacheafterexecution

********************************* *BenchmarkingGeoWebCache* *********************************

:>5tilesinthecachebeforeexecution Createdthetreesuccessfullyusing/home/pablo/proyecto/resultados/files/NonGUITest.jmx Startingthetest@ThuNov2612:24:25CET2009(1259234665660) Waitingforpossibleshutdownmessageonport4445 ResultsSummary=10in0,1s=114,9/sAvg:18Min:3Max:46Err:0(0,00%) Tidyingup...@ThuNov2612:24:26CET2009(1259234666060) ...endofrun :>5tilesinthecacheafterexecution

********************************* *BenchmarkingWMS_C_Wrapper* ********************************* :>5tilesinthecachebeforeexecution Createdthetreesuccessfullyusing/home/pablo/proyecto/resultados/files/NonGUITest.jmx Startingthetest@ThuNov2612:24:27CET2009(1259234667522) Waitingforpossibleshutdownmessageonport4445 ResultsSummary=10in0,1s=120,5/sAvg:14Min:2Max:35Err:0(0,00%) Tidyingup...@ThuNov2612:24:27CET2009(1259234667920) ...endofrun :>5tilesinthecacheafterexecution

Finalmentesenosmostrarunatablaconelresumendetodolosdatoscomolaquesigue:

11

_______________________________________________________________________________________________
|ResultsSummary| _______________________________________________________________________________________________ ||AVG_TIME|AVG_RATE| _______________________________________________________________________________________________ |Threads|WMSCWrapper|GeoWebCache|TileCache|WMSCWrapper|GeoWebCache| TileCache| _______________________________________________________________________________________________ |1.0|136.8|258.7|277.6|7.027406886858749|3.79794910748196|3.5161744022503516| |2.0|300.8|239.8|616.3|6.333122229259025|8.123476848090982|2.656748140276302| |3.0|13.8|18.2|23.0|120.48192771084338|114.94252873563218|94.33962264150944| _______________________________________________________________________________________________

En la ubicacin indicada, en nuestro caso /home/pablo/proyecto/resultados/, se encuentra el archivo results.xls, y en la carpeta /home/pablo/proyecto/resultados/files/ encontramos store.xls contodoslosdatosdecadaiteracin(enestecasoesosdatossoncoincidentesdadoqueno hemosrealizadoningunaejecucinconunnumerodehilosrepetida). Siahorasedeseaseotraejecucinconelmismoarchivobboxes.csvcomofuentedeBboxes, habraquetenerencuentaquelosdatosdelaanteriorpruebavanasereliminadosysustituidos porlosdelasiguiente.

12

ANEXOS

1.BBOXGENERATOR 1.1.Client.java
package org.uva.wmsc.benchmarking; public class Client { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub TileScheme ts = new TileScheme(); GraphInterface gi = new GraphInterface(ts); gi.setVisible(true); } }

1.2.Bbox.java
package org.uva.wmsc.benchmarking; public class BBox { private double crsMinX; private double crsMinY; private double crsMaxX; private double crsMaxY; public BBox(double crsMinX, double crsMinY, double crsMaxX, double crsMaxY) { this.crsMinX = crsMinX; this.crsMinY = crsMinY; this.crsMaxX = crsMaxX; this.crsMaxY = crsMaxY; } public double getCrsMinX() { return crsMinX; }

public void setCrsMinX(double crsMinX) { this.crsMinX = crsMinX; }

public double getCrsMinY() { return crsMinY; } public void setCrsMinY(double crsMinY) { this.crsMinY = crsMinY; } public double getCrsMaxX() { return crsMaxX; } public void setCrsMaxX(double crsMaxX) { this.crsMaxX = crsMaxX; } public double getCrsMaxY() { return crsMaxY; } public void setCrsMaxY(double crsMaxY) { this.crsMaxY = crsMaxY; } }

1.3.TileScheme.java
package org.uva.wmsc.benchmarking; public class TileScheme { // Maximal extent private static TileScheme ts; private double tileMatrixMaxX; private double tileMatrixMinX; private double tileMatrixMaxY; private double tileMatrixMinY; private double tileMatrixMaxXr; private double tileMatrixMinXr; private double tileMatrixMaxYr; private double tileMatrixMinYr; private int numberofbbox; private int prob1; private int prob2; private int prob3; private int prob4; private int minresolution; private int maxresolution; private int counter;

private String csvfilename; private String numberofbboxstr; private int width = 256; // tile width private int height = 256; // tile height double resmat[] = { 0.70312500000000000000, 0.35156250000000000000, 0.17578125000000000000, 0.08789062500000000000, 0.04394531250000000000, 0.02197265625000000000, 0.01098632812500000000, 0.00549316406250000000, 0.00274658203125000000, 0.00137329101562500000, 0.00068664550781250000, 0.00034332275390625000, 0.00017166137695312500, 0.00008583068847656250, 0.00004291534423828120, 0.00002145767211914060, 0.00001072883605957030, 0.00000536441802978516, 0.00000268220901489258, 0.00000134110450744629 }; public void Test() { // // Test and correct bbox // TileScheme ts = TileScheme.getTs(); int resolution = ts.getMinresolution(); double maxX = ts.getTileMatrixMaxX(); double minX = ts.getTileMatrixMinX(); double maxY = ts.getTileMatrixMaxY(); double minY = ts.getTileMatrixMinY(); double maxXr; double minXr; double maxYr; double minYr; double tileSpanX = ts.resmat[resolution] * ts.getWidth(); double tileSpanY = ts.resmat[resolution] * ts.getHeight(); if (maxX >= 0) { int colmax = (int) (maxX / tileSpanX); maxX = colmax * tileSpanX; if (maxX > 180) { maxX = 180; } } else { maxX = -maxX; int colmax = -(int) ((maxX / tileSpanX) + 0.99999); maxX = colmax * tileSpanX; if (maxX < -180) { maxX = -180; } } if (maxY >= 0) { int rowmax = (int) (maxY / tileSpanY);

maxY = rowmax * tileSpanY; if (maxY > 90) { maxY = 90; } } else { maxY = -maxY; int rowmax = -(int) ((maxY / tileSpanY) + 0.99999); maxY = rowmax * tileSpanY; if (maxY < -90) { maxY = -90; } } if (minX >= 0) { int colmin = (int) ((minX / tileSpanX) + 0.99999); minX = colmin * tileSpanX; if (minX > 180) { minX = 180; } } else { minX = -minX; int colmin = -(int) ((minX / tileSpanX)); minX = colmin * tileSpanX; if (minX < -180) { minX = -180; } } if (minY >= 0) { int rowmin = (int) ((minY / tileSpanY) + 0.99999); minY = rowmin * tileSpanY; if (minY > 90) { minY = 90; } } else { minY = -minY; int rowmin = -(int) ((minY / tileSpanY)); minY = rowmin * tileSpanY; if (minY < -90) { minY = -90; } } if ((maxY >= 90 && minY <= -90 && resolution == 0)) { maxY = 90; minY = -90; } if ((maxX > minX && maxY > minY)) { maxXr = maxX;

maxYr = maxY; minXr = minX; minYr = minY; } else { maxXr = 180; maxYr = 90; minXr = -180; minYr = -90; GraphInterface.Warning(); } ts.setTileMatrixMaxXr(maxXr); ts.setTileMatrixMinXr(minXr); ts.setTileMatrixMaxYr(maxYr); ts.setTileMatrixMinYr(minYr); TileScheme.setTs(ts); } public double getTileMatrixMaxX() { return tileMatrixMaxX; } public void setTileMatrixMaxX(double TileMatrixMaxX) { tileMatrixMaxX = TileMatrixMaxX; } public double getTileMatrixMinX() { return tileMatrixMinX; } public void setTileMatrixMinX(double TileMatrixMinX) { tileMatrixMinX = TileMatrixMinX; } public double getTileMatrixMaxY() { return tileMatrixMaxY; } public void setTileMatrixMaxY(double TileMatrixMaxY) { tileMatrixMaxY = TileMatrixMaxY; } public double getTileMatrixMinY() { return tileMatrixMinY; } public void setTileMatrixMinY(double TileMatrixMinY) { tileMatrixMinY = TileMatrixMinY; }

public double getTileMatrixMaxXr() { return tileMatrixMaxXr; } public void setTileMatrixMaxXr(double TileMatrixMaxXr) { tileMatrixMaxXr = TileMatrixMaxXr; } public double getTileMatrixMinXr() { return tileMatrixMinXr; } public void setTileMatrixMinXr(double TileMatrixMinXr) { tileMatrixMinXr = TileMatrixMinXr; } public double getTileMatrixMaxYr() { return tileMatrixMaxYr; } public void setTileMatrixMaxYr(double TileMatrixMaxYr) { tileMatrixMaxYr = TileMatrixMaxYr; } public double getTileMatrixMinYr() { return tileMatrixMinYr; } public void setTileMatrixMinYr(double TileMatrixMinYr) { tileMatrixMinYr = TileMatrixMinYr; } public int getNumberofbbox() { return numberofbbox; } public void setNumberofbbox(int Numberofbbox) { numberofbbox = Numberofbbox; } public int getProb1() { return prob1; } public void setProb1(int Prob1) { prob1 = Prob1; } public int getProb2() {

return prob2; } public void setProb2(int Prob2) { prob2 = Prob2; } public int getProb3() { return prob3; } public void setProb3(int Prob3) { prob3 = Prob3; } public int getProb4() { return prob4; } public void setProb4(int Prob4) { prob4 = Prob4; } public int getMinresolution() { return minresolution; } public void setMinresolution(int Minresolution) { minresolution = Minresolution; } public int getMaxresolution() { return maxresolution; } public void setMaxresolution(int Maxresolution) { maxresolution = Maxresolution; } public int getCounter() { return counter; } public void setCounter(int Counter) { counter = Counter; } public String getCsvfilename() { return csvfilename; }

public void setCsvfilename(String Csvfilename) { csvfilename = Csvfilename; } public String getNumberofbboxstr() { return numberofbboxstr; } public void setNumberofbboxstr(String Numberofbboxstr) { numberofbboxstr = Numberofbboxstr; } public void setHeight(int Height) { height = Height; } public int getHeight() { return height; } public void setWidth(int Width) { width = Width; } public int getWidth() { return width; } public static void setTs(TileScheme ts) { TileScheme.ts = ts; } public static TileScheme getTs() { return ts; } }

1.4.Configuration.java
package org.uva.wmsc.benchmarking; import java.util.Properties; public class Configuration { private static final String CONFIGURATION_FILE = "/config.properties"; private static Properties properties;

private static String driver; private static String connectstring; private static String user; private static String password; private static String outfilepath; private static String bbddname; private static void init() { try { properties = new Properties(); properties.load(Configuration.class .getResourceAsStream(CONFIGURATION_FILE)); driver = properties.getProperty("driver"); connectstring = properties.getProperty("connectstring"); user = properties.getProperty("user"); password = properties.getProperty("password"); outfilepath = properties.getProperty("outfilepath"); bbddname = properties.getProperty("bbddname"); } catch (Exception e) { System.out.println(e.getMessage()); } } public static String getDriver() { if (driver == null) { init(); } return driver; } public static String getConnectString() { if (connectstring == null) { init(); } return connectstring; } public static String getUser() { if (user == null) { init(); } return user; } public static String getPassword() { if (password == null) { init(); }

return password; } public static String getOutFilePath() { if (outfilepath == null) { init(); } return outfilepath; } public static String getBbddName() { if (bbddname == null) { init(); } return bbddname; } }

1.5.GraphInterface.java
package org.uva.wmsc.benchmarking; import java.awt.Font; import java.io.IOException; import javax.swing.AbstractButton; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingConstants; public class GraphInterface extends javax.swing.JFrame { TileScheme ts = new TileScheme(); private static final long serialVersionUID = 1L; private static WMSCRandomBBoxGenerator wmscrandombboxgenerator = new WMSCRandomBBoxGenerator( TileScheme.getTs()); private static WMSCBBddBBoxGenerator wmscbbddbboxgenerator = new WMSCBBddBBoxGenerator( TileScheme.getTs()); public GraphInterface(TileScheme ts) { TileScheme.setTs(ts); initComponents(); } private void initComponents() {}

10

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { ts = TileScheme.getTs(); ts.setNumberofbboxstr(jTextField33.getText()); ts.setCsvfilename(jTextField16.getText()); ts.setMinresolution(Integer.parseInt(jTextField19.getText().trim())); ts.setMaxresolution(Integer.parseInt(jTextField28.getText().trim())); ts.setProb1(Integer.parseInt(jTextField29.getText().trim())); ts.setProb2(Integer.parseInt(jTextField30.getText().trim())); ts.setProb3(Integer.parseInt(jTextField31.getText().trim())); ts.setProb4(Integer.parseInt(jTextField32.getText().trim())); ts.setNumberofbbox(Integer.parseInt(jTextField33.getText().trim())); if (jTextField20.getText().equals("bbdd") == false) { ts.setTileMatrixMaxX(Double.valueOf(jTextField20.getText().trim()) .doubleValue()); ts.setTileMatrixMinX(Double.valueOf(jTextField21.getText().trim()) .doubleValue()); ts.setTileMatrixMaxY(Double.valueOf(jTextField22.getText().trim()) .doubleValue()); ts.setTileMatrixMinY(Double.valueOf(jTextField23.getText().trim()) .doubleValue()); ts.setNumberofbboxstr(jTextField33.getText()); TileScheme.setTs(ts); ts.Test(); try { wmscrandombboxgenerator.csvwrite(); } catch (IOException e) { e.printStackTrace(); } ConfirmWindow(); } else { TileScheme.setTs(ts); try { wmscbbddbboxgenerator.csvwrite(); } catch (IOException e) { e.printStackTrace(); } ConfirmWindow(); } }

11

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); } private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); } private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) { ts = TileScheme.getTs(); ts.setMinresolution(Integer.parseInt(jTextField19.getText().trim())); ts.setTileMatrixMaxX(Double.valueOf(jTextField20.getText().trim()) .doubleValue()); ts.setTileMatrixMinX(Double.valueOf(jTextField21.getText().trim()) .doubleValue()); ts.setTileMatrixMaxY(Double.valueOf(jTextField22.getText().trim()) .doubleValue()); ts.setTileMatrixMinY(Double.valueOf(jTextField23.getText().trim()) .doubleValue()); TileScheme.setTs(ts); ts.Test(); MapWindow(); jTextField24.setText(String.valueOf(TileScheme.getTs() .getTileMatrixMaxXr())); jTextField25.setText(String.valueOf(TileScheme.getTs() .getTileMatrixMinXr())); jTextField26.setText(String.valueOf(TileScheme.getTs() .getTileMatrixMaxYr())); jTextField27.setText(String.valueOf(TileScheme.getTs() .getTileMatrixMinYr())); } private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) { jTextField20.setText("bbdd"); jTextField21.setText("bbdd"); jTextField22.setText("bbdd"); jTextField23.setText("bbdd"); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new GraphInterface(TileScheme.getTs()).setVisible(true);

12

} }); } private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JButton jButton8; private javax.swing.JButton jButton9; private javax.swing.JMenu jMenu1; private javax.swing.JMenu jMenu2; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JMenuItem jMenuItem1; private javax.swing.JTextField jTextField16; private javax.swing.JTextField jTextField19; private javax.swing.JTextField jTextField20; private javax.swing.JTextField jTextField21; private javax.swing.JTextField jTextField22; private javax.swing.JTextField jTextField23; private javax.swing.JTextField jTextField24; private javax.swing.JTextField jTextField25; private javax.swing.JTextField jTextField26; private javax.swing.JTextField jTextField27; private javax.swing.JTextField jTextField28; private javax.swing.JTextField jTextField29; private javax.swing.JTextField jTextField30; private javax.swing.JTextField jTextField31; private javax.swing.JTextField jTextField32; private javax.swing.JTextField jTextField33; private java.awt.Label label20; private java.awt.Label label21; private java.awt.Label label22; private java.awt.Label label23; private java.awt.Label label24; private java.awt.Label label25; private java.awt.Label label26; private java.awt.Label label27; private java.awt.Label label28; private java.awt.PopupMenu popupMenu1; public static void Warning() { // // Error window (out of bounds) // final JFrame nuevoFrame = new JFrame(); nuevoFrame.setVisible(true); nuevoFrame.pack(); nuevoFrame.setBounds(300, 100, 400, 200);

13

JLabel textLabel10 = new JLabel("error impossible borders", SwingConstants.CENTER); textLabel10.setBounds(90, 50, 210, 29); textLabel10.setFont(new Font("error\n impossible borders", Font.PLAIN, 16)); nuevoFrame.getContentPane().add(textLabel10); JButton JButton12 = new JButton(); JButton12.setVerticalTextPosition(AbstractButton.BOTTOM); JButton12.setHorizontalTextPosition(AbstractButton.CENTER); nuevoFrame.setLayout(null); JButton12.setBounds(150, 120, 94, 29); JButton12.setText("OK"); JButton12.setName("OKbutton"); nuevoFrame.getContentPane().add(JButton12); JButton12.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { nuevoFrame.setVisible(false); } }); } public void MapWindow() { ts = TileScheme.getTs(); double MaxX = ts.getTileMatrixMaxX(); double MinX = ts.getTileMatrixMinX(); double MaxY = ts.getTileMatrixMaxY(); double MinY = ts.getTileMatrixMinY(); double MaxXr = ts.getTileMatrixMaxXr(); double MinXr = ts.getTileMatrixMinXr(); double MaxYr = ts.getTileMatrixMaxYr(); double MinYr = ts.getTileMatrixMinYr(); final JFrame newFrame = new JFrame(); newFrame.pack(); newFrame.setBounds(100, 100, 1110, 650); JButton JButtonok = new JButton();

14

JButtonok.setVerticalTextPosition(AbstractButton.BOTTOM); JButtonok.setHorizontalTextPosition(AbstractButton.CENTER); newFrame.setLayout(null); JButtonok.setBounds(500, 580, 100, 30); JButtonok.setText("OK"); JButtonok.setName("OKbutton"); newFrame.getContentPane().add(JButtonok); JLabel LabelMinX = new javax.swing.JLabel(); JLabel LabelMaxX = new javax.swing.JLabel(); JLabel LabelMinY = new javax.swing.JLabel(); JLabel LabelMaxY = new javax.swing.JLabel(); JLabel LabelMinXr = new javax.swing.JLabel(); JLabel LabelMaxXr = new javax.swing.JLabel(); JLabel LabelMinYr = new javax.swing.JLabel(); JLabel LabelMaxYr = new javax.swing.JLabel(); JLabel map0lab = new javax.swing.JLabel(); JLabel map1lab = new javax.swing.JLabel(); ImageIcon red = new ImageIcon(); ImageIcon black = new ImageIcon(); ImageIcon map0img = new ImageIcon(); ImageIcon map1img = new ImageIcon(); LabelMinX.setBounds((((int) MinX + 180) * 3) + 6, (int) (90 - MaxY) * 3 + 6, 4, (int) ((MaxY - MinY) * 3) + 8); LabelMaxX.setBounds((int) ((MaxX + 180) * 3) + 10, (int) (90 - MaxY) * 3 + 6, 4, (int) ((MaxY - MinY) * 3) + 8); LabelMaxY.setBounds((((int) MinX + 180) * 3) + 6, (int) (90 - MaxY) * 3 + 6, (int) ((MaxX - MinX) * 3) + 8, 4); LabelMinY.setBounds((((int) MinX + 180) * 3) + 6, ((90 - (int) MinY) * 3) + 10, (int) ((MaxX - MinX) * 3) + 8, 4); LabelMinXr.setBounds((((int) MinXr + 180) * 3) + 9, (int) (90 - MaxYr) * 3 + 9, 1, (int) ((MaxYr - MinYr) * 3) + 2); LabelMaxXr.setBounds((int) ((MaxXr + 180) * 3) + 10, (int) (90 - MaxYr) * 3 + 9, 1, (int) ((MaxYr - MinYr) * 3) + 2); LabelMaxYr.setBounds((((int) MinXr + 180) * 3) + 9, (int) (90 - MaxYr) * 3 + 9, (int) ((MaxXr - MinXr) * 3) + 2, 1); LabelMinYr.setBounds((((int) MinXr + 180) * 3) + 9, ((90 - (int) MinYr) * 3) + 10, (int) ((MaxXr - MinXr) * 3) + 2, 1); map0lab.setBounds(10, 10, 540, 540); map1lab.setBounds(550, 10, 540, 540);

15

red = new ImageIcon(GraphInterface.class.getResource("/red.jpeg")); black = new ImageIcon(GraphInterface.class.getResource("/black.jpeg")); map0img = new ImageIcon(GraphInterface.class .getResource("/mundi0.jpeg")); map1img = new ImageIcon(GraphInterface.class .getResource("/mundi1.jpeg")); map0lab.setIcon(map0img); map1lab.setIcon(map1img); LabelMinX.setIcon(black); LabelMaxX.setIcon(black); LabelMaxY.setIcon(black); LabelMinY.setIcon(black); LabelMinXr.setIcon(red); LabelMaxXr.setIcon(red); LabelMaxYr.setIcon(red); LabelMinYr.setIcon(red); newFrame.getContentPane().add(LabelMinXr); newFrame.getContentPane().add(LabelMaxXr); newFrame.getContentPane().add(LabelMaxYr); newFrame.getContentPane().add(LabelMinYr); newFrame.getContentPane().add(LabelMinX); newFrame.getContentPane().add(LabelMaxX); newFrame.getContentPane().add(LabelMaxY); newFrame.getContentPane().add(LabelMinY); newFrame.getContentPane().add(map0lab); newFrame.getContentPane().add(map1lab); if ((MaxX > MinX && MaxY > MinY)) { newFrame.setVisible(true); } JButtonok.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { newFrame.setVisible(false); } }); } public static void ConfirmWindow() { final JFrame nuevoFrame = new JFrame(); nuevoFrame.setVisible(true); nuevoFrame.pack(); nuevoFrame.setBounds(300, 100, 400, 200); JLabel textLabel10 = new JLabel("file created", SwingConstants.CENTER); textLabel10.setBounds(135, 50, 124, 29);

16

textLabel10.setFont(new Font("File Created", Font.PLAIN, 16)); nuevoFrame.getContentPane().add(textLabel10); JButton JButton12 = new JButton(); JButton12.setVerticalTextPosition(AbstractButton.BOTTOM); JButton12.setHorizontalTextPosition(AbstractButton.CENTER); nuevoFrame.setLayout(null); JButton12.setBounds(150, 120, 94, 29); JButton12.setText("OK"); JButton12.setName("OKbutton"); nuevoFrame.getContentPane().add(JButton12); JButton12.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { nuevoFrame.setVisible(false); } }); } }

1.6.WMSCRandomBBoxGenerator.java

package org.uva.wmsc.benchmarking; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.Random; public class WMSCRandomBBoxGenerator { private TileScheme ts = null; public WMSCRandomBBoxGenerator(TileScheme ts) { this.ts = ts; } public BBox getRandomWMSCTileBBox() { double MaxX = ts.getTileMatrixMaxXr(); double MinX = ts.getTileMatrixMinXr();

17

double MaxY = ts.getTileMatrixMaxYr(); double MinY = ts.getTileMatrixMinYr(); int minresolution = ts.getMinresolution(); int maxresolution = ts.getMaxresolution(); double diffMatrixX = MaxX - MinX; double diffMatrixY = MaxY - MinY; Random funcrand = new Random(); double funcranddouble = funcrand.nextDouble(); Random funcrand2 = new Random(); double funcranddouble2 = funcrand2.nextDouble(); Random funcrand3 = new Random(); int funcrandint = minresolution + funcrand3.nextInt(maxresolution - minresolution + 1); int tileMaxCol = (int) Math.round(diffMatrixX / (ts.resmat[funcrandint] * ts.getWidth())); int tileMaxRow = (int) Math.round(diffMatrixY / (ts.resmat[funcrandint] * ts.getHeight())); int tileCol = (int) Math.floor(tileMaxCol * funcranddouble); int tileRow = (int) Math.floor(tileMaxRow * funcranddouble2); double tileSpanX = ts.getWidth() * ts.resmat[funcrandint]; double tileSpanY = ts.getHeight() * ts.resmat[funcrandint]; double BBox1 = tileCol * tileSpanX + MinX; double BBox2 = MaxY - (tileRow + 1) * tileSpanY; double BBox3 = (tileCol + 1) * tileSpanX + MinX; double BBox4 = MaxY - tileRow * tileSpanY; BBox bbox = new BBox(BBox1, BBox2, BBox3, BBox4); return (bbox); } public void csvwrite() throws IOException { ts = TileScheme.getTs(); BufferedWriter out = new BufferedWriter(new FileWriter(Configuration .getOutFilePath() + ts.getCsvfilename() + ".csv")); BBox bbox = null; Random prob1rand = new Random(); int prob1randint = prob1rand.nextInt(100); Random prob2rand = new Random(); int prob2randint = prob2rand.nextInt(100); Random prob3rand = new Random(); int prob3randint = prob3rand.nextInt(100);

18

Random prob4rand = new Random(); int prob4randint = prob4rand.nextInt(100); for (int i = 0; i < ts.getNumberofbbox();) { bbox = getRandomWMSCTileBBox(); out.write(bbox.getCrsMinX() + "," + bbox.getCrsMinY() + "," + bbox.getCrsMaxX() + "," + bbox.getCrsMaxY() + "\n"); i++; if (prob1randint < ts.getProb1() & i < ts.getNumberofbbox()) { out.write(bbox.getCrsMinX() + "," + bbox.getCrsMinY() + "," + bbox.getCrsMaxX() + "," + bbox.getCrsMaxY() + "\n"); i++; if (prob2randint < ts.getProb2() & i < ts.getNumberofbbox()) { out.write(bbox.getCrsMinX() + "," + bbox.getCrsMinY() + "," + bbox.getCrsMaxX() + "," + bbox.getCrsMaxY() + "\n"); i++; if (prob3randint < ts.getProb3() & i < ts.getNumberofbbox()) { out.write(bbox.getCrsMinX() + "," + bbox.getCrsMinY() + "," + bbox.getCrsMaxX() + "," + bbox.getCrsMaxY() + "\n"); i++; if (prob4randint < ts.getProb4() & i < ts.getNumberofbbox()) { out.write(bbox.getCrsMinX() + "," + bbox.getCrsMinY() + "," + bbox.getCrsMaxX() + "," + bbox.getCrsMaxY() + "\n"); i++; } } } } } out.close(); } }

19

1.6.WMSCBBddBBoxGenerator.java
package org.uva.wmsc.benchmarking; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.StringTokenizer; public class WMSCBBddBBoxGenerator { private TileScheme ts = null; public WMSCBBddBBoxGenerator(TileScheme ts) { this.ts = ts; } public BBox[] getBBddbboxes() { String[][] bbox = new String[10][ts.getNumberofbbox()]; int i = 0; BBox[] bboxes = new BBox[ts.getNumberofbbox()]; try { Class.forName(Configuration.getDriver()); Connection con = DriverManager.getConnection(Configuration .getConnectString(), Configuration.getUser(), Configuration .getPassword()); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT asText(bbox) FROM " + Configuration.getBbddName() + " limit " + ts.getNumberofbbox() + ""); while (rs.next()) { String bboxstr = rs.getString(1).substring(9); final StringTokenizer stCad = new StringTokenizer(bboxstr, ","); int j = 0; while (stCad.hasMoreTokens()) { final StringTokenizer stbbox = new StringTokenizer(stCad .nextToken(), " "); String stra = stbbox.nextToken(); String strb = stbbox.nextToken(); bbox[j * 2][i] = stra;

20

bbox[(j * 2) + 1][i] = strb; j++; } bboxes[i] = new BBox(Double.parseDouble(bbox[4][i]), Double .parseDouble(bbox[0][i]), Double .parseDouble(bbox[3][i]), Double .parseDouble(bbox[1][i])); i++; } stmt.close(); con.close(); } catch (Exception e) { System.out.println(e.getMessage()); } return bboxes; } public void csvwrite() throws IOException { ts = TileScheme.getTs(); BufferedWriter out = new BufferedWriter(new FileWriter(Configuration .getOutFilePath() + ts.getCsvfilename() + ".csv")); BBox[] bboxes = getBBddbboxes(); for (int i = 0; i < bboxes.length; i++) { out.write(bboxes[i].getCrsMinX() + "," + bboxes[i].getCrsMinY() + "," + bboxes[i].getCrsMaxX() + "," + bboxes[i].getCrsMaxY() + "\n"); } out.close(); } }

21

2.JMeterReports 2.1.Constants.java
package es.uva.idelab.benchmarking; public class Constants { public static String AVG_RATE = "AVG_RATE"; public static final String AVG_TIME = "AVG_TIME";

public String getAvgRate(){ return AVG_RATE; } public String getAvgTime(){ return AVG_TIME; } }

2.2.Stats.java
package es.uva.idelab.benchmarking; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class Stats { public static double getAvgTime(String csvFile) { String[] data_entry = null; long sum = 0; double avg_time = 0; int j = 0; try { BufferedReader in = new BufferedReader(new FileReader(csvFile)); String str = null; str = in.readLine();// skip headers while ((str = in.readLine()) != null) { data_entry = str.split(","); sum += Long.valueOf(data_entry[11]).longValue(); j++; }

22

in.close(); } catch (IOException e) { } avg_time = (double) sum / j; return avg_time; } public static double getAvgRate(String csvFile) { String[] data_entry = null; long start = 0; long end = 0; long elapsed = 0; long start_temp = 0; long end_temp = 0; double avg_rate = 0; int j = 1; try { BufferedReader in = new BufferedReader(new FileReader(csvFile)); String str = null; str = in.readLine(); // skip header // labels str = in.readLine(); data_entry = str.split(","); start = Long.valueOf(data_entry[0]).longValue(); elapsed = Long.valueOf(data_entry[1]).longValue(); end = Long.valueOf(data_entry[0]).longValue() + elapsed; while ((str = in.readLine()) != null) { j++; data_entry = str.split(","); elapsed = Long.valueOf(data_entry[1]).longValue(); start_temp = Long.valueOf(data_entry[0]).longValue(); end_temp = Long.valueOf(data_entry[0]).longValue(); if (start_temp < start) { start = start_temp; } if ((end_temp + elapsed) > end) { end = end_temp + elapsed; } }

23

in.close(); } catch (IOException e) { } avg_rate = (double) 1000 * (j) / (end - start); return avg_rate; } }

2.3.ReportGenerator.java
package es.uva.idelab.benchmarking; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class ReportGenerator { private static double numrow; private static double maxthread = 1; private static double minthread = 1; private static final String CONFIGURATION_FILE = "/config.properties"; /** * @param args */ public static void main(String[] args) { ReportGenerator rg = new ReportGenerator(); try { rg.generateReport(args); } catch (IOException e) { System.out.println(e.getMessage()); } } private void generateReport(String[] argthreads) throws IOException {

24

String summary = ""; if (argthreads[0].equals("store") == true) { String thread = argthreads[1]; int numrow = 0; try { Properties properties = new Properties(); properties.load(ReportGenerator.class .getResourceAsStream("/config.properties")); FileInputStream store = new FileInputStream(properties .getProperty("storepath")); HSSFWorkbook wb = new HSSFWorkbook(store); HSSFSheet sheet = wb.getSheetAt(1); while (sheet.getRow(numrow) != null) { numrow++; } String path = properties.getProperty("csvpath"); HSSFRow row = sheet.createRow(numrow); row.createCell(0).setCellValue(Double.parseDouble(thread)); row.createCell(1).setCellValue( Stats .getAvgTime(path + "wmscwrapper" + thread + ".csv")); row.createCell(2).setCellValue( Stats .getAvgTime(path + "geowebcache" + thread + ".csv")); row.createCell(3).setCellValue( Stats.getAvgTime(path + "tilecache" + thread + ".csv")); row.createCell(4).setCellValue( Stats .getAvgRate(path + "wmscwrapper" + thread + ".csv")); row.createCell(5).setCellValue( Stats .getAvgRate(path + "geowebcache" + thread + ".csv")); row.createCell(6).setCellValue( Stats.getAvgRate(path + "tilecache" + thread + ".csv")); File outFile = new File(properties.getProperty("storepath")); FileOutputStream outputFile = new FileOutputStream(outFile);

25

wb.write(outputFile); outputFile.close(); } catch (Exception e) { } } if (argthreads[0].equals("0") == true) { int numrows = 0; int j = 0; double threshold = 0; double threads = 0; double sumthreads = 0; double sumgwctime = 0; double sumwmsctime = 0; double sumtctime = 0; double sumgwcrate = 0; double sumwmsrate = 0; double sumtcrate = 0; try { Properties properties = new Properties(); properties.load(ReportGenerator.class .getResourceAsStream(CONFIGURATION_FILE)); FileInputStream storefile = new FileInputStream(properties .getProperty("storepath"));

FileInputStream archivo = new FileInputStream(properties .getProperty("template")); HSSFWorkbook libro = new HSSFWorkbook(archivo);

HSSFWorkbook databook = new HSSFWorkbook(storefile); HSSFSheet datasheet = databook.getSheetAt(1); HSSFSheet sheet = libro.getSheet("hoja1");

while (datasheet.getRow(numrows) != null) { numrows++; } setNumRow(numrows); HSSFRow[] rows = new HSSFRow[numrows]; HSSFRow[] rowsord = new HSSFRow[numrows];

26

for (int i = 2; i < numrows; i++) { rows[i] = datasheet.getRow(i); } setMaxThread(rows); setMinThread(0, rows); while (getMinThread() < getMaxThread()) { for (int i = 2; i < numrows; i++) { if (rows[i].getCell(0).getNumericCellValue() <= getMinThread() && rows[i].getCell(0).getNumericCellValue() - threshold > 0) { rowsord[j] = rows[i]; j++; } } threshold = getMinThread(); setMinThread(getMinThread(), rows); } for (int i = 2; i < numrows; i++) { if (rows[i].getCell(0).getNumericCellValue() == getMaxThread()) { rowsord[j] = rows[i]; j++; } } int cont2 = 0; int cont1 = 1; for (int i = 0; i < getNumRow() - 2; i++) { threads = rowsord[i].getCell(0).getNumericCellValue(); sumthreads = threads; sumwmsctime = rowsord[i].getCell(1).getNumericCellValue();

27

sumgwctime = rowsord[i].getCell(2).getNumericCellValue(); sumtctime = rowsord[i].getCell(3).getNumericCellValue(); sumwmsrate = rowsord[i].getCell(4).getNumericCellValue(); sumgwcrate = rowsord[i].getCell(5).getNumericCellValue(); sumtcrate = rowsord[i].getCell(6).getNumericCellValue(); cont1 = 1; HSSFRow Row = null; for (int k = i + 1; k < getNumRow() - 2; k++) { if (threads == rowsord[k].getCell(0) .getNumericCellValue()) { sumthreads += rowsord[k].getCell(0) .getNumericCellValue(); sumwmsctime += rowsord[k].getCell(1) .getNumericCellValue(); sumgwctime += rowsord[k].getCell(2) .getNumericCellValue(); sumtctime += rowsord[k].getCell(3) .getNumericCellValue(); sumwmsrate += rowsord[k].getCell(4) .getNumericCellValue(); sumgwcrate += rowsord[k].getCell(5) .getNumericCellValue(); sumtcrate += rowsord[k].getCell(6) .getNumericCellValue(); cont1++; i++; } } if(cont2==0){ Row=sheet.getRow(1); Row.createCell(0).setCellValue((sumthreads / cont1)); Row.createCell(1).setCellValue((sumwmsctime / cont1)); Row.createCell(2).setCellValue((sumgwctime / cont1)); Row.createCell(3).setCellValue((sumtctime / cont1)); Row=sheet.getRow(28); Row.createCell(16).setCellValue((sumthreads / cont1)); Row.createCell(17).setCellValue((sumwmsrate / cont1)); Row.createCell(18).setCellValue((sumgwcrate / cont1)); Row.createCell(19).setCellValue((sumtcrate / cont1)); cont2++;

28

} else{ Row = sheet.createRow(cont2 + 1); Row.createCell(0).setCellValue((sumthreads / cont1)); Row.createCell(1).setCellValue((sumwmsctime / cont1)); Row.createCell(2).setCellValue((sumgwctime / cont1)); Row.createCell(3).setCellValue((sumtctime / cont1)); Row = sheet.createRow(cont2+28); Row.createCell(16).setCellValue((sumthreads / cont1)); Row.createCell(17).setCellValue((sumwmsrate / cont1)); Row.createCell(18).setCellValue((sumgwcrate / cont1)); Row.createCell(19).setCellValue((sumtcrate / cont1)); cont2++; } } for (int i = 2; i < numrows; i++) { for (int k = 0; k < 7; k++) { summary += rows[i].getCell(k).getNumericCellValue() + " "; } summary += ";"; } libro.removeSheetAt(1); String strNombreArchivo = properties.getProperty("outfilename"); File objFile = new File(strNombreArchivo); FileOutputStream archivoSalida = new FileOutputStream(objFile); libro.write(archivoSalida); archivoSalida.close(); PrintableTable.main(summary); } catch (IOException ex) { Logger.getLogger(ReportGenerator.class.getName()).log( Level.SEVERE, null, ex); } } } public static void setMinThread(double threshold, HSSFRow[] rows) { double minthreads = getMaxThread();

29

double threads = 0; for (int i = 2; i < getNumRow(); i++) { threads = rows[i].getCell(0).getNumericCellValue() - threshold; if (threads > 0 && threads < minthreads - threshold) { minthreads = threads + threshold; } } minthread = minthreads; } public static void setMaxThread(HSSFRow[] rows) { for (int i = 2; i < getNumRow(); i++) { double threads = rows[i].getCell(0).getNumericCellValue(); if (threads > getMaxThread()) { maxthread = threads; } } } public static double getMaxThreads() { return maxthread; } public static void setNumRow(double numrows) { numrow = numrows; } public static double getNumRow() { return numrow; } public static double getMaxThread() { return maxthread; } public static double getMinThread() {

30

return minthread; } }

2.4.PrintableTable.java
package es.uva.idelab.benchmarking; public class PrintableTable { private String title; private String[][] data; private int rowNumber; private int colNumber; public Constants cs = new Constants(); public PrintableTable(String title, String summary) { String[] rowstr = summary.split(";"); int rowNumber = rowstr.length; int colNumber = 0; for (int row = 0; row < rowstr.length; row++) { String[] colstr = rowstr[row].split(" "); if (colstr.length > colNumber) { colNumber = colstr.length; } } this.rowNumber = rowNumber; this.colNumber = colNumber; data = new String[rowNumber + 1][colNumber]; this.title = title; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; }

31

public String[][] getData() { return data; } public void setData(String[][] data) { this.data = data; } public void setData(String summary) { String[] rowstr = summary.split(";"); String[] colstr; this.data[0][0] = "Threads"; this.data[0][1] = "WMS-C-Wrapper"; this.data[0][2] = "GeoWebCache"; this.data[0][3] = "TileCache"; this.data[0][4] = "WMS-C-Wrapper"; this.data[0][5] = "GeoWebCache"; this.data[0][6] = "TileCache"; for (int row = 0; row < this.rowNumber; row++) { colstr = rowstr[row].split(" "); for (int col = 0; col < this.colNumber; col++) { this.data[row + 1][col] = colstr[col]; } } } public String toString() { int colWidth = getColWidth(); String table = ""; String line = " " + getRepeated("_", colNumber * (colWidth + 1) - 1) + "\n"; table += line; table += "|" + getRepeated(" ", (colNumber * (colWidth + 1) - title.length() - 1) / 2) + title + getRepeated(" ", (int) ((colNumber * (colWidth + 1) - title.length() + 0.7) / 2)) + "|\n";

32

table += line; table += "|"+ getRepeated(" ", colWidth)+"|"+getRepeated(" ", (3 * (colWidth + 1) cs.getAvgTime().length()) / 2)+cs.getAvgTime()+ getRepeated(" ",(int) (3 * (colWidth + 1) (cs.getAvgTime().length() + 1)) / 2) + "|"; table += getRepeated(" ", (3 * (colWidth + 1) - cs.getAvgRate().length()) / 2)+cs.getAvgRate()+getRepeated(" ",(int) (3 * (colWidth + 1) - (cs.getAvgRate().length() + 1)) / 2) + "|\n"; table += line; for (int row = 0; row < rowNumber + 1; row++) { for (int col = 0; col < colNumber; col++) { table += "|"; table += data[row][col].toString() + getRepeated(" ", colWidth - data[row][col].toString().length()); } table += "|\n"; if (row == 0) { table += line; } } table += line; return table; } private int getColWidth() { int width = 0; for (int row = 0; row < rowNumber + 1; row++) { for (int col = 0; col < colNumber; col++) { if (data[row][col].toString().length() > width) width = data[row][col].toString().length(); } } return width; } private String getRepeated(String s, int n) { String chain = ""; for (int i = 0; i < n; i++) { chain += s; } return chain; } public static void main(String summary) { PrintableTable tbl = new PrintableTable("Results Summary", summary); tbl.setData(summary);

33

System.out.println(tbl); } }

34

You might also like