[Gfoss] tiles vs no-tiles

salve lista,
sto facendo delle prove con mapserver + openlayers e ho notato che se in openlayers faccio una chiamata ad un layer di mapserver con l'opzione "singleTile:true", il comportamento di mapserver e' molto migliore rispetto alla stessa chiamata con l'opzione "singleTile:false": in termini di tempo 1 a 10.

a livello server, se il layer e' diviso in tiles, ad ogni chiamata del client viene generato sul server un processo in parallelo per ogni tile.
il che significa mediamente una ventina di processi in contemporanea che affogano il server (sto provando sia in ambiente linux che windows).

per fare un esempio, se l'immagine intera ci mettesse 10 secondi ad essere generata, mi aspetterei che la ventina di immagini tilate ci mettano che so, non dico mezzo secondo l'una ma giu' di li, 1 o 2 secondi (sono molto più piccole), invece ce ne mettono 15 l'una (cioè più dell'immagine intera unica), con un incremento dei tempi di generazione dell'intera mappa assolutamente non competitivi rispetto al metodo no-tiles. mi aspetterei quindi che a generare tutti i tiles ci metta il doppio che il tile unico, invece ci mette molto molto di più.

siccome non vorrei rinunciare alla funzionalità di tiling della mappa, che credo renda la navigazione molto fluida, mi chiedevo se non ci fosse la possibilità di "serializzare" i processi mapserver in modo da generare un tile alla volta e non affogare il server.

non saprei se questa possa essere una opzione lato client (ajax sincrono o simili) o una opzione lato server.
ho cercato un po' in rete ma non ho trovato nulla al riguardo.

qualcuno saprebbe darmi un parere sulla questione ?

grazie,
francesco

Ciao,

Il giorno 09 settembre 2009 22.04, <francesco@alveo.coop> ha scritto:

salve lista,
sto facendo delle prove con mapserver + openlayers e ho notato che se in
openlayers faccio una chiamata ad un layer di mapserver con l'opzione
"singleTile:true", il comportamento di mapserver e' molto migliore rispetto
alla stessa chiamata con l'opzione "singleTile:false": in termini di tempo 1
a 10.

a livello server, se il layer e' diviso in tiles, ad ogni chiamata del
client viene generato sul server un processo in parallelo per ogni tile.
il che significa mediamente una ventina di processi in contemporanea che
affogano il server (sto provando sia in ambiente linux che windows).

per fare un esempio, se l'immagine intera ci mettesse 10 secondi ad essere
generata, mi aspetterei che la ventina di immagini tilate ci mettano che so,
non dico mezzo secondo l'una ma giu' di li, 1 o 2 secondi (sono molto più
piccole), invece ce ne mettono 15 l'una (cioè più dell'immagine intera
unica), con un incremento dei tempi di generazione dell'intera mappa
assolutamente non competitivi rispetto al metodo no-tiles. mi aspetterei
quindi che a generare tutti i tiles ci metta il doppio che il tile unico,
invece ci mette molto molto di più.

siccome non vorrei rinunciare alla funzionalità di tiling della mappa, che
credo renda la navigazione molto fluida, mi chiedevo se non ci fosse la
possibilità di "serializzare" i processi mapserver in modo da generare un
tile alla volta e non affogare il server.

non saprei se questa possa essere una opzione lato client (ajax sincrono o
simili) o una opzione lato server.
ho cercato un po' in rete ma non ho trovato nulla al riguardo.

qualcuno saprebbe darmi un parere sulla questione ?

salvo che non lavori con dati che cambiano spesso, ti consiglio di utilizzare
TileCache [1] o GeoWebCache [2] al fine non dover stare a generare le
tiles ad ogni accesso.

Luca

[1]: http://tilecache.org/
[2]: http://geowebcache.org/trac

Ciao Francesco,
innanzitutto una precisazione: quando si parla di interfacce grafiche
quello che conta è la responsiveness non la velocita' assoluta'.
Far partire un rendering aspettare X secondi e poi vedere il risultato
è una esperienza molto meno piacevole per un utente rispetto a
spezzettare la richiesta in N tile se vedere il primo dopo Y secondi
(Y<X). Naturalmente spezzettare molto le richieste comporta un carico
eccessivo sul motore di rendering ma puo' rendere la visualizzazione
piu' piacevole soprattutto se la banda è poca. Cmq sia introdurre il
tiling non fa che aumentare il tempo complessivo di risposta.

A parte le considerazioni teoriche, nota che OpenLayers, se non vado
errato fa partire un massimo di richieste per volta quindi non è che
se devi caricare 100 tile fai partire 100 richieste al server. Il modo
per velocizzare questo tipo di richieste c'e' ed ha vari nomi, io te
ne do uno, GeoWebCache, ossia una cache geospaziale specifica che
cachi i tile cosi' come sono richiesti dal client e generati dal
server. Se il tuo obiettivo è usare openalyers, usare una cache dei
tile è il mezzo piu' veloce per aumentare le prestazioni.

Simone.
-------------------------------------------------------
Ing. Simone Giannecchini
GeoSolutions S.A.S.
Founder - Software Engineer
Via Carignoni 51
55041 Camaiore (LU)
Italy

phone: +39 0584983027
fax: +39 0584983027
mob: +39 333 8128928

http://www.geo-solutions.it
http://geo-solutions.blogspot.com/
http://simboss.blogspot.com/
http://www.linkedin.com/in/simonegiannecchini

-------------------------------------------------------

2009/9/9 <francesco@alveo.coop>:

salve lista,
sto facendo delle prove con mapserver + openlayers e ho notato che se in
openlayers faccio una chiamata ad un layer di mapserver con l'opzione
"singleTile:true", il comportamento di mapserver e' molto migliore rispetto
alla stessa chiamata con l'opzione "singleTile:false": in termini di tempo 1
a 10.

a livello server, se il layer e' diviso in tiles, ad ogni chiamata del
client viene generato sul server un processo in parallelo per ogni tile.
il che significa mediamente una ventina di processi in contemporanea che
affogano il server (sto provando sia in ambiente linux che windows).

per fare un esempio, se l'immagine intera ci mettesse 10 secondi ad essere
generata, mi aspetterei che la ventina di immagini tilate ci mettano che so,
non dico mezzo secondo l'una ma giu' di li, 1 o 2 secondi (sono molto più
piccole), invece ce ne mettono 15 l'una (cioè più dell'immagine intera
unica), con un incremento dei tempi di generazione dell'intera mappa
assolutamente non competitivi rispetto al metodo no-tiles. mi aspetterei
quindi che a generare tutti i tiles ci metta il doppio che il tile unico,
invece ci mette molto molto di più.

siccome non vorrei rinunciare alla funzionalità di tiling della mappa, che
credo renda la navigazione molto fluida, mi chiedevo se non ci fosse la
possibilità di "serializzare" i processi mapserver in modo da generare un
tile alla volta e non affogare il server.

non saprei se questa possa essere una opzione lato client (ajax sincrono o
simili) o una opzione lato server.
ho cercato un po' in rete ma non ho trovato nulla al riguardo.

qualcuno saprebbe darmi un parere sulla questione ?

grazie,
francesco
_______________________________________________
Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
Gfoss@faunalia.it
http://lists.faunalia.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell'Associazione GFOSS.it.

2009/9/9 Simone Giannecchini <simone.giannecchini@geo-solutions.it>:

Ciao Francesco,
innanzitutto una precisazione: quando si parla di interfacce grafiche
quello che conta è la responsiveness non la velocita' assoluta'.
Far partire un rendering aspettare X secondi e poi vedere il risultato
è una esperienza molto meno piacevole per un utente rispetto a
spezzettare la richiesta in N tile se vedere il primo dopo Y secondi
(Y<X). Naturalmente spezzettare molto le richieste comporta un carico
eccessivo sul motore di rendering ma puo' rendere la visualizzazione
piu' piacevole soprattutto se la banda è poca. Cmq sia introdurre il
tiling non fa che aumentare il tempo complessivo di risposta.

A parte le considerazioni teoriche, nota che OpenLayers, se non vado
errato fa partire un massimo di

*2*

richieste per volta quindi non è che
se devi caricare 100 tile fai partire 100 richieste al server. Il modo
per velocizzare questo tipo di richieste c'e' ed ha vari nomi, io te
ne do uno, GeoWebCache, ossia una cache geospaziale specifica che
cachi i tile cosi' come sono richiesti dal client e generati dal
server. Se il tuo obiettivo è usare openalyers, usare una cache dei
tile è il mezzo piu' veloce per aumentare le prestazioni.

Simone.
-------------------------------------------------------
Ing. Simone Giannecchini
GeoSolutions S.A.S.
Founder - Software Engineer
Via Carignoni 51
55041 Camaiore (LU)
Italy

phone: +39 0584983027
fax: +39 0584983027
mob: +39 333 8128928

http://www.geo-solutions.it
http://geo-solutions.blogspot.com/
http://simboss.blogspot.com/
http://www.linkedin.com/in/simonegiannecchini

-------------------------------------------------------

2009/9/9 <francesco@alveo.coop>:

salve lista,
sto facendo delle prove con mapserver + openlayers e ho notato che se in
openlayers faccio una chiamata ad un layer di mapserver con l'opzione
"singleTile:true", il comportamento di mapserver e' molto migliore rispetto
alla stessa chiamata con l'opzione "singleTile:false": in termini di tempo 1
a 10.

a livello server, se il layer e' diviso in tiles, ad ogni chiamata del
client viene generato sul server un processo in parallelo per ogni tile.
il che significa mediamente una ventina di processi in contemporanea che
affogano il server (sto provando sia in ambiente linux che windows).

per fare un esempio, se l'immagine intera ci mettesse 10 secondi ad essere
generata, mi aspetterei che la ventina di immagini tilate ci mettano che so,
non dico mezzo secondo l'una ma giu' di li, 1 o 2 secondi (sono molto più
piccole), invece ce ne mettono 15 l'una (cioè più dell'immagine intera
unica), con un incremento dei tempi di generazione dell'intera mappa
assolutamente non competitivi rispetto al metodo no-tiles. mi aspetterei
quindi che a generare tutti i tiles ci metta il doppio che il tile unico,
invece ci mette molto molto di più.

siccome non vorrei rinunciare alla funzionalità di tiling della mappa, che
credo renda la navigazione molto fluida, mi chiedevo se non ci fosse la
possibilità di "serializzare" i processi mapserver in modo da generare un
tile alla volta e non affogare il server.

non saprei se questa possa essere una opzione lato client (ajax sincrono o
simili) o una opzione lato server.
ho cercato un po' in rete ma non ho trovato nulla al riguardo.

qualcuno saprebbe darmi un parere sulla questione ?

grazie,
francesco
_______________________________________________
Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
Gfoss@faunalia.it
http://lists.faunalia.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell'Associazione GFOSS.it.

On Wed, Sep 09, 2009 at 10:04:04PM +0200, francesco@alveo.coop wrote:

salve lista,
sto facendo delle prove con mapserver + openlayers e ho notato che
se in openlayers faccio una chiamata ad un layer di mapserver con
l'opzione "singleTile:true", il comportamento di mapserver e' molto
migliore rispetto alla stessa chiamata con l'opzione
"singleTile:false": in termini di tempo 1 a 10.

Con quale formato raster ? Si notava ieri che ecw ha un tempo
di shutdown del driver disastroso e per il tilimg la cosa
e' significativa

--
Francesco P. Lovergine

ragazzi,
intanto grazie per la velocità di risposta e soprattutto per il livello delle risposte.

per la prova che ho fatto io l'output e' banalmente un png, l'input sono tabelle vettoriali di postgis. quindi niente ecw, che ho provato in input ed e' veramente lento.

comunque adesso provo il concetto del "tile caching" che non conoscevo e che ancora non mi e' chiaro del tutto, poi vi faccio sapere.

grazie ancora,
francesco

Citando "Francesco P. Lovergine" <frankie@debian.org>:

On Wed, Sep 09, 2009 at 10:04:04PM +0200, francesco@alveo.coop wrote:

salve lista,
sto facendo delle prove con mapserver + openlayers e ho notato che
se in openlayers faccio una chiamata ad un layer di mapserver con
l'opzione "singleTile:true", il comportamento di mapserver e' molto
migliore rispetto alla stessa chiamata con l'opzione
"singleTile:false": in termini di tempo 1 a 10.

Con quale formato raster ? Si notava ieri che ecw ha un tempo
di shutdown del driver disastroso e per il tilimg la cosa
e' significativa

--
Francesco P. Lovergine

On Wed, Sep 09, 2009 at 10:04:04PM +0200, francesco@alveo.coop wrote:

per fare un esempio, se l'immagine intera ci mettesse 10 secondi ad
essere generata, mi aspetterei che la ventina di immagini tilate ci
mettano che so, non dico mezzo secondo l'una ma giu' di li, 1 o 2
secondi (sono molto più piccole), invece ce ne mettono 15 l'una (cioè
più dell'immagine intera unica),

Questo è sintomo che c'è qualcosa di sbagliato che ci sfugge. La
singola tile non può impiegare più tempo dell'intera immagine non
mattonellata!

Il tilecache non risolve il problema: lo nasconde a discapito
dello spazio occupato dalle tile prerenderizzate.

Il layer è di tipo WMS? In tal caso farei un po' di debug sul
server web (log di Apache), vedendo il tipo di richiesta fatta
per la singola immagine e quelle fatte per le tile.

Sei sicuro che usino gli stessi parametri? Magari in un caso
chiede una trasparenza oppure un formato bitmap non ottimale.

Inoltre puoi provare a fare le richieste al WMS server con il
wget, in modo da debuggare solo il server WMS escludendo browser
e openlayers:

wget -O immagine.png "http://server/cgi-bin/mapserv?map=...&SERVICE=WMS...&quot;

Comunque in generale l'opzione single tile non può dare una user
experience migliore del multi tiles! C'è qualcosa che non va.

--
Niccolo Rigacci
Firenze - Italy

Beh, dipende dalla geometria: supponiamo che l’utente abbia una singola geometria con migliaia di punti: la differenza della generazione della geometria completa o dei tile non dovrebbe essere diversa se non per il tempo risparmiato in ogni tile per il reperimento geometria (se cachata). Il tempo di rendering dovrebbe essere verosimilmente lo stesso, dovendo comunque parsificare tutte le coordinate. Può accadere che sia più lento a causa del tempo necessario al calcolo della sovrapposizione tra coordinate e singolo pixel, per ottenere un rendering efficace, specie se accoppiato all’antialiasing. Poi appunto il multitile è fatto in parallelo, potrebbero esserci problemi prestazionali in questo senso (saturazione risorse di memoria o cpu)

Il rendering multitile è sicuramente più efficace in caso di piccole geometrie, in altri casi è da vedere…

2009/9/10 Niccolo Rigacci <niccolo@rigacci.org>

On Wed, Sep 09, 2009 at 10:04:04PM +0200, francesco@alveo.coop wrote:

per fare un esempio, se l’immagine intera ci mettesse 10 secondi ad
essere generata, mi aspetterei che la ventina di immagini tilate ci
mettano che so, non dico mezzo secondo l’una ma giu’ di li, 1 o 2
secondi (sono molto più piccole), invece ce ne mettono 15 l’una (cioè
più dell’immagine intera unica),

Questo è sintomo che c’è qualcosa di sbagliato che ci sfugge. La
singola tile non può impiegare più tempo dell’intera immagine non
mattonellata!

Il tilecache non risolve il problema: lo nasconde a discapito
dello spazio occupato dalle tile prerenderizzate.

Il layer è di tipo WMS? In tal caso farei un po’ di debug sul
server web (log di Apache), vedendo il tipo di richiesta fatta
per la singola immagine e quelle fatte per le tile.

Sei sicuro che usino gli stessi parametri? Magari in un caso
chiede una trasparenza oppure un formato bitmap non ottimale.

Inoltre puoi provare a fare le richieste al WMS server con il
wget, in modo da debuggare solo il server WMS escludendo browser
e openlayers:

wget -O immagine.png “http://server/cgi-bin/mapserv?map=…&SERVICE=WMS….”

Comunque in generale l’opzione single tile non può dare una user
experience migliore del multi tiles! C’è qualcosa che non va.


Niccolo Rigacci
Firenze - Italy


Iscriviti all’associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
Gfoss@faunalia.it
http://lists.faunalia.it/cgi-bin/mailman/listinfo/gfoss
Questa e’ una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell’Associazione GFOSS.it.

ciao,
scusate se non mi sono fatto piu' sentire, ma ci sto lavorando su quel problema.

ho fatto le prove che mi ha consigliato Niccolo e con un tile non ci sono problemi, viene regolarmente generato in pochi decimi di secondo.

Il problema nasce quando con OpenLayers richiedo il layer (WMS) con l'opzione SingleTile=false.
A quel punto, quando faccio uno zoom nella mappa, i tiles richiesti sono una sessantina, ed e' sicuramente questo che mette a sedere il server: mi chiedevo quindi se non sia esagerato aver bisogno di piu' di 60 tiles quando nella finestra della mappa si e no ce ne entrano 6 (ho una finestrella piccola e i tiles di default sono da 278x278).
Probabilmente in OpenLayers ci deve essere il modo di configurare il numero di tiles da richiamare per ogni livello di zoom, probabilmente e' un parametro che dipende dalla resolution o dall'estensione della mappa.
Volevo verificare questa cosa prima di dire qualcosa in lista.

Vi faccio sapere, perche' secondo me le performances di Postgis-MapServer-OpenLayers sono un elemento determinante per la scelta della completa filiera OpenSource, sapete, noi in Regione E-R abbiamo il fiato sul collo e non possiamo permetterci di avere il minimo tentennamento...

francesco

Citando Ivano <ivano.picco@gmail.com>:

Beh, dipende dalla geometria: supponiamo che l'utente abbia una singola
geometria con migliaia di punti: la differenza della generazione della
geometria completa o dei tile non dovrebbe essere diversa se non per il
tempo risparmiato in ogni tile per il reperimento geometria (se cachata). Il
tempo di rendering dovrebbe essere verosimilmente lo stesso, dovendo
comunque parsificare tutte le coordinate. Può accadere che sia più lento a
causa del tempo necessario al calcolo della sovrapposizione tra coordinate e
singolo pixel, per ottenere un rendering efficace, specie se accoppiato
all'antialiasing. Poi appunto il multitile è fatto in parallelo, potrebbero
esserci problemi prestazionali in questo senso (saturazione risorse di
memoria o cpu)
Il rendering multitile è sicuramente più efficace in caso di piccole
geometrie, in altri casi è da vedere...

2009/9/10 Niccolo Rigacci <niccolo@rigacci.org>

On Wed, Sep 09, 2009 at 10:04:04PM +0200, francesco@alveo.coop wrote:
>
> per fare un esempio, se l'immagine intera ci mettesse 10 secondi ad
> essere generata, mi aspetterei che la ventina di immagini tilate ci
> mettano che so, non dico mezzo secondo l'una ma giu' di li, 1 o 2
> secondi (sono molto più piccole), invece ce ne mettono 15 l'una (cioè
> più dell'immagine intera unica),

Questo è sintomo che c'è qualcosa di sbagliato che ci sfugge. La
singola tile non può impiegare più tempo dell'intera immagine non
mattonellata!

Il tilecache non risolve il problema: lo nasconde a discapito
dello spazio occupato dalle tile prerenderizzate.

Il layer è di tipo WMS? In tal caso farei un po' di debug sul
server web (log di Apache), vedendo il tipo di richiesta fatta
per la singola immagine e quelle fatte per le tile.

Sei sicuro che usino gli stessi parametri? Magari in un caso
chiede una trasparenza oppure un formato bitmap non ottimale.

Inoltre puoi provare a fare le richieste al WMS server con il
wget, in modo da debuggare solo il server WMS escludendo browser
e openlayers:

wget -O immagine.png "http://server/cgi-bin/mapserv?map=...&SERVICE=WMS
."

Comunque in generale l'opzione single tile non può dare una user
experience migliore del multi tiles! C'è qualcosa che non va.

--
Niccolo Rigacci
Firenze - Italy
_______________________________________________
Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
Gfoss@faunalia.it
http://lists.faunalia.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell'Associazione GFOSS.it.