En bon administrateur, ce que j'aime c'est qu'un service fourni fonctionne. Et ce que j'aime plus encore, c'est que le service fourni fonctionne de manière performante.

Mon VPS n'est pas le plus performant du monde, mais il a au moins le bénéfice de ne pas me coûter cher et de suffire en terme de besoin, pour moi comme pour les gens qui ont accès aux services qui tournent dessus.

Et j'ai commencé à bien le charger, ce serveur. J'ai un certain nombre de choses qui tournent dessus, et tout tourne plutôt bien, vis à vis des capacités de mon p'tit VPS.

"Tout" tourne plutôt bien? Non. Un irréductible petit service (pas Gaulois) résiste encore et toujours à la présence de la performance : NextCloud.

Les performances, depuis quelques temps, étaient tout simplement à la ramasse : entre 30 secondes et 1 minute de chargement pour passer la page de connexion. J'ai pensé d'abord à des problèmes venant d'Apache2, le serveur web qui fournit l'accès à NextCloud. J'ai donc monté à côté de ça un petit Nginx en me disant que le souci serait réglé... une fois le tout configuré correctement... mais non, les soucis étaient toujours présents.

J'ai donc installé l'excellent outil Glances qui permet d'avoir une vue sur les différentes valeurs de l'ensemble des process en cours, mais aussi de l'état de santé du serveur, avec des warnings sur des évenements en cours... et là j'ai vu l'origine du problème : Mysqld me faisait des séries de CPU_IOWAIT à ne plus en finir.

Screenshot_20210603_121005

Le CPU_IOWAIT est (comme son nom l'indique à moitié) un avertissement comme quoi le processeur est dans l'attente qu'un entrée / sortie se termine. Quand à ce qu'il attend, il m'aura fallu utiliser atop pour comprendre que mysql mettait le disque dur sur les rotules, et causait donc des énormes latences d'écriture.

Après avoir essayé de modifier la configuration de Mysql, de changer comme je pouvais les paramètres d'InnoDB (sans succès), j'ai décidé de miser plutôt sur Postgresql pour gérer NextCloud.

Je me suis donc connecté en tant que l'utilisateur postgres :

sudo su - postgres

Puis j'ai lancé psql pour gérer ma bdd :

psql

J'ai créé ensuite un utilisateur, une base de données et j'ai fourni les droits à cet utilisateur sur cette base de données. Comme mon instance NextCloud existait déjà, j'ai repris les informations qui étaient dans /var/www/nextcloud/config/config.php (ajustez le chemin pour votre répertoire NextCloud) pour les réappliquer dans postgresql :

CREATE USER nextclouduser WITH PASSWORD 'motdepassedelabasededonnées';
CREATE DATABASE nextclouddatabase TEMPLATE template0 ENCODING 'UNICODE';
ALTER DATABASE nextclouddatabase OWNER TO nextclouduser;
GRANT ALL PRIVILEGES ON DATABASE nextclouddatabase TO nextclouduser;

Une fois le tout créé, j'ai installé le module php-postgres qui est nécessaire pour que php puisse manipuler les bases :

sudo apt install -y php-pgsql

Et une fois installé, je l'ai activé :

sudo phpenmod pgsql

Je me suis ensuite placé dans le répertoire de config nextcloud et j'ai recopié le fichier de conf "au cas où" :

cd /var/www/nextcloud/config/
sudo cp config.php config.php.old

Une fois fait, j'ai lancé la commande de migration :

sudo -u www-data php /var/www/nextcloud/occ db:convert-type --all-apps --password "motdepassededb" pgsql nextclouduser localhost nextclouddatabase

Et c'était tout bon! Ou pas!

Message d'erreur : "Only strings, Literals and Parameters are allowed"

Une rapide recherche montre qu'une modification du fichier php QuoteHelper.php est à faire pour corriger un bug non résolu encore dans les dernieres releases afin de rajouter quelques lignes et remplacer :

        public function quoteColumnName($string) {
                if ($string instanceof IParameter || $string instanceof ILiteral || $string instanceof IQueryFunction) {
                        return (string) $string;
                }

                if ($string === null || $string === 'null' || $string === '*') {
                        return $string;
                }

par

        public function quoteColumnName($string) {
                if ($string instanceof IParameter || $string instanceof ILiteral || $string instanceof IQueryFunction) {
                        return (string) $string;
                }

                if ($string instanceof \Doctrine\DBAL\Schema\Column) {
                    return $string->getName();
                }

                if ($string === null || $string === 'null' || $string === '*') {
                        return $string;
                }

Une fois fait, j'ai relancé la commande. Nextcloud m'a prévenu que certaines applications n'allaient pas pouvoir être migrées, ce qui n'était pas en soi dramatique étant donné que je ne conservais pas les applications concernées (PhoneSync par exemple). J'ai accepté cette "perte", la migration s'est lancée et j'ai attendu, attendu (insérez ici Joe Dassin et dites "Zaï zaï zaï" au moment opportun) ...

Et une fois terminé, mon fichier de configuration était automatiquement changé. J'ai pu donc redémarrer mon serveur apache (dans le doute) et le temps de connexion est passé de 30/60 secondes à ... 5 à 10 secondes.

Autant dire que je ne regrette pas le changement :D

Ajouter un commentaire

Article précédent Article suivant