Quali parti del livello del modello possono essere ignorate nell'interesse dell'ottimizzazione delle prestazioni


28

Attualmente sto vedendo che per una tabella di database con uno schema molto semplice (circa 5 campi), sta inserendo nuovi record con una frequenza di poco meno di ~ 50 inserimenti / secondo, nel mio ambiente di sviluppo locale (unità SSD) - questo è con nessun osservatore sul modello che popola le tabelle associate.

Usando SQL diretto sto vedendo un bel miglioramento - ~ 1800 inserti / secondo. Stiamo pensando di tentare di ottimizzare le prestazioni dei nostri modelli, ma ovviamente non vogliamo perdere tutta la bella stabilità e flessibilità che il core Magento ci offre.

Mi chiedo se qualcuno abbia già percorso questa strada in precedenza e se ci siano alcune vittorie facili in termini di componenti del layer del modello che possono essere bypassati in modo relativamente sicuro e che daranno significativi miglioramenti delle prestazioni.

Cose come:

  • Risoluzione del nome della classe
  • prima e dopo il salvataggio degli eventi
  • Spedizioni di eventi
  • Le transazioni
  • eccetera.

AGGIORNAMENTO: Ho mentito, in realtà c'erano alcune query aggiuntive attivate da osservatori o afterSave (), che ho visto quando ho ispezionato il registro delle query del database. Il benchmarking rispetto a un'entità totalmente semplice in realtà mi dà ~ 300 righe / secondo con i modelli Magento - solo le spese generali di MySQL sono transazioni.


1
Hai provato a riutilizzare l'oggetto modello per scrivere i dati? Cioè cancellalo, impostaData e poi salva. Ciò eviterebbe le chiamate a getModel e l'overhead di istanza dell'oggetto inerente a PHP.
davidalger,

Inoltre, indovinerò che il collo di bottiglia è nella tua CPU e non nell'unità ... poiché tutti i file di codice necessari verranno caricati al primo passaggio.
davidalger,

Grazie David! Ci proverò anche quello. In realtà penso che siamo ancora legati all'I / O dal numero di query che vengono eseguite. Abbiamo circa 20 query in esecuzione per un determinato salvataggio del modello, alcune delle quali dobbiamo conservare (popolamento di tabelle associate, SELEZIONA per verificare l'esistenza prima del salvataggio) e altre che possiamo probabilmente rimuovere (salvataggi di sessione estranei, carico aggiuntivo () che può essere evitato nella logica dell'applicazione)
kalenjordan

Potresti scoprirlo facilmente. Montare l'intera directory principale e DB MySQL su un disco RAM. Ma dubiterei fortemente che l' I / O sia un problema nelle apparecchiature di livello server. Probabilmente vedrai più vantaggi semplicemente disabilitando "Index on Save".
Ben Lessani - Sonassi,

Risposte:


17

Una cosa che può velocizzare l'intero sito è rimuovere tutti i riferimenti a Varien_Profilersul tuo sito di produzione. Anche se il profiler è disabilitato, controlla sempre se è abilitato, quindi ogni chiamata a Varien_Profiler::comporterà un'istruzione aggiuntiva if. Naturalmente, rimuovere tutte queste chiamate ha il costo di non poter più utilizzare il profiler. Tuttavia, questo può accelerare l'intero sito di circa il 5% circa (questa è un'esperienza soggettiva, ma ci sono MOLTE chiamate a Varien_Profilertutto il Magento). In realtà ho scritto un piccolo script di shell per commentare automaticamente queste chiamate in tutti i file e lo aggiungerò al mio post domani quando sono al lavoro e ho il mio codice pronto.

Come promesso ora, il codice per commentare queste chiamate:

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

Questo dovrebbe essere eseguito nella console linux sia nell'app / cartella lib /. In seguito potrebbe essere necessario modificare manualmente il file /lib/Varien/Profiler.php. Nota anche che dovresti testarlo accuratamente in un ambiente sicuro prima di metterlo in diretta - ma immagino che dovrebbe essere ovvio;)


Wow! Non avrei mai immaginato nulla di simile al 5% solo per le chiamate Varien_Profiler quando disabilitato. Lo controllerò, grazie!
Kalenjordan,

@sparcksoft Come promesso, ho aggiunto il codice ora.
mpaepper,

1
È qui che i condizionali del precompilatore C sono davvero belli. È un peccato che PHP non li abbia, ma ovviamente ciò significherebbe che dovrebbe avere il proprio metodo di pre-compilazione e cache incorporato. :)
davidalger,

2
Puoi anche scriverlo find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;se preferisci un fast lineeliner.
Kojiro,

14

Quando si eseguono molti salvataggi sui modelli Magento, è meglio disabilitare l'indicizzatore Magento che rallenta il processo:

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

E abilitandolo al termine:

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

Ah, buono. Quindi sarebbe come se stessi salvando molti record customer_entity e volessi evitare l'indicizzazione dei clienti per ogni salvataggio? Nel mio caso lo sto effettivamente facendo contro un'entità personalizzata che non ha alcun indice - bene almeno per il benchmark che ho fatto. Abbiamo anche alcuni indici personalizzati su cui probabilmente userò questo suggerimento!
Kalenjordan,

Non credo che ci sia alcuna indicizzazione dei clienti, ma ti aiuterà sicuramente nella modifica di molti prodotti e simili. Ad ogni modo vale la pena provare!
Rick Kuipers,

Siamo spiacenti, sì, dati del prodotto EAV e simili, ad esempio. Grazie.
Kalenjordan,

Hey! Potresti dover reindicizzare (parzialmente) dopo quello?
Alex

@Alex Sì, gli indicizzatori vengono reimpostati su MODE_REAL_TIME, quindi verrà reindicizzato dalla pianificazione. Puoi, ovviamente, forzarlo se vuoi.
Rick Kuipers,
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.