Mergebot est maintenant 1200% plus rapide: optimisé & # 39; Application laraver avec blackfire
Ob dans le répertoire application \/ job de l’application laraver. Habituellement, pour ce faire, vous devez configurer l’opérateur de file d’attente, envoyer la tâche, puis attendre que l’auditeur de file d’attente ramasse et exécute la tâche. Cependant, ce processus ne nous aide pas beaucoup dans l’analyse du Code qui s’exécute lorsque le travail est exécuté. Au lieu de cela, j’aime créer une commande artisanale spécifique pour exécuter le travail afin que vous puissiez l’exécuter avec le CLI. Continuons à créer la commande:
Php artisan make: Command execute ummyjob ceci crée la classe execute ummyjob dans le répertoire app \/ console \/ commands. Nous devons apporter deux changements à cette classe. Tout d’abord, signez correctement la commande: Protected $signature = ‘application: Perform Virtual Jobs’; Deuxièmement, nous devons exécuter la méthode de gestion de la classe dummyjob (ce que font habituellement les travailleurs de file d’attente): en utilisant app \ \ Jobs \ \ dummyjob; \/ * * Exécutez les commandes de la console. Renvoie une poignée de fonction publique * \/ mixte () {$job = new dummyjob (); $Job – > Handle ();} Enfin, n’oubliez pas d’ajouter nos nouvelles commandes aux classes du noyau. Php, afin que nous puissions l’exécuter:
Commandes artisanales fournies par l’application. Var Array * \/ Protected $commands = [ \ app \ console \ commands \ executedummyjob:: class,]; Maintenant, si nous exécutons PHP artisan app: Execute Dummy job, nous copions essentiellement ce que l’auditeur de file d’attente va exécuter, sauf que nous pouvons maintenant l’analyser en utilisant blackfire CLI: blackfire Run PHP artisan app: Execute Dummy job pour expliquer les résultats de blackfire dans cette section, et je vais en fait regarder Un exemple réel de mergebot, Cependant, si vous avez votre propre travail, ou si vous avez simplement configuré dummyjob et ajouté du Code au profil, vous pouvez l’utiliser comme base pour analyser les résultats. Voici les résultats de distribution pour 60 requêtes en cours d’exécution sur V
Robot de fusion ecchio Codice:
Avant de passer à ces résultats, je vous recommande de lire d’abord le document d’analyse sommaire de blackfire. Cela devrait vous donner une bonne idée du fonctionnement de la page des résultats blackfire. Ensuite, vous devriez noter la principale mesure des résultats de ce profil: il faut 2 minutes et 10 secondes pour fonctionner avec 22,1 Mo de mémoire. Ce seront les principaux indicateurs de rendement que nous tenterons de réduire.
Dans ce cas, les deux hotpaths conduisent à fget (Read from cache) et pdostatement:: execute (perform Database query). Cela ne nous dit pas grand – chose en soi. Cependant, Notez la fréquence des appels à ces méthodes. Les lecteurs de cache (fgets) ont appelé plus de 58 000 fois et exécuté plus de 8 500 requêtes de base de données, toutes pour une distribution de 60 requêtes! Pas étonnant qu’on ait des problèmes de performance. Revenons au diagramme d’appel et voyons si nous pouvons déterminer où le problème s’est produit. Ah, maintenant nous pouvons voir où il y a un goulot d’étranglement de performance évident. La méthode idrelationstodifferentinobject a été nommée 2790 fois, principalement par les méthodes getfirstupdatedata et updatevaluewithplaceholder. Cela signifie que ces méthodes peuvent appeler idrelatistodifferentitioobject dans une boucle qui se produit beaucoup plus souvent que prévu.
Nous venons de trouver l’emplacement des goulets d’étranglement de performance que nous pouvons commencer à refaire.
Ce processus peut être répété autant de fois que vous le souhaitez jusqu’à ce que vous soyez satisfait de la performance de votre code. Blackfire a également une fonctionnalité intéressante qui vous permet de comparer les profils pour voir les améliorations de performance. Comparons ce profil au nouveau Code de procédure de distribution réécrit que j’ai écrit pour mergebot. La première chose à noter est l’amélioration des performances des principaux paramètres de temps et de mémoire: Super Scott! Ce code a un temps d’exécution de 8% (1200% plus rapide qu’auparavant) et prend moins de la moitié de la mémoire. Maintenant, 60 requêtes réparties de la même façon ne prennent que 10 secondes. Pas mal. Jetons un coup d’oeil au chemin populaire vers le nouveau Code. Les chemins chauds provoquent toujours le même type d’événements (lecture et exécution des requêtes de base de données à partir du cache). Cependant, Notez que nous appelons ces méthodes beaucoup moins souvent qu’auparavant. Le nombre d’appels à pdostatement:: Execute est passé de 8700 à 674. Limiter les requêtes aux bases de données est un moyen efficace d’améliorer les performances. Si nous revenons au diagramme d’appel, regardons ce qui se passe avec l’appel à la méthode. Le nombre d’appels à la méthode idrelationstodifferentinobject est passé de 2790 à 940. C’est une bonne amélioration en soi, mais elle a aussi une incidence sur le nombre d’appels à n’importe quelle méthode dans la méthode idrelatistodifferentitioobject. Si nous regardons cela dans le Graphique comparatif, nous pouvons voir comment cela affecte le temps d’exécution. L’amélioration des performances de votre application vous permet maintenant de configurer blackfire sur une installation laraver et de créer des profils pour comparer votre code. Le processus que nous utilisons pour créer des commandes artisanales pour chaque en – tête
En théorie, les tâches en file d’attente sur le CLI peuvent être utilisées pour tester n’importe quelle partie du Code qui pourrait nécessiter un profilage. Dans l’exemple mergebot, la principale raison du goulot d’étranglement de performance est d’appeler le Code sur une période beaucoup plus longue que prévu. Cela a en fait entraîné des problèmes de rendement exponentiels qui ont complètement perturbé les déploiements à grande échelle. Une façon simple de résoudre ce type de problème de performance est de reconstruire le Code pour réduire la fréquence des appels aux méthodes. Cependant, il existe plusieurs types de problèmes qui peuvent ralentir l’exécution du Code et chaque projet doit résoudre ses propres problèmes de rendement uniques. Quelles sont les perspectives de mergebot? Au cours des prochaines semaines, nous espérons lancer une autre fonctionnalité souvent nécessaire: le support multisite. Avez – vous déjà analysé votre code avec blackfire? Avez – vous des suggestions pour optimiser le Code laraver \/ php? Quels problèmes de performance avez – vous rencontrés dans le passé? Veuillez nous le dire dans vos commentaires. Si vous souhaitez obtenir le premier Dib pour le prochain tour de mergebot, assurez – vous de vous inscrire ici. Mise à jour: Si vous souhaitez tester plus avant les tâches en file d’attente, vous pourriez être intéressé par un nouveau projet que je viens de publier. Sqsd est une copie du démon AWS Elastic Beanstalk Worker SQS (sqsd) qui teste la façon dont l’application gère les tâches en file d’attente en mode AWS.