{"id":6435,"date":"2017-01-24T09:02:23","date_gmt":"2017-01-24T12:02:23","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=6435"},"modified":"2017-01-24T09:03:40","modified_gmt":"2017-01-24T12:03:40","slug":"otimizacao-de-desempenho-no-geoserver","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2017\/01\/24\/otimizacao-de-desempenho-no-geoserver\/","title":{"rendered":"Otimiza\u00e7\u00e3o de desempenho no GeoServer"},"content":{"rendered":"<p>Neste post gostaria de falar um pouco sobre o trabalho que a equipe da <a href=\"http:\/\/www.geo-solutions.it\/\" target=\"_blank\">GeoSolutions <\/a>fez recentemente  em resposta ao teste preparado pela Camp2Camp para medir e comparar desempenho e escalabilidade dos servidores GeoServer, MapServer e QGIS utilizando 3 mapas do OSM com pontos, linhas e pol\u00edgonos. <\/p>\n<p>Se voc\u00ea estiver interessado em ver a apresenta\u00e7\u00e3o (que \u00e9 em franc\u00eas), voc\u00ea pode encontr\u00e1-la <a href=\"http:\/\/www.agrotic.org\/blog\/wp-content\/uploads\/2016\/12\/02_performance_qgis_server.pdf\" target=\"_blank\">aqui<\/a>; Se o seu franc\u00eas \u00e9 t\u00e3o ruim quanto o meu, n\u00e3o se preocupe, as imagens importantes sobre o desempenho s\u00e3o auto explicativas:<\/p>\n<p>a. Antes de otimizar o GeoServer<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c4.png\" alt=\"\" width=\"600\" height=\"264\" class=\"aligncenter size-full wp-image-6439\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c4.png 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c4-300x132.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>b. Depois de otimizar o GeoServer<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c5.png\" alt=\"\" width=\"600\" height=\"248\" class=\"aligncenter size-full wp-image-6440\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c5.png 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c5-300x124.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Ok, vamos agora um pouco mais a fundo sobre o que \u00e9 o teste e como voc\u00ea pode replicar esta experi\u00eancia.<\/p>\n<p>1. O Teste<\/p>\n<p>O sistema \u00e9 baseado em algumas imagens do docker que cont\u00eam os dados, a base de dados e o software. O reposit\u00f3rio principal est\u00e1 dispon\u00edvel aqui:<\/p>\n<p><a href=\"https:\/\/github.com\/camptocamp\/ms_perfs\" target=\"_blank\">https:\/\/github.com\/camptocamp\/ms_perfs<\/a><\/p>\n<p>As imagens do GeoServer podem ser baixadas a partir <a href=\"https:\/\/github.com\/camptocamp\/docker-geoserver\" target=\"_blank\">daqui<\/a>, assim como as imagens do QGIS e MapServer. Na configura\u00e7\u00e3o ele descarrega um mapa preciso dos dados ao redor do mundo e roda o benchmark usando gatling, atrav\u00e9s de alguns scripts shell, uma classe de teste escrito em Scala, e um script python que realiza a sumariza\u00e7\u00e3o no final.<\/p>\n<p>A instala\u00e7\u00e3o requer o download de todos os dados do OSM, download e compila\u00e7\u00e3o de v\u00e1rios pacotes, ou seja, podem ser necess\u00e1rias v\u00e1rias horas para isso (dependendo de qu\u00e3o r\u00e1pido seja sua conex\u00e3o). <\/p>\n<p>Uma execu\u00e7\u00e3o de teste usa 3 camadas, cada uma com dois estilos diferentes:<\/p>\n<ul>\n<li>roads-simple (linha cont\u00ednua)<\/li>\n<li>roads-dashed (linha tracejada)<\/li>\n<li>points-simple (circulo)<\/li>\n<li>points-class (3 arquivos svg para diferentes tipos de localiza\u00e7\u00e3o)<\/li>\n<li>buildings-simple (pol\u00edgono s\u00f3lido)<\/li>\n<li>buildings-dashed (pol\u00edgono tracejado)<\/li>\n<\/ul>\n<p>Cada execu\u00e7\u00e3o funciona em locais aleat\u00f3rios em 8 n\u00edveis de zoom diferentes, testando cada um separadamente e executando para 1, 2, 5, 10, 20, 40 usu\u00e1rios, portanto, 48 execu\u00e7\u00f5es, cada uma trabalhando por 120 segundos. <\/p>\n<p>Cada execu\u00e7\u00e3o usa todas as camadas em conjunto, mesmo se os relat\u00f3rios finais forem em hor\u00e1rios separados camada por camada (assim, 288 resultados no total).<\/p>\n<p>Uma execu\u00e7\u00e3o de teste funciona por 1,5 horas por servidor testado, portanto 4,5 horas no total. Os mapas no n\u00edvel zoom 7 cont\u00eam muito poucos itens, e para a camada de pontos s\u00e3o por vezes vazios, no n\u00edvel de zoom 0, em vez disso, torna-se uma &#8220;nuvem de pontos&#8221;. Veja:<\/p>\n<p>c. Nivel de zoom 7:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c1.png\" alt=\"\" width=\"700\" height=\"304\" class=\"aligncenter size-full wp-image-6445\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c1.png 700w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c1-300x130.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c1-600x261.png 600w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/p>\n<p>d. N\u00edvel de zoom 0:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c2.png\" alt=\"\" width=\"700\" height=\"525\" class=\"aligncenter size-full wp-image-6446\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c2.png 700w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c2-300x225.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c2-600x450.png 600w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/p>\n<p>2. O Resultado<\/p>\n<p>A configura\u00e7\u00e3o inicial do GeoServer tinha alguns inconvenientes que foram identificados para melhorar:<\/p>\n<p>a. Utilizava as conex\u00f5es m\u00e1ximas (10) no pool em rela\u00e7\u00e3o ao postgresql, o que estava impedindo a escalabilidade com solicita\u00e7\u00f5es WMS, portanto, foi elevada. Se voc\u00ea estiver interessado pode encontrar algum material \u00fatil sobre isso, voc\u00ea pode acessar <a href=\"http:\/\/geoserver.geo-solutions.it\/edu\/en\/enterprise\/vector.html\" target=\"_blank\">aqui<\/a>, <a href=\"http:\/\/geoserver.geo-solutions.it\/edu\/en\/adv_gsconfig\/db_pooling.html\" target=\"_blank\">aqui<\/a> e <a href=\"https:\/\/docs.google.com\/document\/d\/1O02PeDRYKt2xLWG21k6BmcaRPzVRvXb4SQcrcZf4bHQ\/edit?usp=sharing\" target=\"_blank\">aqui<\/a>.<\/p>\n<p>b. Os estilos n\u00e3o eram exatamente iguais entre os v\u00e1rios servidores.<\/p>\n<p>c. Os SVGs foram importados do QGIS tal como estavam, e ainda continham express\u00f5es param\u00e9tricas para cores, espessuras e opacidades, causando algumas exce\u00e7\u00f5es no in\u00edcio da execu\u00e7\u00e3o.<\/p>\n<p>d. O rasterizador n\u00e3o foi configurado para ser Marlin. Mais informa\u00e7\u00f5es sobre o tema <a href=\"http:\/\/www.geo-solutions.it\/blog\/developerss-corner-achieving-extreme-geoserver-scalability-with-the-new-marlin-vector-rasterizer\/\" target=\"_blank\">aqui<\/a> e <a href=\"http:\/\/geoserver.geo-solutions.it\/edu\/en\/enterprise\/jvm.html#using-the-marlin-renderer\" target=\"_blank\">aqui<\/a>.<\/p>\n<p>e. A simplifica\u00e7\u00e3o da geometria do lado do servidor que estava usando ST_Simplify, que foi desativada, j\u00e1 que a maioria das geometrias eram muito pequenas. Isso pode ser feito desmarcando a caixa de sele\u00e7\u00e3o &#8220;Suporte na simplifica\u00e7\u00e3o da geometria da mosca&#8221; no final da configura\u00e7\u00e3o do Datastore (veja Imagem abaixo).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c3.png\" alt=\"\" width=\"400\" height=\"344\" class=\"aligncenter size-full wp-image-6449\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c3.png 400w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2017\/01\/c2c3-300x258.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/p>\n<p>Como de costume quando se faz este tipo de experi\u00eancia geralmente encontra-se uma boa maneira de otimizar o GeoServer. Neste caso, foram realizadas algumas melhoras na vers\u00e3o Master do GeoServer, veja:<\/p>\n<p>f. Envio com renderizador Marlin: Devemos enviar o Marlin Renderer entre os jars do GeoServer por padr\u00e3o, ativar seu uso nos instaladores bin \/ win \/ osx,  quando o JDK for menos que 1.9.<\/p>\n<p>g. Otimizar a transfer\u00eancia de dados do PostgreSQL: Atualmente n\u00f3s transferimos dados utilizando o formato WKB, no entanto desde o PostGIS 2.2 temos dispon\u00edvel o TWKB que parece reduzir significativamente a carga \u00fatil transferida. <\/p>\n<p>O ST_RemoveRepeatedPoints parece ser tamb\u00e9m bastante interessante, com pouca sobrecarga, podemos usar por padr\u00e3o a partir da vers\u00e3o 2.2. do postgis e ter uma flag separada para o uso do ST_Simplify (que \u00e9 mais pesado). O segundo deve ser ativado na base de dados, talvez considerando tamb\u00e9m intervalos de escala. <\/p>\n<p>h. Representa\u00e7\u00e3o dos pol\u00edgonos: Pol\u00edgonos em java2d parece ser ainda significativamente mais lento do que no MapServer, isso \u00e9 algo que \u00e9 necess\u00e1rio tentar melhorar no n\u00edvel da JDK.<\/p>\n<p>Fonte: <a href=\"http:\/\/www.geo-solutions.it\/blog\/performance-geoserver\/\" target=\"_blank\">GeoSolutions Blog<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste post gostaria de falar um pouco sobre o trabalho que a equipe da GeoSolutions fez recentemente em resposta ao teste preparado pela Camp2Camp para medir e comparar desempenho e escalabilidade dos servidores GeoServer, MapServer e QGIS utilizando 3 mapas&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2017\/01\/24\/otimizacao-de-desempenho-no-geoserver\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":6437,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[208,216,260],"class_list":["post-6435","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-geoserver","tag-mapserver","tag-qgis"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/6435","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=6435"}],"version-history":[{"count":18,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/6435\/revisions"}],"predecessor-version":[{"id":6459,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/6435\/revisions\/6459"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/6437"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=6435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=6435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=6435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}