Qué partes de la capa del modelo se pueden omitir en aras de la optimización del rendimiento

28

Actualmente estoy viendo que para una tabla de base de datos con un esquema muy simple (aproximadamente 5 campos), está insertando nuevos registros a una velocidad de poco menos de ~ 50 inserciones / segundo, en mi entorno de desarrollo local (unidad SSD): esto es con no hay observadores en el modelo que puebla tablas asociadas.

Usando SQL directo, veo una gran mejora: ~ 1800 inserciones / segundo. Estamos pensando en intentar optimizar el rendimiento de nuestros modelos, pero, por supuesto, no queremos perder toda la buena estabilidad y flexibilidad que nos brinda el núcleo Magento.

Me pregunto si alguien ha tomado esta ruta antes y si hay algunas victorias fáciles en términos de componentes de la capa del modelo que se pueden omitir de manera relativamente segura que darán un aumento significativo del rendimiento.

Cosas como:

  • Resolución de nombre de clase
  • antes y después de guardar eventos
  • Despachos de eventos
  • Actas
  • etc.

ACTUALIZACIÓN: mentí, en realidad hubo algunas consultas adicionales activadas por los observadores o afterSave (), que vi cuando inspeccioné el registro de consultas de la base de datos. La evaluación comparativa contra una entidad totalmente simple en realidad me da ~ 300 filas / segundo con los modelos Magento: solo las sobrecargas de MySQL son transacciones.

kalenjordan
fuente
1
¿Has intentado reutilizar el objeto modelo para escribir los datos? Es decir, borrarlo, establecer Datos y luego guardar. Esto evitaría las llamadas a getModel y la sobrecarga de instanciación de objetos inherente a PHP.
davidalger
Además, voy a adivinar que el cuello de botella aquí está en su CPU y no en la unidad ... ya que todos los archivos de código necesarios se cargarán en el primer paso.
davidalger
Gracias David! Lo intentaré también. En realidad, creo que todavía estamos vinculados a E / S por la cantidad de consultas que se están ejecutando. Tenemos alrededor de 20 consultas que se están ejecutando para guardar un modelo determinado, algunas de las cuales debemos mantener (llenar tablas asociadas, SELECCIONAR para verificar la existencia antes de guardar), y otras que probablemente podamos eliminar (guardar sesiones extrañas, carga adicional () 's que se puede evitar en la lógica de la aplicación)
kalenjordan
Podrías descubrirlo fácilmente. Monte todo el directorio raíz y MySQL DB en un disco RAM. Pero dudaría mucho de que la E / S sea un problema en los equipos de nivel de servidor. Probablemente verá más beneficios simplemente deshabilitando "Índice al guardar".
Ben Lessani - Sonassi

Respuestas:

17

Una cosa que puede acelerar todo el sitio es eliminar todas las referencias a Varien_Profilersu sitio de producción. Incluso si el generador de perfiles está deshabilitado, siempre verifica si está habilitado, por lo que cada llamada a Varien_Profiler::generará una ifdeclaración adicional . Por supuesto, eliminar todas estas llamadas tiene el costo de no poder usar el generador de perfiles más. Sin embargo, esto puede acelerar todo el sitio en aproximadamente un 5% (esto es una experiencia subjetiva, pero hay MUCHAS llamadas a Varien_Profilertodo Magento). De hecho, escribí un pequeño script de shell para comentar automáticamente estas llamadas en todos los archivos y lo agregaré a mi publicación mañana cuando esté en el trabajo y tenga mi código listo.

Como prometió ahora el código para comentar estas llamadas:

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

Esto debería ejecutarse en la consola de Linux tanto en la aplicación / como en la carpeta lib /. Es posible que deba ajustar el archivo /lib/Varien/Profiler.php manualmente después. También tenga en cuenta que debe probar esto a fondo en un entorno seguro antes de ponerlo en funcionamiento, pero supongo que esto debería ser obvio;)

mpaepper
fuente
¡Guauu! Nunca hubiera imaginado nada, incluso cerca del 5% solo para las llamadas Varien_Profiler cuando está deshabilitado. Lo comprobaré, ¡gracias!
kalenjordan
@sparcksoft Como prometí, agregué el código ahora.
mpaepper
1
Ahí es donde los condicionales del precompilador C son realmente agradables. Es una pena que PHP no los tenga, pero, por supuesto, eso significaría que tendría que tener su propio método de precompilación y almacenamiento en caché incorporado. :)
davidalger
2
También puedes escribirlo find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;si prefieres una línea rápida.
kojiro
14

Cuando se ejecutan muchos guardados en los modelos de Magento, es mejor deshabilitar el indexador de Magento que ralentiza el proceso:

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

Y habilitándolo cuando hayas terminado:

$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');
Rick Kuipers
fuente
Ah, te tengo bien. Entonces, ¿sería como si estuvieras guardando muchos registros de customer_entity y quisieras evitar la indexación de clientes para cada guardado? En mi caso, en realidad estoy haciendo esto contra una entidad personalizada que no tiene ninguna indexación, al menos para el punto de referencia que hice. ¡También tenemos algunos índices personalizados en los que probablemente usaré este consejo!
kalenjordan
No creo que haya ninguna indexación de clientes, pero seguramente lo ayudará a modificar muchos productos y demás. De cualquier manera, vale la pena intentarlo.
Rick Kuipers el
Lo sentimos, sí, los datos del producto EAV y por ejemplo Gracias.
kalenjordan
¡Oye! Es posible que tenga que reindexar (parcialmente) después de eso?
Alex
@ Alex Sí, los indexadores se restablecen a MODE_REAL_TIME, por lo que se reindexará según la programación. Puede, por supuesto, forzarlo si lo desea.
Rick Kuipers