Installer un serveur web personnel - Partie 2c - Corriger l'ERROR 23 (HY000) sur MariaDB
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.
- Installer un serveur web personnel - Partie 1 - Installation standard de macOS
- Installer un serveur web personnel - Partie 2 - Installation de MariaDB via Homebrew
- Installer un serveur web personnel - Partie 2b - Configurer une socket entre MariaDB et PHP
- Installer un serveur web personnel - Partie 3 - Installation d'Apache et de PHP via Homebrew
- Installer un serveur web personnel - Partie 2c - Corriger l'ERROR 23 (HY000) sur MariaDB
- Installer un serveur web personnel - Partie 3b - Configuration des vhosts sur Apache httpd via Homebrew