J'ai loué un serveur rackspace pour exécuter mes projets personnels. Depuis que je suis bon marché, il a 256 Mo de RAM et honnêtement ne peut pas gérer beaucoup. De temps en temps, quand il y a une forte augmentation du trafic, le serveur décide de commencer à tuer les processus et il semble que mysqld est un outil populaire pour tuer. J'essaie de visiter mon site et je suis accueilli avec le message qu'il y a eu une erreur lors de l'établissement de la connexion à la base de données. L'inspection des journaux révèle que mysqld a été tué en raison d'un manque de mémoire.
Étant donné que je suis toujours aussi pauvre qu'hier et que je ne souhaite pas mettre à niveau la RAM de ma machine virtuelle rackspace, est-il possible de lui demander de redémarrer automatiquement mysqld après sa mort?
J'ai l'idée d'utiliser quelque chose comme crontab, mais hélas, je ne sais pas exactement quoi faire là-bas non plus. Je suppose que je suis un produit de la génération "Linux sur votre bureau" car je peux faire la plupart des choses sur mon ordinateur de bureau et mon ordinateur portable (qui fonctionnent presque exclusivement sous Linux), mais il me manque encore beaucoup de compétences en administration de serveur pour Linux.
Le serveur exécute CentOS 6.3
Ce n'est pas une solution propre, il serait évidemment préférable d'éviter le problème en premier lieu. Quoi qu'il en soit, je ne sais pas comment CentOS gère les services, mais je pense qu’il utilise service
. Si tel est le cas, vous pouvez vérifier si le service mysql
fonctionne avec
/sbin/service mysql status
Cette commande se ferme correctement si mysql
est en cours d'exécution et renvoie un statut de sortie différent de 0 si i ne l'est pas. Vous pouvez donc démarrer le service s'il ne s'exécute pas avec cette commande:
/sbin/service mysql status || service mysql start
Vous pouvez ajouter cette ligne à /etc/crontab
pour lancer cette commande toutes les minutes:
* * * * * /sbin/service mysql status || service mysql start
C'est un peu dérangeant.
mysqld est toujours redémarré par mysqld_safe car il y a une boucle infinie au bas de mysqld_safe
pour vérifier les arrêts anormaux. Si l'erreur est trop grave, même mysqld_safe
ne pourrait pas redémarrer mysqld
lors des tentatives suivantes.
Etant donné cette situation pour laquelle mysqld_safe
est conçu, il ne serait peut-être pas judicieux de forcer mysqld
à démarrer si mysqld_safe
le rejetera de toute façon.
Vous devez localiser le journal des erreurs dans my.cnf.
[mysqld]
log-error=log-filename
ou
[mysqld_safe]
log-error=log-filename
Lisez le fichier texte (probablement en exécutant tail -30 log-filename
) et recherchez la source du traitement de mysqld en cours de fermeture.
Dans une tentative de force brutale pour que les choses restent opérationnelles sur un VPS à faible mémoire, j'ai utilisé une modification de answer de terdom pour vérifier et redémarrer MySQL.
/sbin/service mysqld status || service mysqld restart
Je devais changer mysql
en mysqld
pour que cela fonctionne. Sans cela, j'obtiendrais l'erreur "ERROR! MySQL is running but PID file could not be found
".
Sur mon système CentOS 7.2, /sbin/service
redirige vers /bin/systemctl status
. La commande suivante est donc plus rapide à exécuter.
/bin/systemctl status mysqld.service || /bin/systemctl start mysqld.service
J'ai fini par ajouter la ligne suivante à la crontab racine du système. Il vérifie toutes les minutes si MySQL est en cours d'exécution et redirige stdout vers null. Le démarrage du service ne produira rien à moins que quelque chose ne va pas, il n'est donc pas nécessaire d'ajouter la redirection null sur la dernière commande.
* * * * * /bin/systemctl status mysqld.service > /dev/null || /bin/systemctl start mysqld.service
Le double tuyau ||
signifie OR
et exécutera la 2e commande si la première commande échoue. (Retourne un code de sortie supérieur à zéro.)
C'est comme dire: "Exécutez la 1ère commande, ou , si la 1ère commande échoue d'une manière ou d'une autre, exécutez la 2ème commande".
Ceci est différent du double perluète &&
qui revient à dire "Exécutez la 1ère commande, et , uniquement si la 1ère commande a réussi, exécutez la 2ème commande ".
Ce qui suit provient de jonnyreeves.co.uk :
Et le coupable est php-fpm! Un rapide Google a trouvé un autre client Wordpress souffrant de symptômes similaires; le conseil était de modifier la configuration du pool php-fpm (/etc/php-fpm.d/www.conf) et de modifier la configuration de pm. Le principal changement consistait à passer de pm = dynamic
à pm = ondemand
avec une valeur de pm.max_children
de 5
(basée sur l'observation d'environ 5% d'utilisation de la mémoire par travailleur). Après avoir modifié la configuration, j'ai redémarré tous les services et vérifié l'utilisation de la mémoire.
service php-fpm restart
service nginx restart
service mariadb restart
Après le redémarrage, la mémoire utilisée a été considérablement réduite.