Які частини модельного шару можна обійти в інтересах оптимізації продуктивності


28

Зараз я бачу, що в таблицю бази даних з дуже простою схемою (близько 5 полів) вона вставляє нові записи зі швидкістю трохи менше ~ 50 вставок / секунду, в моєму локальному середовищі розробки (SSD-накопичувач) - це з жодних спостерігачів на моделі, що заповнює пов'язані таблиці.

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

Мені цікаво, чи хтось пройшов цей маршрут раніше, і чи є якісь легкі виграші щодо компонентів модельного шару, які можна обійти відносно безпечно, що дасть значне підвищення продуктивності.

Такі речі:

  • Дозвіл назви класу
  • до і після збереження подій
  • Події розсилки
  • Операції
  • тощо.

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


1
Ви намагалися повторно використовувати об'єкт моделі для запису даних? Тобто очистіть його, встановіть дані та збережіть. Це дозволило б уникнути викликів getModel та накладних екземплярів об'єктів, властивих PHP.
davidalger

Крім того, я збираюся здогадатися, що вузьке місце тут знаходиться у вашому процесорі, а не на диску ..., оскільки всі необхідні файли коду будуть завантажені під час першого проходу.
davidalger

Спасибі, Девіде! Я також спробую це. Насправді, я думаю, що ми все ще пов'язані з кількістю запитів, які виконуються. У нас є близько 20 запитів, які виконуються для збереження заданої моделі - деякі з яких нам потрібно зберегти (заповнення пов’язаних таблиць, SELECT, щоб перевірити наявність до збереження), а інші, які ми, можливо, можемо видалити (стороннє збереження сеансу, додаткове навантаження (), чого можна уникнути в логіці програми)
kalenjordan

Ви могли легко дізнатись. Встановіть цілий кореневий редактор та MySQL DB на диск RAM. Але я б дуже сумнівався, що введення-виведення - це проблема обладнання сервера. Можливо, ви побачите більше переваг, лише відключивши "Індекс на збереження".
Бен Лессані - Сонассі

Відповіді:


17

Одне, що може прискорити весь сайт - це видалити всі посилання Varien_Profilerна ваш виробничий сайт. Навіть якщо профайлер відключений, він завжди перевіряє, чи він увімкнено, тому кожен виклик Varien_Profiler::призводить до додаткової ifзаяви. Звичайно, видалення всіх цих дзвінків виходить за рахунок того, що більше не можна користуватися профілером. Однак це може пришвидшити весь сайт, можливо, на 5% або близько цього (це суб'єктивний досвід, але в багатьох Varien_ProfilerMagento є багато дзвінків ). Насправді я написав невеликий скрипт оболонки, щоб автоматично коментувати ці дзвінки у всіх файлах, і я додаю це до своєї публікації завтра, коли я буду на роботі і буду готовий код.

Як і пообіцяно зараз код прокоментувати ці дзвінки:

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 вручну. Також зауважте, що ви повинні ретельно перевірити це в безпечному середовищі, перш ніж приймати його наживо - але я думаю, це повинно бути очевидним;)


Оце Так! Я б ніколи не уявляв нічого, навіть близько 5%, лише для дзвінків Varien_Profiler, коли він відключений. Я перевірю це, дякую!
kalenjordan

@sparcksoft Як і обіцяв, я додав код зараз.
mpaepper

1
Ось де умовні умови для попереднього компіляції C справді приємні. Це дуже погано, що PHP їх не має, але, звичайно, це означатиме, що він повинен мати свій власний метод попереднього збирання та кешування. :)
davidalger

2
Ви також можете написати це, find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;якщо ви віддаєте перевагу швидкому лінею.
kojiro

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');

Ах готча, приємно. Отже, це було б так, якби ви зберігали багато записів клієнтів і хотіли уникнути індексації клієнтів для кожного збереження? У моєму випадку я фактично роблю це проти спеціальної сутності, яка не має індексації - ну, принаймні, для еталону, який я зробив. У нас також є деякі власні індекси, що, ймовірно, я буду використовувати цю пораду далі!
kalenjordan

Я не думаю, що існує індексація клієнтів, але це обов'язково допоможе вам, коли ви модифікуєте багато продуктів та іншого. У будь-якому випадку варто спробувати!
Рік Куйперс

Вибачте, так, дані EAV про продукт і такі, наприклад. Спасибі.
kalenjordan

Гей! Вам, можливо, доведеться (частково) перевстановити після цього?
Алекс

@Alex Так, індексатори скидаються до MODE_REAL_TIME, тому він буде повторно встановлений за графіком. Ви, звичайно, можете примусити його, якщо хочете.
Рік Куйперс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.