Какие части слоя модели можно обойти в интересах оптимизации производительности

28

В настоящее время я вижу, что для таблицы базы данных с очень простой схемой (около 5 полей) она вставляет новые записи со скоростью чуть менее ~ 50 операций вставки в секунду в моей локальной среде разработки (накопитель SSD) - это с нет наблюдателей на модели, заполняющей связанные таблицы.

Используя прямой SQL, я вижу значительное улучшение - ~ 1800 вставок в секунду. Мы думаем о том, чтобы попытаться оптимизировать производительность наших моделей, но, конечно, мы не хотим потерять всю ту хорошую стабильность и гибкость, которую дает нам ядро ​​Magento.

Мне интересно, прошел ли кто-то этот путь раньше и есть ли легкие победы с точки зрения компонентов слоя модели, которые можно относительно безопасно обойти, что даст значительное повышение производительности.

Вещи как:

  • Разрешение имени класса
  • до и после сохранения событий
  • Отправка событий
  • операции
  • и т.п.

ОБНОВЛЕНИЕ: Я соврал, на самом деле были некоторые дополнительные запросы, запускаемые наблюдателями или afterSave (), которые я видел, когда проверял журнал запросов к базе данных. Сравнение с абсолютно простой сущностью фактически дает мне ~ 300 строк в секунду с моделями Magento - только накладные расходы MySQL являются транзакциями.

kalenjordan
источник
1
Вы пытались повторно использовать объект модели для записи данных? Т.е. очистите его, установите данные и затем сохраните. Это позволит избежать вызовов getModel и накладных расходов на создание экземпляров объектов, присущих PHP.
Давидгер
Кроме того, я собираюсь предположить, что узкое место здесь в вашем процессоре, а не на диске ... так как все необходимые файлы кода будут загружены при первом проходе.
Давидгер
Спасибо, Дэвид! Я тоже попробую. На самом деле, я думаю, что мы все еще связаны с количеством выполняемых запросов. У нас есть около 20 запросов, которые выполняются для сохранения данной модели - некоторые из которых нам нужно сохранить (заполнение связанных таблиц, SELECT для проверки существования перед сохранением), а другие, которые мы, вероятно, можем удалить (посторонние сохранения сеанса, дополнительная загрузка () это можно избежать в логике приложения)
kalenjordan
Вы могли бы легко узнать. Смонтируйте весь корневой каталог и MySQL DB на RAM-диске. Но я сильно сомневаюсь, что проблема ввода / вывода в оборудовании серверного уровня. Вы, вероятно, увидите больше преимуществ, просто отключив «Индекс при сохранении».
Бен Лессани - Сонасси

Ответы:

17

Одна вещь, которая может ускорить весь сайт, это удалить все ссылки Varien_Profilerна ваш производственный сайт. Даже если профилировщик отключен, он всегда проверяет, включен ли он, поэтому каждый вызов Varien_Profiler::приведет к дополнительному ifутверждению. Конечно, удаление всех этих вызовов происходит за счет невозможности использования профилировщика. Тем не менее, это может ускорить весь сайт, возможно, на 5% или около того (это субъективный опыт, но есть много звонков по Varien_Profilerвсему Magento). На самом деле я написал небольшой сценарий оболочки, чтобы автоматически закомментировать эти вызовы во всех файлах, и я добавлю это в свой пост завтра, когда я буду на работе и у меня будет готов код.

Как и обещал сейчас код для комментирования этих звонков:

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

Это должно выполняться в консоли linux как в приложении /, так и в папке lib /. Возможно, вам придется вручную настроить файл /lib/Varien/Profiler.php вручную. Также обратите внимание, что вы должны тщательно проверить это в безопасной среде, прежде чем запускать его в живую - но я думаю, это должно быть очевидно;)

mpaepper
источник
Вот Это Да! Я бы никогда не вообразил что-либо даже близко к 5% только для вызовов Varien_Profiler при отключении. Я проверю это, спасибо!
Календжордан
@sparcksoft Как и обещал, я добавил код сейчас.
mpaepper
1
Вот где условия прекомпилятора C действительно хороши. Жаль, что в PHP их нет, но, конечно, это будет означать, что у него должен быть свой собственный встроенный метод предварительной компиляции и кэширования. :)
Давидгер
2
Вы также можете написать это, find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;если вы предпочитаете быстрый oneliner.
Кодзиро
14

При выполнении большого сохранения на моделях Magento лучше отключить индексатор Magento, который замедляет процесс:

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

И включив его, когда вы закончите:

$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');
Рик Кейперс
источник
Ах, да, хорошо. Так что будет, если вы сохраняете много записей customer_entity и хотите избежать индексации клиентов при каждом сохранении? В моем случае я фактически делаю это против пользовательского объекта, который не имеет никакой индексации - по крайней мере, для теста, который я сделал. У нас также есть несколько пользовательских индексов, на которых я, вероятно, буду использовать этот совет!
Календжордан
Я не думаю, что есть какая-либо индексация клиентов, но она наверняка поможет вам при изменении многих продуктов и тому подобного. В любом случае стоит попробовать!
Рик Кейперс
Извините, да EAV данные о продукте и тому подобное, например. Спасибо.
Календжордан
Привет! Возможно, вам придется (частично) переиндексировать после этого?
Алекс
@ Алекс Да, индексаторы сбрасываются в MODE_REAL_TIME, поэтому они будут переиндексированы по расписанию. Вы можете, конечно, заставить его, если хотите.
Рик Кейперс