Admin/Dev

20
Sept.
2020

Installer un serveur web personnel - Partie 2c - Corriger l'ERROR 23 (HY000) sur MariaDB

Publié par sky

Lors de la configuration d'un serveur web via Homebrew sur un MacBook Pro tout juste réinstallé, je me suis heurté à un problème de taille.

Toute l'installation des logiciels s'est passée sans soucis, en suivant mes propres guides (httpd + PHP et MariaDB). Mais dès les premiers accès aux différents sites, les problèmes ont commencé.

La base de données MariaDB ne semble pas répondre comme il faudrait, renvoyant de nombreuses erreurs, et de manière très aléatoires.

En me connectant directement à la base de données, le résultat est le même, MariaDB retourne très fréquemment l'erreur suivante

MariaDB [monsite]> select * from admin_statisticdata;
ERROR 23 (HY000): Out of resources when opening file './monsite/admin_statisticdata.MYD' (Errcode: 24 "Too many open files")

En regardant dans les variables de MariaDB je vois

MariaDB [monsite]> SHOW VARIABLES LIKE 'open_files_limit';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 256   |
+------------------+-------+
1 row in set (0.001 sec)

Une valeur qui me semble un peu faible, notamment en la comparant à celle d'un autre Mac, configuré de la même manière, et fonctionnemant parfaitement bien

MariaDB [(none)]> SHOW VARIABLES LIKE 'open_files_limit';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 32198 |
+------------------+-------+
1 row in set (0.052 sec)

Habituellement, pour corriger le soucis, il suffit d'indiquer une autre valeur dans le fichier configuration de MariaDB

nano /usr/local/etc/my.cnf

Et sous la catégorie mysqld, d'indiquer la valeur souhaitée. Simplement, j'indique la même valeur que sur l'autre Mac

[mysqld]
open_files_limit = 32198

Après redémarrage de MariaDB

brew services restart mariadb

Le résultat n'est pas vraiment celui espéré

MariaDB [(none)]> SHOW VARIABLES LIKE 'open_files_limit';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 256   |
+------------------+-------+
1 row in set (0.001 sec)

Après quelques tests et recherches, je peux enfin mettre le doigt sur le fautif. Le responsable est launchd, le chef d'orchestre de macOS. En effet, parmi tant d'autres limites, il impose un maximum de fichiers ouverts par processus. Pour connaitre la limite imposée par launchd, tapez la commande

launchctl limit maxfiles

Le résultat est

    maxfiles    256            unlimited      

On retrouve une valeur connue pour la limite "soft", tandis que la limite "hard" est illimitée.

Si je me trompe pas, la limite "soft" est celle imposée par processus, tandis que la limite "hard" est la limite pour l'ensemble du système, et donc pour l'ensemble des processus.

Pour définir de nouvelle valeur, il suffit de les indiquer avec les droits administrateurs. J'indique ici une limite soft à 2^15 et une limite hard à 2^21 qui correspond à des valeurs où nous serons tranquilles.

sudo launchctl limit maxfiles 32768 2097152

Pour la limite "soft", c'est légèrement supérieur à ce qui était indiqué sur l'autre Mac. Tandis que pour la limite "hard", il n'est malheureusement pas possible d'indiquer la valeur "unlimited" disponible par défaut. Il est donc nécessaire d'insérer une valeur suffisamment grande pour ne pas être embêté.

Il suffit désormais de redémarrer MariaDB, et de relancer la commande pour obtenir le nouveau résultat, celui espéré

MariaDB [(none)]> SHOW VARIABLES LIKE 'open_files_limit';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 32198 |
+------------------+-------+
1 row in set (0.024 sec)

La limite n'est pas celle indiquée dans launchd mais bien celle indiquée dans la configuration de MariaDB, qui est légèrement plus faible.

Le service MariaDB est désormais pleinement fonctionnel.

Bizarrement, le vieux Mac, issu de mises à jour successives des différentes versions majeures de macOS, ne souffre pas des mêmes symptômes, alors que les valeurs sont identiques. La réinstallation du Mac sous 10.14, "from scratch", semble être la raison de ce comportement singulier, malheureusement, sans pouvoir en déterminer la cause précise et sous-jacente.

Dernier point, et non des moindres. En effet, il est important de savoir que la modification faite dans le terminal est effacée à chaque redémarrage. Pour parer à cela, l'une des solutions est de demander à launchd, notre fautif, de lancer un petit script au démarrage afin de définir la variable comme il faut, à chaque redémarrage.

Comme vu dans cet article, il suffit de créer un petit démon, qui sera lancé au démarrage, avant le chargement de l'application MariaDB.

Voici donc le contenu du fichier à créer

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.skymac.fixMaxFileLimit</string>
    <key>ProgramArguments</key>
    <array>
      <string>launchctl</string>
      <string>limit</string>
      <string>maxfiles</string>
      <string>32768</string>
      <string>2097152</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>

Pour respecter les conventions, je le nomme en utilisant le domaine inversé, comme vu dans l'article sur launchd :

org.skymac.fixMaxFileLimit.plist

Je le place dans le dossier

/Library/LaunchDaemons/

Une fois le fichier copié, il faut définir les permissions sur le fichier :

sudo chown root /Library/LaunchDaemons/org.skymac.fixMaxFileLimit.plist 
sudo chmod 600 /Library/LaunchDaemons/org.skymac.fixMaxFileLimit.plist

Et enfin j'active le démon dans launchd, avec launchctl

sudo launchctl load -w /Library/LaunchDaemons/org.skymac.fixMaxFileLimit.plist

Désormais, il devrait se lancer tout seul, au démarrage, et permettre à MariaDB de fonctionner correctement.

 
Sommaire de la série
 
 
Commentaires
Aucun commentaire pour le moment.

 

Poster un commentaire
En postant sur skymac.org, je m'engage à être courtois et à ce que mon message soit pertinent avec le sujet de l'article.
En outre, j'accepte, sans condition, que mon message soit refusé et supprimé si ces règles ne sont pas appliquées.
Captcha indisponible
Pour valider le formulaire, vous devez confirmer que vous êtes bien une personne. Actuellement, la fonctionnalité est indisponible. Vous devez activer le service ReCaptcha dans le gestionnaire des cookies, et donc consentir à l'utilisation de ses cookies.
Ouvrir le panneau de gestion des cookies
Fermer le panneau
Ce site utilise des cookies pour assurer son bon fonctionnement. Il utilise aussi des cookies issues de services tiers permettant de proposer des fonctionnalités avancées. À tout moment, vous pouvez choisir quels services vous souhaitez activer ou refuser, afin de retirer votre consentement quant à l'utilisation des cookies.
 
Personnalisation des services
Vous êtes libre de choisir quels services vous souhaitez activer. En autorisant ces services tiers, vous acceptez le dépôt et la lecture de cookies et l'utilisation de technologies de suivi nécessaires à leur bon fonctionnement. En retirant votre consentement pour certains de ces services, certaines fonctionnalités du site peuvent ne plus fonctionner.
Navigation du site  En savoir plus
Le site écrit un cookie de session permettant son bon fonctionnement et aidant à la navigation. Il ne peut être désactivé.
Utilisation : 1 cookie, enregistre l'identifiant de la session.
Durée de vie : Le cookie est présent pendant toute la session sur le site. Il devient obsolète après 24 minutes d'inactivité.
Obligatoire
Popup Média
Afficher des vidéos depuis Yoube ou Dailymotion.
ReCaptcha  En savoir plus
Permet de valider que les visiteurs sont bien des humains lorsqu'ils valident des formulaires.
 
Tout accepter Tout refuser Gérer