PROJET AUTOBLOG


Le blog de Seboss666

Site original : Le blog de Seboss666

⇐ retour index

Nous vivons dans un monde compressé

dimanche 25 février 2018 à 10:30

Nouvel article de vulgarisation aujourd’hui, pour expliquer les principes et les objectifs de la compression de données, les différents types, les usages. Et vous allez voir que vous ne voyez ou entendez que très rarement la version originale d’un contenu. Mais c’est nécessaire.

Un problème de poids

Pour rappel, toute information dans le monde informatique se résume à un 0 ou un 1 (un bit). On les groupe souvent ensuite par un certain nombre (8 pour en faire des octets par exemple), qu’on agence ensuite pour donner un sens plus humain au contenu. Le problème, c’est que plus on met d’informations, plus ces séries de zéros et de uns prennent de la place, et ça coûte cher à tous les niveaux, que ça soit pour les stocker ou pour les transmettre.

J’ai déjà pu évoquer la problématique lors de l’article des termes expliqués sur le multimédia je crois. Il ne s’agit pas de me recopier, mais pour donner un exemple, un client de LinkByNet qui verse dans la production de films, nous demande d’étudier une solution de stockage déporté pour conserver tous les rushes bruts d’une œuvre, avec une moyenne d’environ 20To… par film. Sachant que la version Bluray que vous achetez tient sur une galette de 50Go, même en ne se concentrant que sur une partie, ça fait au moins 20 fois moins. Et ça en grande partie grâce à la compression, sachant que le nombre qu’il nous ont donné concerne des données qui peuvent en partie être déjà compressées.

Mais la compression prend différentes formes dans le domaine de l’informatique, et parfois vous ne voyez tout simplement rien si vous ne vous attardez pas dessus.

Compression sans perte ou avec perte ?

Avant que vous fassiez une crise cardiaque en apprenant qu’il existe des algorithmes de compression qui détruisent de l’information, concentrons-nous sur ceux qui ,e le font pas. Ai-je besoin d’expliquer vraiment le concept ? Il s’agit de réduire la taille d’un fichier sans en altérer le contenu, donc on a exactement, au bit près, la même information une fois décompressé.

Prenons l’exemple d’un fichier texte avec le contenu suivant :

"Loooooooool"

11 caractères, et on voit qu’il y a 9 fois le caractères o. Pour compresser, il suffit de remplacer toutes les occurrences du o par l’information suivante :

"L(9xo)l"

Ce qui ne fait plus que 7 caractères, et encore, on pourrait éventuellement dans le cas présent s’épargner les parenthèses en procédant autrement, soit 5 caractère au lieu de 11. Je passe sur les détails mathématiques qui permettent à des formats comme le 7z (dont l’algorithme derrière est le LZMA) d’aller beaucoup plus loin, ne serait-ce que parce que je ne les maîtrise peu ou pas du tout.

La compression avec perte, elle, part du principe qu’on peut faire une croix sur une partie de l’information sans altérer le sens du message. C’est très, très souvent utilisé en multimédia, où l’on va dégrader volontairement la qualité du son et/ou de l’image, ce qui n’altère que peu la perception de l’information. Notez bien que je ne parle pas de dimensions de l’image, mais bien de l’information qui la compose. Pour le son, on va s’attarder notamment sur les fréquences que l’oreille humaine est censée entendre et supprimer les informations rattachées à celle qu’on entend pas. En modulant également d’autres paramètres on peut encore gagner un peu en taille, mais plus on enlève d’information, plus la qualité est mauvaise.

Dans le domaine visuel prenons l’exemple d’une image, dont les couleurs sont enregistrées sur 24 bit (8 bit par couleur), ce qui fait 16 millions de nuances. En réduisant le nombre de bits pour les couleurs (16), on n’a plus que 65536 nuances, pour certaines images c’est suffisant, mais pour d’autres, on verra apparaître de gros aplats. De manière plus fine on peut voir ce genre d’effet sur des vidéos fortement compressées.

Quel type pour quel usage ?

Avec perte

J’ai donc évoqué et réutilisé des exemples de compression avec perte pour le multimédia, et sachez que même lors d’un appel téléphonique, que ce soit à l’ancienne sur une ligne filaire ou en VoIP (par une box ADSL), on fait appel à de la compression audio pour limiter la taille de la voix. C’est une évidence : moins on transfère d’information, plus vite on la transmet, et la conversation semble du coup instantanée, dans le cas contraire, quand la transmission est lente, on peut avoir des décalages (de nos jours, pensez au streaming ou aux journalistes en direct qui répondent depuis l’autre bout du monde avec plusieurs secondes de délai).

Avec l’évolution à la fois de la taille des contenus bruts et des puissances de calcul, les algorithmes évoluent également, souvent pour obtenir une meilleure qualité. Un fichier en x264 utilisant la même source sera moins gros et de meilleure qualité qu’un fichier en XviD. D’un côté on a un format qui date de la fin des années 90 (le XviD), de l’autre on a une norme qui s’est développée entre 2003 et 2012 avec en tête des objectifs différents en termes de qualité et un état de l’art sur la recherche bien plus avancé. Il y a malgré tout quelques exceptions notamment dans l’image et l’audio, avec respectivement les formats PNG et FLAC qui sont des compressions sans perte.

Dans les jeux vidéos, tout le monde aura remarqué que parfois, les détails d’un personnage sont « flous ». Pour savoir pourquoi, il faut penser à la façon dont on dessine un personnage à l’écran. On commence par la forme, avec des triangles. Chaque triangle représente donc une surface, sur laquelle on applique une texture. En pratique, la texture est un fichier qui contient différentes informations destinées à refléter un matériau, à l’image d’une texture du monde réel. Elle contient évidemment un dessin, une image, et la texture a la particularité d’être plus ou moins floue en fonction du paramètre de décompression qu’on lui applique. C’est à dire que la qualité de décompression définit le temps que que la carte va passer dessus. Avec les jeux PC qui doivent pouvoir afficher un résultat pas trop dégueu en 4K, on comprend que les jeux pèsent maintenant plus de 60Go.

Alors est-ce que finalement la compression avec perte est devenue la norme ? Fort heureusement non ! (village, envahisseur toussa toussa).

Sans perte

Mais si on peut gagner en place pour un transport ou un stockage, on ne va pas se priver. Certains systèmes de fichiers intègrent de la compression à leur plus bas niveau, c’est à dire que physiquement vos fichiers prennent moins de place que leur taille originale. Est-ce qu’on accepterait qu’à ce moment-là on en perde un bout ? Certainement pas.

À un plus haut niveau, ce type d’algorithme est souvent utilisé pour de l’archivage, un mot qui vous est certainement familier si vous avez croisé des fichiers au format zip, rar, 7z. Contrairement aux algorithmes avec perte qui régissent le monde du multimédia, qui « décompresse » au fur et à mesure, ici il faut reconstituer le fichier entier avant de pouvoir le lire. Dans le cas des archives, ça passe par un fichier temporaire, mais il est des situations surprenantes ou la compression sans perte se fait « à la volée ». Dans les formats de documents ODF (OpenOffice/LibreOffice), et même OOXML (Office 2013 et suivants, les docx, xlsx et autre pptx).

Encore plus invisible et pourtant vital, le Web. Oui oui. Quand vous demandez d’afficher une page, son contenu est du texte brut, et les feuilles de style ainsi que les scripts JavaScript sont aussi du texte brut. Si les images sont déjà compressées et peuvent être servies telles quelles, ce texte peut gagner à être compressé, et c’est ce que font la plupart des serveurs Web pour transmettre des versions compressées à la volée des fichiers en question, les navigateurs décompressant alors lesdits fichiers à la volée également pour vous les afficher. Avec la taille des pages qui augmente en plus de la taille des feuilles de style et des scripts, le gain est réel aussi bien pour les clients qui sont sur des connexions instables (rappel, de plus en plus de gens ne naviguent que sur mobile, une horreur sans nom quand on s’intéresse de près aux réseaux associés), que pour les serveurs qui économisent ainsi une quantité de bande passante non négligeable au regard du trafic qu’ils peuvent drainer. Depuis 2015 Google développe Brotli, un algorithme plus efficace que gzip et deflate qui sont actuellement utilisé, preuve que même ce domaine peut encore être amélioré. Faudrait voir si je peux pas mettre ça en place tiens.

Moins glorieux, car très dégueulasse et pas du tout neutre, sur les réseaux mobiles vous passez souvent par des proxy transparents qui recompressent les images à la volée, j’ai pu le constater de manière violente sur Twitter sur mobile, entre un réseau Wifi classique et le réseau 3G notamment (la 4G ne fait pas exception). En passant par un VPN, le problème disparaît, mais devoir utiliser ce type d’outil en 2017 sur ce genre d’appareil est tout simplement une aberration de plus à mettre sur le compte de la sacro-sainte mobilité.

Un outil puissant, pratique, parfois dangereux

Je ne vais pas m’étendre trop sur le sujet, parce que j’ai déjà évoqué la problématique dans une traduction à propos de la compression associée à du chiffrement. Ceci dit, la dangerosité persiste, si la compression avec pertes peut parfois s’accommoder d’une corruption légère des données, c’est rédhibitoire pour la compression sans perte. Et de nos jours, même avec des techniques modernes pour tenter de garantir l’intégrité physique du stockage, un glitch n’est jamais à exclure et le moindre bit altéré peut vous empêcher de récupérer tout ou partie du contenu d’une archive. C’est d’autant plus vrai que la taille de ladite archive augmente. Et là, pas de miracles, c’est la sauvegarde qui vous sauvera (elle était facile).

Une tendance qui restera

On a beau augmenter les débits des connexion fixes et mobiles, avoir des disques durs plus gros, le fait est qu’on a plus que jamais besoin de compression, parce que tout devient inévitablement plus lourd. Chaque octet gagné multiplié par un nombre d’internautes toujours plus important, ça chiffre. Facebook a bientôt 2 milliards d’utilisateurs (depuis le début de l’écriture de cet article, Zucky a annoncé que c’était fait), un octet de gagné sur une page c’est 2Go qu’il n’a pas à transmettre, multiplié par le nombre de fois qu’il réalise cet exploit, et vous comprenez l’enjeu.

Donc oui, on compresse, décompresse, et dans tous les domaines. C’est incontournable. Et maintenant non seulement vous le savez, mais vous savez aussi pourquoi.

 

La magie des caractères accentués entre Mac et Linux

jeudi 22 février 2018 à 18:30

Ah, UTF-8… Pendant que tout le monde s’écharpe pour savoir quelle est la bonne recette d’hamburger sur l’émoji dédié, les techniciens, eux, doivent se débattre avec des choix étranges et des problèmes de compatibilité. De ceux que la norme Unicode était pourtant censé régler…

J’ai mis un peu de temps à mettre le doigt dessus, et à trouver le fond du problème. Quant à la solution, elle n’était pas forcément entre mes mains mais pas si loin. Mais reprenons depuis le début. Lors de la refonte du site d’un de mes clients, il se plaint que certains liens ne fonctionnent pas une fois le livrable déposé sur le serveur. En particulier, les liens vers des documents PDF qui contiennent des accents semblent contrariants.

Pourtant, sur le serveur, les documents sont là, avec les accents correctement placés et affichés. Je soupçonnais un problème d’encodage (genre ISO-8859-15 et UTF-8, la bataille du siècle dernier), ce n’était pas le cas mais je n’en étais pas loin. A force de recherches, de fouilles empiriques comme je peux en faire parfois, je mets le doigt sur quelque chose : en copiant le nom du fichier depuis ma console SSH pour le saisir dans mon navigateur, je découvre une chose :

Lien de la page du site
http://www.site.com/assets/uploads/120907_Mise_%C3%A0_disposition_des_documents_pr%C3%A9paratoires_AGM_28-09-2012.pdf

Lien créé en copiant le nom du fichier depuis la console SSH
http://www.site.com/assets/uploads/120907_Mise_a%CC%80_disposition_des_documents_pre%CC%81paratoires_AGM_28-09-2012.pdf

Oui, on constate que les caractères accentués n’ont pas la même tête. Pourtant les deux s’affichent de la même façon à nos yeux. Comment est-ce possible ? Malheureusement, j’ai fait cette découverte juste avant de m’absenter pour me faire opérer, et après avoir transmis mes découvertes, nous n’avons pas eu de retour de l’agence. Mes collègues n’ont pas plus trouvé de détails supplémentaires sur les raisons de cet écart, et le dossier est un peu tombé aux oubliettes.

Mais pendant ma convalescence, à la faveur de ma veille habituelle, je lis une remarque sur les joies de l’encodage entre Mac et Linux, sans plus de détails. Pour une fois mon cerveau fait tilt et je repense à mon client. Je repars donc en mode recherche/lectures, pas évident, et pourtant les utilisateurs de Mac partagent souvent leur mésaventures avec leur univers fermé. Mais je finis par trouver quelques pistes.

MacOS le fourbe (enfin pas vraiment, mais ça fait du bien de le dire de temps en temps)

En effet, UTF-8 permet d’encoder les caractères accentués de deux façons différentes : soit un caractère accentué « direct » dit composé — U+00E9 pour être précis si on reprend notre « é »– ou format NFC pour Fully Composed; soit un caractère di décomposé, c’est à dire la lettre de base –U+0065 pour la lettre e–, accompagné d’un caractère dit combinant, dans l’exemple un accent aigu (U+0301), soit le format NFD pour Fully Decomposed. Évidemment il n’est pas recommandé de mixer les deux méthodes. Pour les plus furieux, et en anglais, vous pouvez lire cette page Wikipedia sur l’équivalence Unicode.

C’est MacOS le responsable, qui encode les caractères de manière particulière, et notamment les caractères accentués. Les ingénieurs d’Apple ont fait le choix du supporter le deuxième cas, mais le plus « pénible » n’est pas là. Les deux sont valides et pris en charge notamment par le système de fichiers ext4 sous Linux, et on ne verra pas de différence jusqu’à ce qu’on tombe sur un problème similaire à celui que j’ai rencontré. En fait le vrai problème vient surtout du fait que l’éditeur de code utilisé par le développeur qui s’était occupé de renommer les documents a encodé les liens, et plus généralement les fichiers, au format NFC, quand les fichiers sont proposés au format NFD.

Si c’est supporté, alors on peut corriger

On est sous Linux, on peut pratiquement tout faire, en l’occurrence c’est possible avec rsync :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 <source> <destination>

On peut alors ensuite replacer le contenu converti au bon endroit. Peu après j’ai appris qu’il y avait un utilitaire dédié à cette tâche, qui s’appelle convmv :

convmv -f utf8 -t utf8 --nfc -r --notest <dossier>

Ça va traiter tous les fichiers du dossier indiqué, et on économise une duplication de fichiers. L’avantage d’rsync étant qu’on peut le faire à distance, donc directement depuis la source et non pas une fois le contenu versé à destination.

Une fois n’est pas coutume, je n’ai pas pu essayer

Malgré tout, quand j’ai eu l’occasion de reprendre le dossier, après mon retour, une solution un peu plus simpliste a été trouvée par l’agence de développement sans qu’on soit mis au courant : supprimer les accents sur les liens et fichiers problématiques. Bon ben tant pis, on essaiera de faire plus de bricolage une prochaine fois. Ça m’a toutefois donné l’occasion de vous apprendre un ou deux trucs sur Unicode 🙂

Quelques astuces diverses, onzième

lundi 19 février 2018 à 18:30

J’ai stocké tout ça un peu trop longtemps et il est temps que je partage une nouvelle fournée de bricoles qui vous sauve une journée de boulot, ou un weekend un peu trop accaparé par des soucis ou des maintenances d’infras persos, quand ce n’est pas un dépannage lors d’un PSL 🙂

Coreutils 8.24 et suivants : dd qui cause !

J’ai découvert ça en toute fin d’année, après la finalisation du dernier épisode (et Pierre m’en a reparlé début février quand je suis retourné à la Cité des Sciences). Avec un coreutils récent (Debian Stretch, Ubuntu 16.04, Manjaro/Arch), dd a maintenant un mode verbeux pour dire où il en est, et ça c’est cool :

[seboss666@seboss666-ltp ~/Téléchargements ]$ dd if=manjaro-cinnamon-17.0.6-stable-x86_64.iso of=mcin.iso status=progress
1770226176 bytes (1,8 GB, 1,6 GiB) copied, 14 s, 126 MB/s

Pratique quand on sait que les copies sur clé USB peuvent parfois prendre de longues minutes, surtout avec une clé USB poussive.

Rot13 « quick and dirty » en bash

Lors d’un petit délire sur un challenge de sécurité informatique, l’auteur a trouvé le moyen de s’amuser en ajoutant une petite étape à base de rot13. Quand on est pressé, qu’on a pas forcément le temps de chercher un outil tout fait, y’a moyen de le faire en bash (attention, tr est fourni avec coreutils, merci Exagone313) :

echo 'messagealacon' | tr '[A-Za-z]' '[N-ZA-Mn-za-m]'

Connexion SFTP avec un client OpenSSH récent et proftpd/mod_sftp

Récemment, le prestataire d’un client rencontrait des difficultés pour se connecter en SFTP à la plateforme de ce dernier. Après vérification, et un énième juron quand aux satanés fanatiques des ordinateurs fruités, il s’avère que le souci venait de proftpd qu’on utilise pour proposer justement la connectivité chiffrée. La solution tient à la modification des Digests :

SFTPDigests hmac-md5 hmac-sha1 hmac-sha2-256 hmac-sha2-512 hmac-ripemd160 hmac-sha1-96

Exporter les utilisateurs d’un vieux MySQL pour l’importer dans MySQL 5.7

Situation : on me demande de migrer d’un MySQL 5.5 vers MySQL 5.7. Oracle ne supporte que les upgrades de point à point, donc il me faudrait passer par MySQL 5.6. Pas ouf, et comme les bases de ce serveur de dev ne sont pas compliquées, je veux passer par des dumps bases et users à importer ensuite. Problème, Sur les dernières révisions de MySQL 5.7, la création d’utilisateur avec la syntaxe GRANT ... TO <user> IDENTIFIED BY ... ne fonctionne plus. Petite routine maison pour contourner ce problème :

MYSQL_CONN="-uroot -ppassword"
mysql ${MYSQL_CONN} --skip-column-names -A -e "SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') AS query FROM mysql.user WHERE user NOT IN ('root','pma','phpmyadmin','debian-sys-maint')" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql
sed -i.bak 's/GRANT USAGE ON \*\.\* TO/CREATE USER/g' MySQLUserGrants.sql

Et paf, ça fait des Chocapic.

Tunnel SSH en ligne de commande pour connexion MySQL distante

Pour chiffrer une connexion MySQL (qui est en clair par défaut, il faut le souligner), vous avez deux solutions principalement : mettre en place du TLS au niveau de MySQL, mais c’est pas évident, ou, pour du one shot, un tunnel SSH. Sous linux, rapidement :

ssh -L 3306:127.0.0.1:3306 user@server_with_mysql

Il suffit ensuite de se connecter avec le client mysql en tapant sur son port local :

mysql -h 127.0.0.1 -S 3306 -uuser -p

HTTPS, SNI, et Curl sont dans un bateau…

En procédant à des tests sur la bonne installation d’un certificat X509 sur un vhost dont le domaine ne pointe pas encore sur le serveur en question, plutôt que de bricoler du fichier hosts, j’ai préféré utiliser curl, mais il était récalcitrant avec les paramètres « habituels » :

root@vox:~# curl -Iv -H "Host: blog.seboss666.info" https://127.0.0.1
* Rebuilt URL to: https://127.0.0.1/
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 443 (#0)
(...)
curl: (51) SSL: certificate subject name 'xxxx.mariz.ovh' does not match target host name '127.0.0.1'

Pas grand chose à voir avec mon vhost. En fait, c’est parce que de cette manière, Curl n’envoie pas d’entête SNI pour indiquer le nom qui doit être validé par le certificat, et dans un contexte avec plusieurs vhosts, cet entête permet de chercher à sélectionner le bon certificat en fonction de l’hôte. Curl sait le faire :

root@vox:~# curl -Iv --resolve blog.seboss666.info:443:127.0.0.1 https://blog.seboss666.info
* Added blog.seboss666.info:443:127.0.0.1 to DNS cache
* Rebuilt URL to: https://blog.seboss666.info/
* Hostname was found in DNS cache
* Trying 127.0.0.1...
* Connected to blog.seboss666.info (127.0.0.1) port 443 (#0)
(...)
HTTP/1.1 200 OK

Il ne lui manque que la fonction café en fait à curl…

Une meilleure détection de l’état de santé d’un backend dans haproxy

Contexte : par défaut, les checks basiques d’haproxy ne servent qu’à détecter s’il y a toujours un port en écoute au niveau des serveurs de la ferme. Si vous avez deux serveurs et que l’un des deux est à moitié pété (ça écoute toujours mais l’application ne répond plus), vous avez une réponse sur deux qui n’est pas bonne. Pour optimiser ça, on peut faire un peu mieux au niveau de la configuration :

backend mon-backend
    option httpchk GET /check HTTP/1.1rnHost: www.mondomaine.com
    http-check expect status 200
    default-server inter 3s fall 3 rise 2
    server srv1 10.0.0.1: 80 check
    server srv2 10.0.0.2: 80 check

Au passage on voit aussi comment modifier les intervalles de vérification pour réellement limiter la visibilité du problème et des dégâts que ça pourrait provoquer.

Curl et Docker : tester un service Swarm en local

J’ai eu le tour sur mon propre cluster ainsi que sur les plateformes de tests fournies lors de ma formation par Treeptik. Une fois mon service déployé, j’essaie de le tester avec curl depuis le nœud où il est déployé, mais ça répond pas. En fait, les deux environnements en question sont paramétrés avec une ipv6, mais le service au sein de docker n’écoute qu’en v4, et ça aussi, curl est capable de s’en accommoder :

curl -4 http://127.0.0.1:8080/

Si vous devez tester/forcer en ipv6, utilisez -6, mais dans mon cas ça ne fonctionnait pas.

Terminator en plein écran dès le lancement

C’est un problème récurrent/chiant que j’ai souvent, le gestionnaire de fenêtres n’enregistre pas les positions des fenêtres quand je les ferme, si bien que je dois les repositionner à chaque lancement (il n’ya guère que Thunderbird qui « tient le coup »). Pour ma machine virtuelle Linux du boulot (et maintenant sur ma grosse bertha à la maison), je lance principalement Terminator, et j’aime bien du coup qu’il prenne toute la place. Après quelques errements liés notamment au fait que je ne connais apparemment pas assez l’anglais, j’ai trouvé la solution en modifiant la commande dans le raccourci :

terminator --maximise

Oui, je m’attendais à devoir utiliser --maximize, et apparemment les deux orthographes sont correctes


Et bien que j’attende généralement une dizaine d’astuces avant de publier, ça fait trop longtemps donc tant pis s’il n’y en a que 9. On essaiera de revenir dans les clous au prochain épisode 🙂

Vous connaissez Générations Cobayes ?

dimanche 11 février 2018 à 10:30

Non, ce n’est pas le nom du dernier groupe musical kleenex qui n’existe que pour faire des reprises de chansons dont tout le monde se foutait déjà, mais celui d’une association cherchant à activer les méninges et les pratiques autour d’une réflexion sur la toxicité de nos produits du quotidien. Et comme je sais que ça intéresse certaines/certains d’entre vous, je vais en causer un peu plus.

C’est autour du traditionnel pain au chocolat du lundi matin chez LinkByNet que j’ai réellement découvert l’association et une partie de l’équipe qui la compose (dont une collègue, coucou Anne). J’avais bien vu passer un mail nous expliquant qu’on allait héberger l’association pendant quelques mois (c’est pas la première association qui passe dans nos locaux, je pourrais vous en reparler un jour), mais noyé dans les dossiers du quotidien j’avais pas plus jeté un œil autre que distrait.

Mais que font-ils donc ces gens-là ? Ils communiquent sur la nécessité de s’interroger sur les produits que l’on consomme (alimentaires ou non), et là possibilité du coup de consommer autrement, et surtout meilleur pour notre santé (le terme cobaye renvoyant aux sujets d’expérience, notamment dans la cosmétique où l’usage de singe à été la norme pendant des décennies). Mais sans les excès moralisateurs qu’on peut notamment retrouver chez certaines personnes qui « pensent mieux que vous », avec un angle beaucoup plus détendu et surtout en montrant que consommer plus responsable ne se fait pas nécessairement sans avoir à se priver de tout ni sans se ruiner, un sentiment qui revient souvent à l’esprit de ceux à qui on explique le concept de consommer autrement.

Un positionnement qui se dégage notamment de leur dernière campagne de communication sur les 7 commandements de l’eco-orgasme. Oui oui, même les produits destinés aux plaisirs sexuels de toute nature ne sont pas épargnés notamment par les perturbateurs endocriniens, pour n’évoquer qu’eux, dont les effets néfastes sur la symphonie que représente le fonctionnement du corps humain peuvent aller jusqu’à l’apparition de cancers, de dégradations cérébrales, et autres soucis liés au dérèglement hormonal (contrôle des taux cholestérol et sucres, cycle menstruel…). Classe n’est-ce pas ?

Exemple d’un des commandements : les lubrifiants

Ils sensibilisent aussi sur l’existence de labels (comme le bio, sans l’arnaque légale autour), proposent des animations et ateliers dans divers lieux dont des festivals, mention spéciale aux ateliers DIY, oui, il paraît que vous pouvez fabriquer votre dentifrice vous même (pas que évidemment). Objectif : désacraliser les produits de tous les jours, en partant du principe que si on sait comment les fabriquer, on sait faire plus attention à leur provenance ou leur composition. Le tout en s’amusant, exactement comme dans des fablab et autres repair cafés où vous fabriquez ou réparez vos appareils ménagers et électroniques.

Et il n’y a pas que le consommateur final qui est concerné, les producteurs également sont de la partie, qu’ils soient sensibilisés sur leurs modes de production, ou mis en avant quand ils sont déjà engagés dans la démarche. Sur ce point, l’association vient de monter d’un cran en lançant La Réjouisserie, boutique en ligne/marketplace aspirant à regrouper différents producteurs souvent peu présents dans la grande distribution de par leur volonté de proposer des produits différents et plus respectueux à la fois de l’humain et par extension de la nature (un discours qui ne vibre pas super aux oreilles des industriels de la grande distribution).

Le nom du label parle de lui-même

Alors évidemment vous ne trouverez pas les mêmes produits qu’en magasin, c’est justement la raison de l’existence du bousin, mais vous aurez l’occasion de comparer avec les produits qu’on trouve sur l’application Open Food Facts qui eux proviennent plus souvent de la grande distribution, puisque pour interroger la base de données il suffit de scanner le code barres avec son smartphone, ce qu’on sait faire facilement directement en magasin.

Voilà, je trouvais sympa de prendre le temps d’en parler (les autres billets avancent tellement pas…), si vous voulez en savoir plus y’a une quantité de moyens de les approcher, réseaux sociaux, site Web (y’a les réseaux sociaux en bas de page d’accueil), je vais évidemment leur passer le mot sur ce petit coup de pouce de ma part pour qu’ils répondent si vous utilisez les commentaires juste en dessous.

Sur ce, je vous dis à bientôt, et pour paraphraser Dan Ton Corps, mettez-vous bien et surtout, portez-vous bien 😉 (ben oui c’est un peu le sujet non ?)

Le socle technique actuel du blog

lundi 22 janvier 2018 à 19:00

On m’a demandé récemment par mail des conseils pour améliorer la réactivité d’un blog WordPress, en comparant le mien qui serait bien plus rapide. Je n’ai pas encore de réponses définitives sur le sujet mais je pense utile de partager de manière globale les détails de l’hébergement actuel, histoire de pouvoir comparer proprement. Et quelques pistes pour savoir où trouver ce qui coince.

En effet, la description de l’infrastructure est éclatée entre un nombre beaucoup trop grand de billets éditos et autres pour en tirer quelque chose d’exploitable. On va donc reprendre couche par couche, histoire de savoir de quoi on parle.

Le matériel

Le serveur physique est un minisp32 de 2014 chez OVH localisé à Strasbourg. Il embarque un processeur Intel Xeon E3-1245v2, est accompagné de 32Go de RAM et deux disques de 2To dont la configuration peut varier via le système d’exploitation installé. Il dispose en outre d’une carte ethernet gigabit et l’abonnement d’OVH « garantit » un débit de 500Mbits par seconde. Bref, une bonne machine qui malgré les années qui commencent à s’accumuler nous a rarement fait défaut.

Le logiciel

Plus gros morceau, mais on va tout de même le faire dans l’ordre, du plus loin au plus près du blog.

L’os principal de la machine est Proxmox VE, un hyperviseur pour virtualisation qui repose sur un noyau Linux et donc les technologies lxc (containerisation d’os) et kvm (virtualisation complète). L’installation made in ovh configure les disques durs en raid 1 (miroir) ce qui sécurise un poil les données, même si ça ne remplace pas les sauvegardes.

Qui dit virtualisation dit machines virtuelles, et en l’occurrence on exploite des machines kvm. Celle qui héberge le blog, entre autres, est une machine sous Debian 8 Jessie (stretch en cours de validation). Je lui ai attribué 3vCPU et 6Go de RAM, et le disque est un assemblage avec LVM de deux volumes (petite extension suite à un besoin d’espace).

On parle d’hébergement web, et sans surprise on retrouve le tryptique de base qui est assuré par le serveur web Nginx (dépot dotdeb http2), le langage PHP 7.0 est fourni par dotdeb également (en mode FPM), et MariaDB 10 s’occupe de la base de données. En complément, j’ai ajouté un service Redis histoire de délester un peu la base de données suite aux problèmes de performances de disque certainement du à LVM (les images ne sont pas au même format, entre autres). Je pourrais également stocker les sessions dans Redis si j’étais motivé.

Et donc, le blog est propulsé par WordPress, avec un thème responsive (un seul thème pour couvrir tous les appareils), et quelques plugins pour ajouter quelques fonctionnalités plus ou moins visibles : postage sur les réseaux sociaux, affichage embarqué des images, barre de progression de lecture, vérification des liens cassés…

Comment j’ai amélioré les performances ?

On a déjà un socle qui a du muscle à plein de niveaux, matériels et logiciels. Mais ça ne fait pas tout. Je limite les extensions que j’utilise, et celles que j’utilise sont dans l’ensemble de qualité, pas trop lourdes (une extensions pour une tâche), certaines fonctions ont été intégrées dans le thème, qui a également été choisi pour ne pas être trop lourd. La taille de chaque page est contrôlée pour ne pas être lourde à charger même sur une connexion un peu souffrante (j’ai démarré le blog quand j’habitais encore chez ma mère, donc je fais toujours attention à ça).

J’ai fait quelques réglages sur PHP histoire de bosser comme il faut en mémoire vive (taille confortable pour l’opcache entre autres), pareil pour la base de données, qui a finalement eu le plus de boulot : pools innodb, index supplémentaires, écart sur la conformité CRUD… Et donc Redis, dans lequel WordPress stocke le contenu de plusieurs objets, articles, commentaires, pour éviter de refaire les requêtes en base de données, certaines étant particulièrement peu efficaces et peu optimisables.

Et… C’est à peu près tout, mais faut dire que c’est déjà beaucoup plus que ceux qui font un « apt install nginx php mariadb-server » et qui mettent leur site en ligne 10 minutes plus tard sans plus de configuration.

Pourquoi le site à qui il est comparé peut-il être plus lent ?

Le site en question est hébergé sur un Synology DS1515+. Il est propulsé par un Intel Atom C2538 qu’on aurait aimé avoir dans des laptops plutôt que les bousasses grand public qu’on a subi dans des netbooks pendant des années. Il est accompagné de 16Go de RAM (quand la fiche technique annonce un max supporté de 6Go, mais c’est pas grave), et la grappe de stockage fait 40To et composée de disques à 7200 tours par minute avec 256Mo de cache.

Pas du matos de merde donc, mais en dehors du stockage, on a un CPU bien moins puissant que ma grosse bertha, mais dont la principale particularité est de consommer 4 fois moins. On a rien sans rien. Mais la puissance brute n’est pas seule responsable d’un éventuel écart. Si on se réfère à ce comparatif de CPUBoss, le support d’extensions de jeu d’instructions est inexistant ou presque sur l’Atom, et ça peut avoir des conséquences importantes sur plusieurs points de fonctionnement de PHP (compilation JIT), MariaDB, et du serveur web (s’il y a du HTTPS une partie peut être gérée par le CPU via AES-NI, c’est pas mal même si c’est pas le but premier de l’intégration du jeu d’instructions). Ensuite on parle d’un NAS, et donc, la connexion qui permet d’accéder au site est certainement plus légère que celle que me fournit OVH. En particulier au niveau de l’upload, et là, y’a pas de mystère, c’est pas en France sur des connexions grand public qu’on égalera une connexion d’un datacenter, les rares qui auront droit à du vrai FTTH avec un upload qui soit pas misérable vont se compter en dessous de la dizaine de pourcents (soit au delà de 200Mbps, je sais, mais je pourrais faire un article complet sur les raisons de ce palier qui parait hallucinant).

Et un autre point qui pourrait être finalement plus important que les autres : la version et la configuration des composants. Que ce soit Nginx, PHP, MariaDB (j’ai pas encore profondément mis les mains dans Redis mais j’ai du taf pour sûr), j’ai passé un peu de temps à régler chaque composant, à analyser un peu son comportement, faire des choix par rapport à mon usage. Concernant Nginx, ça tient d’abord aux nombre de processus (workers), et au nombre de connexions absorbables par ceux-ci, plus un mode HTTP2 s’il est exploitable par les navigateurs. Pour PHP, la version 7 est vraiment un coup de fouet par rapport aux précédentes, et le mode de fonctionnement d’FPM, les modules installés, la quantité de mémoire utilisée pour certains d’entre eux a été analysée. Pour MySQL/MariaDB, idem, 10.0 apporte déjà son lot d’améliorations de performances, et l’utilisation intensive de mysqltuner m’a permis de faire pas mal de corrections sur InnoDB pour en tirer le maximum. Enfin, si je n’avais pas les outils de bases comme htop, iftop, iotop, pour analyser en temps réel le comportement de la machine, j’aurais certainement raté quelques éléments.

Car vous pourrez disposer de toute la puissance brute que vous voulez, ça pourra masquer de grosses erreurs de configuration pendant un temps, mais ça ne fera pas de miracles non plus. C’est une sacrée recette de cuisine qu’on a là, et malgré le peu d’ingrédients à y inclure, on est un peu au delà de la méthode couper/foutre.

WordPress est-il le bon outil ?

Beaucoup pensent qu’on peut tout faire avec WordPress, et que c’est pour ça qu’il est utilisé par plus d’un quart des sites web référencés par les moteurs de recherche. J’ai tendance à penser que non, sinon il y aurait encore plus de monde dessus et bien moins de technologies et de moteurs pour construire des applications web dans différents langages. J’ai pu voir du WordPress pour présenter un site vitrine, un blog en tant qu’annexe d’un autre site,  une plateforme de commerce (j’en ai un qui passe en prod fin mars d’ailleurs), un moteur d’API pour une application écrite en Javascript sur une page HTML à part — un usage curieux tant les outils pour construire des API plus légères sont légions et bien documentés. Pire, j’ai vu le backoffice d’un WordPress multisites torturé pour en faire un intranet (hébergé sur AWS d’ailleurs, on notera l’ironie de « l’intra » dans ce cas), ce qui occasionne régulièrement des problèmes de fonctionnement, certaines tâches n’étant pas taillées pour fonctionner en mode web. Un autre tente de construire une sorte de réseau social, mais il est déjà acté que finalement WordPress va devenir trop limitant, aussi bien pour les performances que les fonctionnalités.

Bref pour chacun de ces usages, il y a certainement des outils plus adaptés que WordPress. Dans le cadre de mon contact, après avoir visité le site il n’y a rien à redire dans le rôle qu’il tient, c’est le bon outil bien que d’autres auraient pu tout aussi bien convenir (SPIP, Pluxml…). Le reste peut donc venir d’un ou de plusieurs des éléments que j’ai mentionné plus haut, et je vais donc reprendre le boulot par mail ou un autre canal pour qu’on essaie de tirer la quintessence de son installation. Et vous, vous avez maintenant des billes pour chercher d’où peut venir votre problème. D’ailleurs, j’ai peut-être oublié des choses, auquel cas, juste en dessous il y a un autre outil bien utile et adapté, les commentaires 😉