[SPIP Zone] critere SQL_NO_CACHE

Bonjour,

Est-il possible d’envisager l’ajout d’un critere de boucle {sql_no_cache} dans le futur? J’ai une page type, declinee en une multitude de versions, avec un grand nombre de requetes relativement simples mais differentes et propres a chaque version de la page (donc en cache SPIP des lors). J’ai l’impression que mon serveur MYSQL prend plus de temps a essayer de gerer ces requetes dans son cache qu’a les executer purement et simplement. De plus je sais pertinament que ces requetes vont utiliser de l’espace cache SQL pour rien car elles ne seront executees a nouveau que lors de l’expiration de mon cache SPIP. Certains trouveront peut etre meme une utilite a un tel critere pour faire du benchmark.

Le resultat serait dans la requete SQL : « select SQL_NO_CACHE id_article, … »

merci pour votre attention.

Benoit.

Peut-être juste mettre #CACHE{0} en début de squelette, dans ce cas,
pour ne jamais mettre en cache.

El 17/01/14 20:02, Benoit Aubert escribió:

Bonjour,

Est-il possible d'envisager l'ajout d'un critere de boucle
{sql_no_cache} dans le futur? J'ai une page type, declinee en une
multitude de versions, avec un grand nombre de requetes relativement
simples mais differentes et propres a chaque version de la page (donc
en cache SPIP des lors). J'ai l'impression que mon serveur MYSQL
prend plus de temps a essayer de gerer ces requetes dans son cache
qu'a les executer purement et simplement. De plus je sais pertinament
que ces requetes vont utiliser de l'espace cache SQL pour rien car
elles ne seront executees a nouveau que lors de l'expiration de mon
cache SPIP. Certains trouveront peut etre meme une utilite a un tel
critere pour faire du benchmark.

Le resultat serait dans la requete SQL : "select SQL_NO_CACHE
id_article, ..."

merci pour votre attention.

Benoit.

----
spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

Non, la nuance ici c’est que je veux bel et bien mettre le resultat de la compilation en cache SPIP, mais je ne veux pas utiliser le cache MYSQL pour une boucle en particulier dans mon squelette.

Benoit


Date: Fri, 17 Jan 2014 20:25:03 +0100
From: severo@rednegra.net
To: spip-zone@rezo.net
Subject: Re: [SPIP Zone] critere SQL_NO_CACHE

Peut-être juste mettre #CACHE{0} en début de squelette, dans ce cas, pour ne jamais mettre en cache.

El 17/01/14 20:02, Benoit Aubert escribió:

Bonjour,

Est-il possible d’envisager l’ajout d’un critere de boucle {sql_no_cache} dans le futur? J’ai une page type, declinee en une multitude de versions, avec un grand nombre de requetes relativement simples mais differentes et propres a chaque version de la page (donc en cache SPIP des lors). J’ai l’impression que mon serveur MYSQL prend plus de temps a essayer de gerer ces requetes dans son cache qu’a les executer purement et simplement. De plus je sais pertinament que ces requetes vont utiliser de l’espace cache SQL pour rien car elles ne seront executees a nouveau que lors de l’expiration de mon cache SPIP. Certains trouveront peut etre meme une utilite a un tel critere pour faire du benchmark.

Le resultat serait dans la requete SQL : « select SQL_NO_CACHE id_article, … »

merci pour votre attention.

Benoit.

----
[spip-zone@rezo.net](mailto:spip-zone@rezo.net) - [http://listes.rezo.net/mailman/listinfo/spip-zone](http://listes.rezo.net/mailman/listinfo/spip-zone)

---- spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

Non, la nuance ici c'est que je veux bel et bien mettre le resultat de la
compilation en cache SPIP, mais je ne veux pas utiliser le cache MYSQL pour
une boucle en particulier dans mon squelette.

http://dev.mysql.com/doc/refman/5.0/fr/query-cache-in-select.html
? C'est propre à MySQL donc pas portable...

Peut-être juste mettre #CACHE{0} en début de squelette, dans ce cas, pour ne
jamais mettre en cache.

Est-il possible d'envisager l'ajout d'un critere de boucle {sql_no_cache}
dans le futur? J'ai une page type, declinee en une multitude de versions,
avec un grand nombre de requetes relativement simples mais differentes et
propres a chaque version de la page (donc en cache SPIP des lors). J'ai
l'impression que mon serveur MYSQL prend plus de temps a essayer de gerer
ces requetes dans son cache qu'a les executer purement et simplement. De
plus je sais pertinament que ces requetes vont utiliser de l'espace cache
SQL pour rien car elles ne seront executees a nouveau que lors de
l'expiration de mon cache SPIP. Certains trouveront peut etre meme une
utilite a un tel critere pour faire du benchmark.

Le resultat serait dans la requete SQL : "select SQL_NO_CACHE id_article,
..."

As-tu essayé, dans ton cas particulier, d'écrire la boucle ainsi pour
voir ? (ARTICLES){SQL_NO_CACHE id_article=#ENV{id_article}}...
au lieu de (ARTICLES){id_article}...

SQL_NO_CACHE doit s’inserer apres le SELECT, or mettre {SQL_NO_CACHE id_article=#ENV{id_article}} le placerait logiquement apres le WHERE dans la requete, et si toutefois on peut faire un tel trick. Je vais essayer, si cela fonctionne je viendrais le signaler.

Je suis en train de regarder les criteres existants voir si j’arrive a en creer un moi-meme, mais si un developpeur de SPIP sait comment le faire je serai content d’avoir une solution sure. Je suis sur que ce n’est pas complique pour quelqu’un qui sait sur le bout des doigts comment creer un critere.

Merci en tous cas pour ces infos.

Benoit

Date: Sat, 18 Jan 2014 01:57:10 +0100
Subject: Re: [SPIP Zone] critere SQL_NO_CACHE
From: gildas.cotomale@gmail.com
To: benoit.aubert@hotmail.fr
CC: spip-zone@rezo.net

Non, la nuance ici c’est que je veux bel et bien mettre le resultat de la
compilation en cache SPIP, mais je ne veux pas utiliser le cache MYSQL pour
une boucle en particulier dans mon squelette.

http://dev.mysql.com/doc/refman/5.0/fr/query-cache-in-select.html
? C’est propre à MySQL donc pas portable…

Peut-être juste mettre #CACHE{0} en début de squelette, dans ce cas, pour ne
jamais mettre en cache.

Est-il possible d’envisager l’ajout d’un critere de boucle {sql_no_cache}
dans le futur? J’ai une page type, declinee en une multitude de versions,
avec un grand nombre de requetes relativement simples mais differentes et
propres a chaque version de la page (donc en cache SPIP des lors). J’ai
l’impression que mon serveur MYSQL prend plus de temps a essayer de gerer
ces requetes dans son cache qu’a les executer purement et simplement. De
plus je sais pertinament que ces requetes vont utiliser de l’espace cache
SQL pour rien car elles ne seront executees a nouveau que lors de
l’expiration de mon cache SPIP. Certains trouveront peut etre meme une
utilite a un tel critere pour faire du benchmark.

Le resultat serait dans la requete SQL : « select SQL_NO_CACHE id_article,
… »

As-tu essayé, dans ton cas particulier, d’écrire la boucle ainsi pour
voir ? (ARTICLES){SQL_NO_CACHE id_article=#ENV{id_article}}…
au lieu de (ARTICLES){id_article}…

Ca n’est pas prévu dans l’API SQL, mais dans ton cas est-ce qu’il ne serait pas aussi simple d’activer SQL_NO_CACHE sur toutes les requêtes SQL ? Auquel cas il y a une méthode assez simple consistant à patcher req/mysql.php, puisque toutes les requêtes passent par là. Avec un define qui permettrait d’activer cette option.

Pour créer un critère, c’est intéressant aussi, mais il faut étendre l’API, ça va demander un peu plus de travail.

SQL_NO_CACHE doit s'inserer apres le SELECT, or mettre {SQL_NO_CACHE
id_article=#ENV{id_article}} le placerait logiquement apres le WHERE

Oups oui, tu as raison ! (j'écris vraiment n'importe quoi quand je
suis fatigué moi)

Je suis en train de regarder les criteres existants voir si j'arrive a en
creer un moi-meme

Tâche complexe...

http://dev.mysql.com/doc/refman/5.0/fr/query-cache-in-select.html
? C'est propre à MySQL donc pas portable...

Le mieux est d'activer l'option pour tout le serveur (donc pour toutes
les requêtes) non ? SPIP ne devrait pas en être trop impacté je pense.

J’ai reussi a contourner le probleme pour ma boucle dans ce cas. Mais je serai interesse tout de meme a l’avenir par un tel critere. Je ne peux pas desactiver le cache sur le serveur SQL c’est tout de meme necessaire de l’avoir. Mais avoir quelques boucles dont on sait pertinament que leurs requetes vont parasiter le systeme c’est un peu enervant. Quand on voit dans les process SQL les memes requetes s’accumuler avec des status lies a la gestion du cache on sent qu’il y a moyen d’optimiser un peu la charge sur le serveur SQL.

Merci pour vos suggestions.

Benoit Aubert


From: fil@rezo.net
Date: Sat, 18 Jan 2014 09:32:07 +0100
Subject: Re: [SPIP Zone] critere SQL_NO_CACHE
To: benoit.aubert@hotmail.fr
CC: spip-zone@rezo.net

Ca n’est pas prévu dans l’API SQL, mais dans ton cas est-ce qu’il ne serait pas aussi simple d’activer SQL_NO_CACHE sur toutes les requêtes SQL ? Auquel cas il y a une méthode assez simple consistant à patcher req/mysql.php, puisque toutes les requêtes passent par là. Avec un define qui permettrait d’activer cette option.

Pour créer un critère, c’est intéressant aussi, mais il faut étendre l’API, ça va demander un peu plus de travail.

– Fil

2014/1/18 Benoit Aubert <benoit.aubert@hotmail.fr>

SQL_NO_CACHE doit s’inserer apres le SELECT, or mettre {SQL_NO_CACHE id_article=#ENV{id_article}} le placerait logiquement apres le WHERE dans la requete, et si toutefois on peut faire un tel trick. Je vais essayer, si cela fonctionne je viendrais le signaler.

Je suis en train de regarder les criteres existants voir si j’arrive a en creer un moi-meme, mais si un developpeur de SPIP sait comment le faire je serai content d’avoir une solution sure. Je suis sur que ce n’est pas complique pour quelqu’un qui sait sur le bout des doigts comment creer un critere.

Merci en tous cas pour ces infos.

Benoit

Date: Sat, 18 Jan 2014 01:57:10 +0100

Subject: Re: [SPIP Zone] critere SQL_NO_CACHE

From: gildas.cotomale@gmail.com
To: benoit.aubert@hotmail.fr
CC: spip-zone@rezo.net

Non, la nuance ici c’est que je veux bel et bien mettre le resultat de la
compilation en cache SPIP, mais je ne veux pas utiliser le cache MYSQL pour
une boucle en particulier dans mon squelette.

http://dev.mysql.com/doc/refman/5.0/fr/query-cache-in-select.html
? C’est propre à MySQL donc pas portable…

Peut-être juste mettre #CACHE{0} en début de squelette, dans ce cas, pour ne
jamais mettre en cache.

Est-il possible d’envisager l’ajout d’un critere de boucle {sql_no_cache}
dans le futur? J’ai une page type, declinee en une multitude de versions,
avec un grand nombre de requetes relativement simples mais differentes et
propres a chaque version de la page (donc en cache SPIP des lors). J’ai
l’impression que mon serveur MYSQL prend plus de temps a essayer de gerer
ces requetes dans son cache qu’a les executer purement et simplement. De
plus je sais pertinament que ces requetes vont utiliser de l’espace cache
SQL pour rien car elles ne seront executees a nouveau que lors de
l’expiration de mon cache SPIP. Certains trouveront peut etre meme une
utilite a un tel critere pour faire du benchmark.

Le resultat serait dans la requete SQL : « select SQL_NO_CACHE id_article,
… »

As-tu essayé, dans ton cas particulier, d’écrire la boucle ainsi pour
voir ? (ARTICLES){SQL_NO_CACHE id_article=#ENV{id_article}}…
au lieu de (ARTICLES){id_article}…


spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

Le 20/01/14 10:30, Benoit Aubert a écrit :

je serai interesse tout de meme a l'avenir par un tel critere.

un critère (mes_options.php) :
   function critere_SQL_NO_CACHE($idb, &$boucles, $crit) {
     $boucle = &$boucles[$idb];
     $boucle->select = 'SQL_NO_CACHE';
   }

modifier ecrire/req/mysql.php (ligne 263) :
   function spip_mysql_select($select, $from, $where='',
       $groupby='', $orderby='', $limit='', $having='',
       $serveur='',$requeter=true) {
     if (is_array($select) AND in_array('SQL_NO_CACHE', $select)) {
       unset($select[0]);
       $no_cache = ' SQL_NO_CACHE';
     }
     else {
       $no_cache = '';
     }
     $from = (!is_array($from) ? $from : spip_mysql_select_as($from));
     $query =
       calculer_mysql_expression('SELECT'.$no_cache, $select, ', ')
       . calculer_mysql_expression('FROM', $from, ', ')
       ...

après, il suffit de passer le critère {SQL_NO_CACHE} dans la
boucle concernée.

mais c'est sans doute pas très heureux (le fork du $boucle->select) ...

Le unset($select[0]); n'est il pas dangeureux ?
Il me semble que ce devrait être
    unset( $select[array_search( 'SQL_NO_CACHE', $select)]);

Et globalement, dans quels cas serait il recommandé de peut être utilisé ce critère ?

Je dirais :
quand il y a un grand nombre d'environnements différents pour l'appel d'une boucle
et un cache SPIP (normalement long).

JL

Le 20/01/2014 12:14, denisb a écrit :

Le 20/01/14 10:30, Benoit Aubert a écrit :

je serai interesse tout de meme a l'avenir par un tel critere.

un critère (mes_options.php) :
   function critere_SQL_NO_CACHE($idb, &$boucles, $crit) {
     $boucle = &$boucles[$idb];
     $boucle->select = 'SQL_NO_CACHE';
   }

modifier ecrire/req/mysql.php (ligne 263) :
   function spip_mysql_select($select, $from, $where='',
       $groupby='', $orderby='', $limit='', $having='',
       $serveur='',$requeter=true) {
     if (is_array($select) AND in_array('SQL_NO_CACHE', $select)) {
       unset($select[0]);
       $no_cache = ' SQL_NO_CACHE';
     }
     else {
       $no_cache = '';
     }
     $from = (!is_array($from) ? $from : spip_mysql_select_as($from));
     $query =
       calculer_mysql_expression('SELECT'.$no_cache, $select, ', ')
       . calculer_mysql_expression('FROM', $from, ', ')
       ...

après, il suffit de passer le critère {SQL_NO_CACHE} dans la
boucle concernée.

mais c'est sans doute pas très heureux (le fork du $boucle->select) ...

----
spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

Le 20 janv. 2014 à 12:44, JLuc <jluc@no-log.org> a écrit :

Et globalement, dans quels cas serait il recommandé de peut être utilisé ce critère ?

Très clairement : la recommandation est de ne jamais l’utiliser.

Ce ne peut avoir une utilité que dans des cas très précis qui suppose que l’admin système est capable de dire que telle ou telle requête pose un problème à cause de la gestion de cache MYSQL, ce qui est le cas d’espèce ici. Mais même comme ça, cela suppose de vérifier de manière régulière de l’intérêt de ce compromis, car rien ne prouve qu’il soit définitif.

Je defend l’interet d’un tel critere en precisant mon cas. J’ai cree une page type, qui comporte une boucle qui est utilisee jusqu’a plusieurs centaines de fois par page. A chaque passage dans cette boucle la requete generee est unique de par ses parametres, pour la page et meme pour le reste du site c’est une certitude. Cette page se decline en plusieurs centaines de versions. Au final, c’est un potentiel de plusieurs centaines de milliers de requetes uniques que je viens d’ajouter dans mon site, et puisque le cache SPIP fait son travail, je sais d’autant plus que plusieurs jours au minimum vont s’ecouler avant que les memes requetes ne reapparaissent dans le serveur SQL.

Le cache SQL n’a d’interet que si on pense avoir une chance de retrouver et reutiliser les requetes, ce qui n’est pas le cas ici. Encore une fois cela touche un squelette en particulier donc desactiver le cache de maniere globale ne m’aidera pas il est sans doute utile pour le reste du site. Donc je vois clairement deux raisons pour utiliser un tel critere dans mon cas:

  1. C’est plus rapide d’effectuer une requete purement et simplement, plutot que d’interroger le cache sans succes, effectuer la requete, puis la mettre en cache (inutilement).

  2. Le cache SQL a une limite en taille, en mettant mes centaines de milliers de requetes en cache pour rien je prive le systeme de mettre en cache des requetes qui ont une chance d’en beneficier.

Ce qui m’a alerte, c’est qu’apres avoir mis en place mon squelette, et apres l’avoir teste sans aucun soucis, le load server est monte tres haut quelques heures plus tard, ce qui correspond vraissemblablement a une visite d’un moteur de recherche. Plusieurs heures durant, le load mysql restait eleve, bien que la vague soit passee. En jetant un oeil aux process SQL, je reconnaissais les requetes de ma boucle, qui continuaient a defiler, avec comme statut « statistics » ou « writting to net ». Si cette activite a retardement est bien liee au cache comme je le soupconne, dans ce cas il faut que je le bypass. Bien sur, maintenant que la plupart de ces pages ont ete mises en cache SPIP, le rafraichissement va s’etaler a l’avenir et je ne devrais plus avoir ce pic brutal de load SQL. Mais j’aimerai etre a l’abris car il est possible que j’aie a purger le cache un jour, ou bien changer des parametres dans mes templates qui invalideraient les noms de mes caches actuels. Et puis ca ne mange pas de pain de gagner quelques microsecondes de maniere constante en ce qui concerne ces boucles.

Dites moi si je me trompe quelque part.

Benoit Aubert


From: cedric@yterium.com
Date: Mon, 20 Jan 2014 19:17:45 +0100
To: jluc@no-log.org
CC: spip-zone@rezo.net
Subject: Re: [SPIP Zone] critere SQL_NO_CACHE

Le 20 janv. 2014 à 12:44, JLuc <jluc@no-log.org> a écrit :

Et globalement, dans quels cas serait il recommandé de peut être utilisé ce critère ?

Très clairement : la recommandation est de ne jamais l’utiliser.

Ce ne peut avoir une utilité que dans des cas très précis qui suppose que l’admin système est capable de dire que telle ou telle requête pose un problème à cause de la gestion de cache MYSQL, ce qui est le cas d’espèce ici. Mais même comme ça, cela suppose de vérifier de manière régulière de l’intérêt de ce compromis, car rien ne prouve qu’il soit définitif.

---- spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone