Problema di prestazioni con siti Web / negozi da 1k a 10k


9

Sto cercando di trovare un modo per migliorare le prestazioni di Magento quando la quantità di siti Web / negozi supera 1k e il mio obiettivo è di circa 10k. Ecco alcune domande; eventuali suggerimenti / aiuti sono i benvenuti!

  1. L'aggiunta di nuovi siti Web / negozi è lenta;
    Commento $ this-> cleanModelCache () in _afterSave () in Mage_Core_Model_Abstract, e la situazione sembra migliore ma sta rallentando con l'aumentare del numero di siti Web / negozi. E non so cosa influenzerebbe l'intero sistema in futuro.

  2. Le chiamate Api diventano lente.
    Uno dei processi principali è quello di effettuare l'ordine; il mio modello personalizzato si occupa di esso elaborando alcuni dati e essenzialmente utilizzando il modello vendite / preventivo e i modelli vendite / servizio_quota. Il processo inizia con Oauth. Sia Oauth che l'ordine richiedono più tempo quando il numero di siti Web / negozi aumenta e il consumo di memoria sembra maggiore. Ciò ha a che fare con Mage che carica il file di configurazione xml e il fatto che i dati di configurazione aumentano con l'aumentare del numero di siti Web?

  3. Aprire n98-magerun dev: la console impiega più tempo; non ne conosco la causa.

  4. Il salvataggio della configurazione dal pannello di amministrazione richiede più tempo; non so come migliorarlo.

È possibile ricostruire il modo in cui Magento genera e carica i dati di configurazione per ridurre il consumo di memoria? Questo è uno dei fattori che causano problemi di prestazioni per la mia situazione?

Istanza attuale di Magento: Versione = Magento EE 1.14.2.4;
Config cache on; altra cache disattivata;
Utilizzando Mysql 5.6 e MongoDB (per catalog_category_entity, catalog_product_entity, core_website);
numero di siti web = numero di negozi = numero di visualizzazioni = 1024;
numero di prodotto = 4501;

Grazie a tutti in anticipo!


2
perché il supporto magento non può aiutarti ???
MagenX,

Come posso ottenere aiuto da loro? Sono nuovo nella comunità .. grazie!
Jack,

1
hai una versione enterprise, non sei sicuro di dove la trovi, ma se non c'è supporto magento dietro, perdi tempo e denaro. devi colpirli bene nelle palle per farli correre come conigli che ti aiutano. che senso ha avere la versione enterprise ???
MagenX,

1
ma la risposta ovvia alla tua domanda è: negozi magento separati con database separati, come lotti per 10-20 negozi ...
MagenX,

Ah giusto .. Chiederò al mio capo l'account..haha.
Jack,

Risposte:


3

Uno dei motivi per cui diventa lento è perché la configurazione per ogni negozio è duplicata da / config / siti Web e / config / global e il codice per farlo non è affatto efficiente. Qualsiasi modifica alle impostazioni può finire per causare diversi 10 minuti, se non ore, di prestazioni e throughput ridotti. Renderlo più efficiente significherà fondamentalmente che Ben Marks ti seguirà ... e non in senso positivo.

Se hai intenzione di seguire questa strada, il modo più semplice sarebbe avere installazioni Magento 10k e avere una sorta di broker che delega le richieste al sito Web appropriato. Sebbene, ovviamente, dipenderà dal tuo caso d'uso reale.

[Aggiunto]

A seconda del caso d'uso, potresti essere in grado di utilizzare le categorie come pseudo negozi. Tecnicamente, è possibile utilizzare il layout XML per modificare il tema per negozio. Ma poi ti imbatteresti nella limitazione del checkout. Tutti i negozi dovrebbero condividere la cassa.

In entrambi i casi, i negozi Magento 10k sono fattibili, in quanto non è impossibile. Ma sarà una strada difficile qualunque sia il percorso che scegli.


Ciao Kevin, grazie per la tua risposta! Sì, vedo il codice che aggiorna l'albero di configurazione, che è loadToXml () se non sbaglio. Il mio pensiero è; e hai detto che non è una buona idea modificarlo? Cosa intendi con Ben Marks che mi segue? Inoltre, sembra che ogni richiesta http che arriva a Magento alla fine caricherà l'albero di configurazione, è corretto? In che modo posso ridurne le dimensioni? Probabilmente dovrei pensare di ottenere 10k istanze di Magento ... qualche idea su quante risorse sarebbero necessarie? Grazie mille Kevin!
Jack.

Ma avere installazioni 10k Magento significa 10k istanze mysql giusto? Non ho idea di come farlo, o se è una buona idea ..
Jack.W,

1
No, significherebbe avere 10k database mysql, ma tutti e 10k potrebbero essere in una singola istanza mysql.
Christian,

1
Il "Ben Marks" che viene dopo di te è un riferimento a questo camo.githubusercontent.com/…
Kevin Schroeder,

1
Le installazioni di 10k Magento significano 10k database MySQL, tuttavia sarebbero distribuiti. Sarebbe MOLTO più semplice eseguire lo script per distribuire 10k singole installazioni di Magento piuttosto che far funzionare il codice core esistente con negozi 10k.
Kevin Schroeder,

1

Puoi provare a hackerare il core e abilitare le suddivisioni della cache del sito Web. Puoi provare a hackerare il database e archiviare le informazioni di configurazione in memoria. Puoi provare a sostituire la cache di configurazione con qualcosa di più intelligente: ad esempio, memorizza nella cache le informazioni dai file xml [che sono statici e si applicano a tutti i siti Web e negozi] durante il recupero dinamico dei dati di sostituzione.

Sono un ragazzo server, quindi andrei con il muck con il database. Soprattutto perché è banale da fare.

Se hai il controllo sul tuo server di database: rinomina la tabella core_config_data in core_config_data_offline Crea una nuova tabella core_config_data usando il motore di archiviazione MEMORY http://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html Copia tutti i dati da core_config_data_offline a core_config_data

Imposta un cron job per verificare se esiste core_config_data, se copia tutti i dati da lì a core_config_data_offline. In caso contrario, crearlo e copiare tutto da core_config_data_offline a core_config_data

Disattiva la cache di configurazione. Con la cache di configurazione attivata, si ottiene un incremento delle prestazioni solo per la prima volta che i dati di configurazione vengono letti dal database, dopodiché si trovano nella cache e si risente. Al rovescio della medaglia, i file XML non vengono più memorizzati nella cache, quindi è stato scambiato l'hit di prestazioni della serializzazione di enormi dati di configurazione con l'hit di prestazioni dell'analisi di un mucchio di file xml.

Potresti anche voler sperimentare la modifica del file Mage / Core / Model / Config.php e abilitare le cache dei singoli siti Web. Per impostazione predefinita, ciascun dato di configurazione specifico del negozio viene memorizzato nella cache singolarmente. Tutti i dati di configurazione del sito Web vengono memorizzati nella cache in un oggetto.

Si noti che questo è solo per le sostituzioni di configurazione [le impostazioni dell'amministratore]. Quindi, se fai tutte le modifiche alla configurazione a livello di negozio, sei già impostato. Se utilizzi "eredita dal sito Web" e apporti la maggior parte delle modifiche alla configurazione del tuo negozio a livello di sito, la cache contiene tutti i siti Web. Dividendolo, puoi spezzarlo molto meglio. protetto $ _cacheSections = array ('admin' => 0, 'adminhtml' => 0, 'crontab' => 0, 'install' => 0, 'stores' => 1, 'website' => 0);

per

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

Ciao Gary, grazie per la risposta così utile! Ho alcune domande: 1) Dalla mia osservazione, la query del database non è un problema, anche con oltre 1k siti web / negozi; quindi, in tal caso, l'utilizzo dell'archiviazione di memoria sarebbe comunque utile? 2) Non so se sia corretto, ma la configurazione della cache sembra memorizzare solo le informazioni sul sistema e sui moduli; quindi ha qualcosa a che fare con la configurazione del sito web / negozio? 3) Esiste un modo per magento di riconoscere un ID negozio / sito Web specifico da una richiesta http e quindi caricare solo il file di configurazione corrispondente? Grazie mille Gary!
Jack,

2
Queste raccomandazioni non risolvono il problema rilevato dall'OP. La disattivazione della cache di configurazione alla fine ucciderà il sistema. Farà sì che Magento carichi tutti i file di configurazione, li unisca, quindi unisca tutti / global, quindi unisca tutti / siti Web e quindi unisca tutto ciò in ciascun nodo / store. Ciò accadrà per OGNI richiesta. Con 10k siti potresti guardare i minuti dell'orologio a muro per richiesta .
Kevin Schroeder,

Ehi Kevin, grazie per la risposta; In realtà sto programmando di spostare la tabella core_config_data nella memoria, abilitare la cache per la configurazione del sistema e del modulo, interrompere l'unione di core_config_data dall'albero di configurazione e creare funzioni che leggono questa parte dei dati direttamente dal database. Cosa ne pensi?
Jack,

1
Il problema non è core_config_data. Il problema è che le configurazioni dei negozi sono unite da / siti Web che sono uniti da / global in XML. Il database andrà perfettamente bene. È PHP che odia la vita a causa delle fusioni della configurazione. Nel tuo debugger passi attraverso Mage_Core_Model_Resource_Config :: loadToXml prestando particolare attenzione alle righe 110 e seguenti
Kevin Schroeder,

1
Ora per tornare al mio tavolo di memoria. La memorizzazione nella cache dei dati significa archiviarli in un luogo a cui è possibile accedere rapidamente. Magento memorizza nella cache i dati di configurazione in un oggetto serializzato php - se i tuoi dati di configurazione sono enormi, significa che PHP deve deserializzare una grande quantità di dati per ogni richiesta. Se sai come usare xdebug, profila alcuni dei tuoi caricamenti di pagina più lenti e osserva quanto tempo viene impiegato per eseguire la funzione di serializzazione: php.net/manual/en/function.unserialize.php - se è enorme [oltre 100ms], allora "cache" la configurazione sta rompendo il sistema.
Gary Mort,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.