Quelles parties de la couche de modèle peuvent être contournées dans l'intérêt de l'optimisation des performances


28

Je constate actuellement que pour une table de base de données avec un schéma très simple (environ 5 champs), il insère de nouveaux enregistrements à un rythme d'un peu moins de ~ 50 insertions / seconde, dans mon environnement de développement local (lecteur SSD) - c'est avec aucun observateur sur le modèle remplissant les tables associées.

En utilisant SQL direct, je constate une nette amélioration - ~ 1800 insertions / seconde. Nous pensons essayer d'optimiser les performances de nos modèles, mais bien sûr, nous ne voulons pas perdre toute la stabilité et la flexibilité que le noyau Magento nous offre.

Je me demande si quelqu'un a déjà emprunté cette voie et s'il existe des gains faciles en termes de composants de la couche modèle qui peuvent être contournés de manière relativement sûre, ce qui augmentera considérablement les performances.

Des choses comme:

  • Résolution de nom de classe
  • avant et après les événements de sauvegarde
  • Dépêches d'événements
  • Transactions
  • etc.

MISE À JOUR: J'ai menti, il y avait en fait quelques requêtes supplémentaires lancées par des observateurs ou des afterSave (), que j'ai vues lorsque j'ai inspecté le journal des requêtes de la base de données. L'analyse comparative d'une entité totalement simple me donne en fait ~ 300 lignes / seconde avec les modèles Magento - seuls les frais généraux MySQL sont des transactions.


1
Avez-vous essayé de réutiliser l'objet modèle pour écrire les données? C'est à dire effacer, setData et puis enregistrez. Cela éviterait les appels à getModel et la surcharge d'instanciation d'objet inhérente à PHP.
davidalger

En outre, je vais deviner que le goulot d'étranglement se trouve ici dans votre CPU et non dans le lecteur ... car tous les fichiers de code nécessaires seront chargés lors du premier passage.
davidalger

Merci, David! Je vais essayer ça aussi. En fait, je pense que nous sommes toujours liés aux E / S par le nombre de requêtes en cours d'exécution. Nous avons environ 20 requêtes en cours d'exécution pour une sauvegarde de modèle donnée - dont certaines doivent être conservées (remplissage des tables associées, SELECT pour vérifier l'existence avant de sauvegarder), et d'autres que nous pouvons probablement supprimer (sauvegardes de session superflues, charge supplémentaire () qui peuvent être évités dans la logique d'application)
kalenjordan

Vous pourriez facilement le découvrir. Montez le répertoire racine complet et la base de données MySQL sur un disque RAM. Mais je doute fortement que les E / S soient un problème dans les équipements de qualité serveur. Vous verrez probablement plus d'avantages en désactivant simplement "Index lors de l'enregistrement".
Ben Lessani - Sonassi

Réponses:


17

Une chose qui peut accélérer l'ensemble du site est de supprimer toutes les références à Varien_Profilervotre site de production. Même si le profileur est désactivé, il vérifie toujours s'il est activé afin que chaque appel à Varien_Profiler::aboutisse à une ifinstruction supplémentaire . Bien sûr, la suppression de tous ces appels se fait au prix de ne plus pouvoir utiliser le profileur. Cependant, cela peut accélérer l'ensemble du site de 5% environ (c'est une expérience subjective, mais il y a BEAUCOUP d'appels vers Varien_ProfilerMagento). J'ai en fait écrit un petit script shell pour commenter automatiquement ces appels dans tous les fichiers et je l'ajouterai à mon message demain lorsque je serai au travail et que mon code sera prêt.

Comme promis maintenant le code pour commenter ces appels:

grep -l "Varien_Profiler" * -R > profiler.txt 
for x in `cat profiler.txt` 
do 
sed -i '/Varien_Profiler/s/^/\/\//' $x
done

Cela devrait être exécuté dans la console Linux à la fois dans l'application / ainsi que dans le dossier lib /. Vous devrez peut-être ajuster manuellement le fichier /lib/Varien/Profiler.php par la suite. Notez également que vous devez tester cela soigneusement dans un environnement sûr avant de le prendre en direct - mais je suppose que cela devrait être évident;)


Hou la la! Je n'aurais jamais imaginé quoi que ce soit même proche de 5% juste pour les appels Varien_Profiler lorsqu'il est désactivé. Je vais vérifier cela, merci!
kalenjordan

@sparcksoft Comme promis, j'ai ajouté le code maintenant.
mpaepper

1
C'est là que les conditions du précompilateur C sont vraiment sympas. Il est dommage que PHP ne les ait pas, mais bien sûr, cela signifierait qu'il devrait avoir sa propre méthode de précompilation et de mise en cache intégrée. :)
davidalger

2
Vous pouvez également l'écrire find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;si vous préférez un oneliner rapide.
kojiro

14

Lors de l'exécution de nombreuses sauvegardes sur les modèles Magento, il est préférable de désactiver l'indexeur Magento qui ralentit le processus:

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

Et l'activer lorsque vous avez terminé:

$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');

Ah gotcha, sympa. Donc, ce serait comme si vous sauvegardiez beaucoup d'enregistrements customer_entity et que vous vouliez éviter que l'indexation des clients ne se produise pour chaque sauvegarde? Dans mon cas, je fais cela contre une entité personnalisée qui n'a pas d'indexation - enfin du moins pour le benchmark que j'ai fait. Nous avons également des index personnalisés sur lesquels j'utiliserai probablement cette astuce!
kalenjordan

Je ne pense pas qu'il y ait d'indexation client, mais cela vous aidera à coup sûr lors de la modification de nombreux produits et autres. Quoi qu'il en soit, cela vaut la peine d'essayer!
Rick Kuipers

Désolé, oui les données sur les produits EAV et autres par exemple. Merci.
kalenjordan

Hey! Vous devrez peut-être (partiellement) réindexer après cela?
Alex

@Alex Oui, les indexeurs sont réinitialisés à MODE_REAL_TIME, il sera donc réindexé par programme. Vous pouvez bien sûr le forcer si vous le souhaitez.
Rick Kuipers
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.