Re: [OSM-dev-fr] Proposition d'amélioration de la gestion du cache

2013-05-06 Par sujet Christian Quest
Bonjour Matthieu,

Ne transmettre qu'un diff de ce qui a changé sur une tuile impliquerai
de conserver côté serveur, la dernière version d'une tuile ainsi qu'un
certain nombre de diff des versions précédents.

Ce mécanisme ne fonctionnerai correctement que si le client a déjà une
ancienne tuile dans son cache. Est-ce si souvent le cas ?

Je pense surtout que le problème de ressources n'est pas dans le
transfert des tuiles, mais plus dans leur génération.

L'avenir se situe sûrement dans un domaine tout autre: les tuiles
vectorielles... et le rendu au niveau du client.


Le 5 mai 2013 12:07, Matthieu Rakotojaona
matthieu.rakotoja...@gmail.com a écrit :
 Bonjour,

 Je lurke depuis quelque temps sur le projet OSM que je trouve
 incroyable, et j'ai cru comprendre que les requêtes de tuiles sont un
 véritable problème parce qu'elles consomment un max de ressources,
 ressources qui ne coulent pas à flot, d'où l'importance de la gestion
 de caches.

 Aujourd'hui, si j'ai bien compris, la gestion des caches reste au
 niveau de HTTP:

 * Soit un Squid de la fondation a la tuile demandée en cache, il va la
   distribuer
 * Soit il ne l'a pas, la tuile doit éventuellement être générée puis
   transférée au client

 Dans le deuxième cas, même si le client a une version précédente de la
 tuile, il va falloir télécharger la nouvelle de zéro. C'est un peu
 bête, surtout que les tuiles changent pas énormément entre deux
 itérations (surtout dans les zones déjà bien renseignées), du coup
 télécharger 20Ko de pixel alors qu'il y en a 3 qui change, ça me fait
 mal à mon côté j'aime les belles solutions techniques.

 Je pensais proposer une solution à la zsync [0]. L'idée est simple :
 pour chaque tuile générée, on génère un fichier qui sert, en gros, à
 décrire les blocs qui composent ce fichier. Lorsqu'un client qui a
 déjà une tuile en local va demander la nouvelle version de la tuile
 (avec un If-None-Match et un If-Modified-Since), il va demander ce
 nouveau fichier, tout petit (~250 octets). Si la tuile a changé, il va
 comparer ce fichier et la description de sa propre tuile pour trouver
 les blocs qui ont changé, et demander ceux-ci au serveur de tuile; il
 va ensuite pouvoir reconstruire la nouvelle tuile en local, sans avoir
 transféré la tuile complète !

 En fait, ce procédé c'est plus ou moins un rsync modifié. La
 différence notable c'est qu'il n'y a pas besoin d'avoir un logiciel
 spécial côté serveur pour _servir_ les blocs, puisque la logique se
 fait uniquement au moment de la génération de la tuile. Les blocs sont
 distribués sur
 simple requête HTTP via le header Range. Ça ajoute un peu de
 processing à côté de la génération des tuiles (je crois savoir que le
 serveur en charge aimerait bien se passer de toute charge
 supplémentaire), mais il n'est pas énorme (des tests rapides montrent
 une vitesse moyenne de ~100Mo/s sur mon core i5)

 Le monde n'est pas tout rose, et cette solution ajoute un aller-retour
 qui va augmenter le temps total avant affichage, mais si ça peut
 soulager les serveurs de la fondation c'est pour moi beaucoup plus
 important.

 J'ai tendance à souvent me lancer dans des projets jusqu'à un point où
 je me rends compte que le besoin n'existait pas. Du coup j'aimerais
 inverser la tendance et demander quelques stats d'utilisations des
 serveurs avant: est-ce qu'il y a beaucoup de clients qui font des GET
 avec des headers de cache, et on leur répond que leur tuile est trop
 vieille avec la nouvelle toute entière ? Ou est-ce qu'il y a très peu
 de requêtes avec ces headers (j'ai vu [1] qu'il y a moins de 4% de
 304, ça me semble faible) ?

 J'ai un prototype plus ou moins fonctionnel, je serai ravi de vous le
 montrer si tout ça a du sens.

 [0] http://zsync.moria.org.uk/

 Cordialement,
 --
 Matthieu RAKOTOJAONA

 ___
 dev-fr mailing list
 dev-fr@openstreetmap.org
 http://lists.openstreetmap.org/listinfo/dev-fr



-- 
Christian Quest - OpenStreetMap France
Synthèse du Week-end SOTM-FR à Lyon : http://openstreetmap.fr/synthese-sotmfr

___
dev-fr mailing list
dev-fr@openstreetmap.org
http://lists.openstreetmap.org/listinfo/dev-fr


Re: [OSM-dev-fr] Proposition d'amélioration de la gestion du cache

2013-05-06 Par sujet Philippe Verdy
Là aussi on peut penser à une autre piste: l'adaptation de la taille des
tuiles servies en fonction de la densité: rien n'oblige les métatuiles à
avoir la même taille, et le protocole pourrait mentionner la taille des
métatuiles touchées, pour réduire le nombre de requête ou optimiser les
requêtes en terme de compression et d'échanges : quand une tuile est
retournée, une métadonnée peut indiquer quelles autres tuiles font partie
de la même métatuile générée, et retourner alors non pas la tuiles mais
l'indication d'une autre tuile plus grande ou de plusieurs autres plus
petites.

Mais le protocole WMS ne semble pas avoir prévu ce type d'adaptation
(dynamique en fonction des contenus).

Le protocole cependant supporte de remplacer une tuile par une autre
(fonctionalité offerte par HTTP via des redirections : cela permettrait par
exemple de retourner la même tuile une seule fois quand elles sont
identifiques entre elles pour des zones assez grandes : une signature MD5
ou SHA1 des données de la tuile générée suffirait à identifier les tuiles
identiques dans leur contenu (mais pas forcément dans leurs métadonnées de
géolocalisation notamment).

Au pire cela gagnerait de l'espace de stockage côté serveur (il créait des
liens symboliques ou physiques en stockant ses tuiles sous un nom issu de
la signature de contenu), mais pas de temps pour générer ces tuiles
(générer une signature SHA1 est aujourd'hui une opération très rapide, avec
des accélérations matérielles dans les processeurs ou des optimisation
importantes, disponibles dans les bibliothèques de sécurisation, on obtient
facilement aujourd'hui le gigaoctet par seconde pour SHA1, dont le calcul
aurait alors un temps négligeable en comparaison du temps gagné sur les
accès disques épargnés par le stockage partagé des tuiles identiques).

Pour le reste, la vraie charge côté serveur c'est le temps de génération de
ces tuiles et la complexité des requêtes SQL à effectuer, et des
traitements géométriques, plus le traitement graphique plus ou moins
complexe pour le rendu lui-même, et enfin les I/O pour stocker les tuiles
générées. La piste d'optimisation c'est alors de voir si les métatuiles ne
sont pas trop grandes par rapport à la demande réelle, et savoir gérer côté
serveur des métadonnées sur leur fraicheur et leur fréquence de mise à jour
(ou durée minimale avant l'obsolescence).

Coté serveur on n'est pas non plus obligé de faire patienter le client même
si on a marqué une métatuile comme obsolète: on peut lui servir
immédiatement une tuile qu'on sait obsolète, mais qui sera mise à jour plus
tard : si on le fait on ne change rien aux métadonnées retournées au client
et on peut lui indiquer une date de péremption actualisée légèrement dans
le futur (jusqu'à une date estimée où cette tuile aura bien été régénérée
du côté du serveur). Le serveur peut estimer cette date du futur en pistant
le délai entre les dernières mises en file d'attente de tuiles à régénérer
et le moment où elles sortent de cette file d'attente.

Dernière problème : les tuiles demandées et que le serveur ne stocke pas
(cela concerne les niveaux de zoom élevés) : là seul un proxy Squid frontal
permet d'éviter de surcharger le serveur de génération des tuiles, mais il
vaut mieux que pour ces tuiles il y ait un serveur de génération séparé de
clui des tuiles que le serveur veut stocker et garder à jour (pour les
niveaux de zoom faibles) :

- on touche alors au tuning des serveurs Squid (programmation des durées
minimales de conservation en cache), et

- on doit se demander aussi comment les clients gèrent eux-mêmes leurs
propres caches HTTP (les navigateurs web font ça très bien, mais pas les
éditeurs hors navigateurs, comme JOSM). Cependant même pour les navigateurs
Web, on est lié aussi à la façon dont les frameworks javascripts exécutent
leurs requêtes HTTP : ces requêtes sont-elles correctement cachables du
côté client et du côté serveur pour que jamais l'utilisateur n'ait à
s'occuper de vider son cache local ?





Le 6 mai 2013 08:20, Christian Quest cqu...@openstreetmap.fr a écrit :

 Bonjour Matthieu,

 Ne transmettre qu'un diff de ce qui a changé sur une tuile impliquerai
 de conserver côté serveur, la dernière version d'une tuile ainsi qu'un
 certain nombre de diff des versions précédents.

 Ce mécanisme ne fonctionnerai correctement que si le client a déjà une
 ancienne tuile dans son cache. Est-ce si souvent le cas ?

 Je pense surtout que le problème de ressources n'est pas dans le
 transfert des tuiles, mais plus dans leur génération.

 L'avenir se situe sûrement dans un domaine tout autre: les tuiles
 vectorielles... et le rendu au niveau du client.


 Le 5 mai 2013 12:07, Matthieu Rakotojaona
 matthieu.rakotoja...@gmail.com a écrit :
  Bonjour,
 
  Je lurke depuis quelque temps sur le projet OSM que je trouve
  incroyable, et j'ai cru comprendre que les requêtes de tuiles sont un
  véritable problème parce qu'elles consomment un max de ressources,
  ressources qui ne coulent 

Re: [OSM-dev-fr] Proposition d'amélioration de la gestion du cache

2013-05-06 Par sujet Christophe Merlet

Le 06/05/2013 14:09, Philippe Verdy a écrit :

Là aussi on peut penser à une autre piste:


JUST DO IT



Librement,
--
Christophe Merlet (RedFox)

___
dev-fr mailing list
dev-fr@openstreetmap.org
http://lists.openstreetmap.org/listinfo/dev-fr


Re: [OSM-dev-fr] Proposition d'amélioration de la gestion du cache

2013-05-06 Par sujet Matthieu Rakotojaona
2013/5/6 Christian Quest cqu...@openstreetmap.fr:
 Bonjour Matthieu,

 Ne transmettre qu'un diff de ce qui a changé sur une tuile impliquerai
 de conserver côté serveur, la dernière version d'une tuile ainsi qu'un
 certain nombre de diff des versions précédents.

Justement non : le serveur conserverait la dernière tuile uniquement,
comme aujourd'hui, ainsi que le fichier signature associe permettant
de calculer le diff (la encore le dernier suffit). Ce serait au client
de calculer le diff via ce fichier signature entre la version qu'il a
en ce moment (ca peut même ne pas être la dernière) et la nouvelle du
serveur, puis de demander les blobs qui ont changé. Pour cette
dernière étape, un GET avec les bons header Range: suffit (c'est
déjà supporte aujourd'hui, rien a changer)


 Ce mécanisme ne fonctionnerai correctement que si le client a déjà une
 ancienne tuile dans son cache. Est-ce si souvent le cas ?

Justement, c’était ma question, vu que je n'ai pas accès aux logs. Je
sais pas si c'est facilement accessible dans les logs tels quels; s'il
faut parser, est-il possible d'avoir quelques lignes pour tester ?

 Je pense surtout que le problème de ressources n'est pas dans le
 transfert des tuiles, mais plus dans leur génération.

Ca je veux bien le croire.

 L'avenir se situe sûrement dans un domaine tout autre: les tuiles
 vectorielles... et le rendu au niveau du client.

Il va falloir que je me documente sur le sujet, je ne savais pas que
ca existait. Merci !

-- 
Matthieu RAKOTOJAONA

___
dev-fr mailing list
dev-fr@openstreetmap.org
http://lists.openstreetmap.org/listinfo/dev-fr


Re: [OSM-dev-fr] Proposition d'amélioration de la gestion du cache

2013-05-06 Par sujet Ab_fab
Bonsoir,

Le 6 mai 2013 16:17, Matthieu Rakotojaona
matthieu.rakotoja...@gmail.coma écrit :

 2013/5/6 Christian Quest cqu...@openstreetmap.fr:



  L'avenir se situe sûrement dans un domaine tout autre: les tuiles
  vectorielles... et le rendu au niveau du client.

 Il va falloir que je me documente sur le sujet, je ne savais pas que
 ca existait. Merci !

 Voir par exemple ici (c'est tout chaud)
http://mapbox.com/blog/vector-tiles-tilemill2-preview/


-- 
ab_fab http://wiki.openstreetmap.org/wiki/User:Ab_fab
Il n'y a pas de pas perdus, Nadja
___
dev-fr mailing list
dev-fr@openstreetmap.org
http://lists.openstreetmap.org/listinfo/dev-fr