Problème de performances avec les sites Web / magasins de 1 000 à 10 000


9

J'essaie de trouver un moyen d'améliorer les performances de Magento lorsque le nombre de sites Web / magasins dépasse 1k, et mon objectif est d'environ 10k. Voici quelques questions; tous les conseils / aides sont extrêmement bienvenus!

  1. L'ajout de nouveaux sites Web / magasins est lent;
    Je commente $ this-> cleanModelCache () dans _afterSave () dans Mage_Core_Model_Abstract, et la situation semble meilleure mais ralentit avec l'augmentation du nombre de sites Web / magasins. Et je ne sais pas ce que cela affecterait l'ensemble du système à l'avenir.

  2. Les appels Api deviennent lents.
    L'un des principaux processus consiste à passer commande; mon modèle personnalisé le traite en traitant certaines données, et essentiellement en utilisant le modèle sales / quote et les modèles sales / service_quote. Le processus commence avec Oauth. Oauth et la commande prennent plus de temps lorsque le nombre de sites Web / magasins augmente et que la consommation de mémoire semble plus importante. Est-ce que cela a quelque chose à voir avec le chargement par Mage du fichier XML de configuration et le fait que les données de configuration augmentent avec le nombre croissant de sites Web?

  3. Ouvrir n98-magerun dev: la console prend plus de temps; je n'en connais pas la cause.

  4. L'enregistrement de la configuration à partir du panneau d'administration prend plus de temps; ne sais pas comment l'améliorer.

Est-il possible de reconstruire la façon dont Magento génère et charge les données de configuration pour réduire sa consommation de mémoire? Est-ce l'un des facteurs qui causent des problèmes de performances dans ma situation?

Instance Magento actuelle: Version = Magento EE 1.14.2.4;
Config cache on; autre cache désactivé;
Utilisation de Mysql 5.6 et MongoDB (pour catalog_category_entity, catalog_product_entity, core_website);
nombre de sites Web = nombre de magasins = nombre de vues = 1024;
nombre de produits = 4501;

Merci d'avance à tous!


2
pourquoi le support magento ne peut pas vous aider ???
MagenX

Comment puis-je obtenir de l'aide de leur part? Je suis nouveau dans la communauté .. merci!
Jack.W

1
vous avez la version entreprise, vous ne savez pas où vous l'obtenir, mais s'il n'y a pas de support magento derrière, juste de l'argent et du temps gaspillés. vous devez bien les frapper dans les balles pour les faire courir comme des lapins qui vous aident. quel est l'intérêt d'avoir la version entreprise ???
MagenX

1
mais la réponse évidente à votre question est - des magasins magento séparés avec des bases de données distinctes, comme des lots pour 10-20 magasins ...
MagenX

Ah oui .. je vais demander à mon patron le compte..haha.
Jack.W

Réponses:


3

L'une des raisons pour lesquelles cela devient lent est que la configuration de chaque magasin est dupliquée à partir de / config / website et / config / global et le code pour le faire n'est pas du tout efficace. Tout changement de paramètre peut entraîner plusieurs dizaines de minutes, voire des heures, de performances et de débit réduits. Le rendre plus efficace signifiera essentiellement que Ben Marks vous poursuivra ... et pas dans le bon sens.

SI vous allez suivre cette voie, le plus simple serait d'avoir des installations Magento 10k et d'avoir une sorte de courtier qui délègue les demandes au site Web approprié. Bien que cela dépende, bien sûr, de votre cas d'utilisation réel.

[ajoutée]

Selon le cas d'utilisation, vous pourrez peut-être utiliser des catégories en tant que pseudo magasins. Techniquement, vous pouvez ensuite utiliser la disposition XML pour modifier le thème par magasin. Mais alors vous vous heurteriez à la limitation du paiement. Tous les magasins devraient partager la caisse.

Quoi qu'il en soit, les magasins 10k Magento sont faisables, en ce sens que ce n'est pas impossible. Mais ce sera une route difficile quel que soit le chemin que vous choisirez.


Salut Kevin, merci pour ta réponse! Oui, je vois le code qui met à jour l'arbre de configuration, qui est loadToXml () si je ne me trompe pas. Ma pensée est; et vous avez dit que ce n'était pas une bonne idée de le modifier? Que voulez-vous dire par Ben Marks qui vient après moi? De plus, il semble que chaque requête http qui arrive à Magento finira par charger l'arbre de configuration, est-ce correct? Est-ce que je peux en réduire la taille? Je devrais probablement penser à obtenir des instances 10k Magento ... des réflexions sur la quantité de ressources qui aurait besoin? Merci beaucoup Kevin!
Jack.W

Mais avoir des installations 10k Magento signifie 10k instances mysql non? Je ne sais pas comment faire ça, ou si c'est une bonne idée ..
Jack.W

1
Non, cela signifierait avoir 10k bases de données mysql, mais toutes les 10k d'entre elles pourraient être dans une seule instance mysql.
Christian

1
Le "Ben Marks" qui vient après vous est une référence à ce camo.githubusercontent.com/…
Kevin Schroeder

1
Les installations 10k Magento signifient 10k bases de données MySQL, mais cela serait réparti. Il serait BEAUCOUP plus facile de scripter le déploiement d'installations Magento individuelles 10k que de faire fonctionner le code principal existant avec des magasins 10k.
Kevin Schroeder

1

Vous pouvez essayer de pirater le cœur et d'activer les séparations de cache du site Web. Vous pouvez essayer de pirater la base de données et de stocker des informations de configuration en mémoire. Vous pouvez essayer de remplacer le cache de configuration par quelque chose de plus intelligent - par exemple, mettre en cache les informations des fichiers xml [qui sont statiques et s'appliquent à tous les sites Web et magasins] tout en récupérant dynamiquement les données de remplacement.

Je suis un serveur, donc j'irais avec le nettoyage avec la base de données. Surtout que c'est banal à faire.

Si vous contrôlez votre serveur de base de données: renommez la table core_config_data en core_config_data_offline Créez une nouvelle table core_config_data à l'aide du moteur de stockage MEMORY http://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html Copiez toutes les données de core_config_data_offline vers core_config_data

Configurez un travail cron pour vérifier si core_config_data existe, s'il copie toutes les données de là vers core_config_data_offline. Si ce n'est pas le cas, créez-le et copiez tout de core_config_data_offline vers core_config_data

Désactivez le cache de configuration. Avec le cache de configuration activé, vous obtenez uniquement une amélioration des performances pour la première fois que les données de configuration sont lues dans la base de données - après cela, elles sont dans le cache et vous en souffrez. Sur le plan négatif, les fichiers xml ne sont plus mis en cache, vous avez donc échangé le résultat de performance de la désérialisation d'énormes données de configuration pour le résultat de l'analyse d'un groupe de fichiers xml.

Vous pouvez également essayer de modifier le fichier Mage / Core / Model / Config.php et activer les caches de sites Web individuels. Par défaut, chaque donnée de configuration spécifique au magasin est mise en cache individuellement. Toutes les données de configuration du site Web sont mises en cache dans un seul objet.

Notez que ceci est juste pour les remplacements de configuration [les paramètres d'administration]. Donc, si vous effectuez toutes vos modifications de configuration au niveau du magasin, vous êtes déjà défini. Si vous utilisez «hériter du site Web» et que vous effectuez la plupart des modifications de configuration spécifiques à votre magasin au niveau du site, le cache contient chaque site Web. En le divisant, vous pouvez le répartir beaucoup mieux. protected $ _cacheSections = array ('admin' => 0, 'adminhtml' => 0, 'crontab' => 0, 'install' => 0, 'stores' => 1, 'sites Web' => 0);

à

protected $_cacheSections = array(
    'admin'     => 0,
    'adminhtml' => 0,
    'crontab'   => 0,
    'install'   => 0,
    'stores'    => 1,
    'websites'  => 1
); 

Salut Gary, merci pour cette réponse si utile! J'ai quelques questions: 1) D'après mon observation, la requête de base de données n'est pas un problème, même avec plus de 1 000 sites Web / magasins; si tel est le cas, l'utilisation du stockage en mémoire serait-elle toujours utile? 2) Je ne sais pas si c'est correct, mais le cache de configuration semble stocker uniquement les informations du système et des modules; cela a-t-il quelque chose à voir avec la configuration du site Web / magasin? 3) Existe-t-il un moyen pour magento de reconnaître un identifiant de magasin / site Web spécifique à partir d'une requête http, et donc de charger uniquement le fichier de configuration correspondant? Merci beaucoup Gary!
Jack.W

2
Ces recommandations ne traitent pas du problème que le PO notait. La désactivation du cache de configuration va finalement tuer le système. Cela amènera Magento à charger tous les fichiers de configuration, à les fusionner, puis à fusionner tous / global, puis à fusionner tous / sites Web et à fusionner tout cela dans chaque nœud / stores. Cela se produira pour CHAQUE demande. Avec 10 000 sites, vous pouvez consulter des minutes d'horloge murale par demande .
Kevin Schroeder

Hé Kevin, merci pour la réponse; En fait, je prévois de déplacer la table core_config_data dans la mémoire, d'activer le cache pour la configuration du système et du module, d'empêcher core_config_data d'être fusionné dans l'arborescence de configuration et de créer des fonctions qui lisent cette partie des données directement à partir de la base de données. Qu'est-ce que tu penses?
Jack.W

1
Le problème n'est pas core_config_data. Le problème est que les configurations de magasin sont fusionnées à partir de / sites Web qui sont fusionnés à partir de / global en XML. La base de données sera parfaitement correcte. C'est PHP qui déteste la vie à cause des fusions de configuration. Dans votre débogueur, passez par Mage_Core_Model_Resource_Config :: loadToXml en accordant une attention particulière aux lignes 110 et suivantes
Kevin Schroeder

1
Maintenant, revenons à ma table de mémoire. La mise en cache des données signifie les stocker dans un endroit accessible rapidement. Magento met en cache les données de configuration dans un objet sérialisé php - si vos données de configuration sont énormes, cela signifie que PHP doit désérialiser une énorme quantité de données pour chaque demande. Si vous savez comment utiliser xdebug, profilez certains de vos chargements de pages plus lents et regardez combien de temps est passé à exécuter la fonction unserialize : php.net/manual/en/function.unserialize.php - si c'est énorme [plus de 100 ms ], alors "mettre en cache" la configuration brise votre système.
Gary Mort
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.