Your SlideShare is downloading. ×
Magento - Каранда Александр, Кирилл Морозов
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Magento - Каранда Александр, Кирилл Морозов

1,272
views

Published on

Magento. Медосмотр.

Magento. Медосмотр.


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,272
On Slideshare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • Я являюсь тимлидом в отделе Мадженто: експерт консалтинг груп. Мы предоставляем клиентам разные виды услуг, архитектурные ришения, мониторинг систем, продженктмепеджмент и т.д. Занимаемся тем же чем и партнеры, помагаем нашим клиентам быть успешными на базе Мадженто.Нереальные вещи – делаем реальными 
  • Проверкасостояния систем перед запуском. Каккода так и инфраструктуры, запусклоадтестов и автоматическихрегрешин.Проверкаготовностикода с точки зрениябизнесанализа, когдаклиент не совсемуверн, что код реализуетбизнеслогику. Такой себе аудит решения, особеннополезнокогдадаешь в разработкумаленькойаутсорскоманде в 300 чел, и оничто-токолбасят на протяжениигода и в когцегоданужноещетщательнообработатьнапильником, что б с паравозаполучилсясамолет.Анализкода на совместимость с новымивресиями. Все мыработаем с пхп, языксосплошнойдинамикой в разработке и гибкостью и можно так надевелопить, чтоиз 50 кастомныхмодулей, 48 не будутсовместимы с новойверсиейпродукта, нонужно все таки обновить и узнатьсколькобудетстоитьобновлени. Тогдапроводиманализ.Ну и самоеинтерестное, визитмадженто к доктору, береманализы, проверяминфраструктуру, проверям код на потенциальныепроблеммы.- код, приложение, система.Все вышеперечисленноевыможете вводить как практику на проекте или же предоставлять вашим клиентамкакдополнительныйсервис. Бизнес идея.
  • На нашейпрактикемывыявили 5 основныхзаболеваний, которыенаиболеевсегораспространены в Мадженте и создаютосновную погоду 84% от общего числа проблем.Можеткто-тодогадался о типичных проблемах?
  • Может кому знакомо, загрузка моделей в цикле.37 процентов проблем в Мадженте связаны именно с этим кодом. Прям магия, 37 процентов и 37 температура воспалительного процесса.В чем же суть проблемы:Каждый лоад модели это 100% запрос в базу данныхТ.к. продукт у нас ЕАВ, то запросов у нас будет несколько.Так на лоад продукта будет 5-10 запросов. Зависит от многих факторов, катсомизаций. Если в коллекции у нас 20 продуктов, то как результат 200 лишних запросов. А вдруг у нас в коде еще пару таких блоков кода?К сати, из практики, рекордсмен был один клиент, у которого было 3000 запросов на загрузку страницы. При том, что без кеша в мадженте 45 запросов на загрузку страницы, что тоже много.Правильным решением будет подготовить данные, подготовить коллекцию и дальше уже просто использовать подготовленную информацию.Вместо повторной загрузки модели.
  • Загрузка одной и той же сущности больше одного раза. 21% проблем Мадженты связаны именно с этим Каждый раз мы создаем отдельный экземпляр класса в памяти, каждый раз мы посылаем запрос в БД, только для того, что б получить значение одного атрибута сущности. Да Маджента не идеальна, но не будем усугублять не идеальность.Решением будет загрузка модели и далее уже используем загруженную модель.Кстати, про м2, в м2 есть будет реализован новый дата лаер, который сделает процесс инстанционирования более интеллектуальным. Дата лаер будет буферизировать загруженные модели в себе.И случае повторного запроса то й же сущности в рамках одной пхпсесии будет отдаваться уже загруженный инстанс. В принципе все логично, пхп все равно не освобождает память до конца сессии, и мы уже его раз загрузили так давайте будем держать ссылку на него.
  • Неоптимальное использование возможностей коллекции, загрузка и обработка больше данных чем нам требуется.Может кто-то сталкивался. Примером являетсяфичеред блок.Подобные проблемы занимают 13% от всех проблем связанных с кодом.Нужно 5 элементовПо физике процессов у нас тут несколько проблем: БД обрабатывает кучу данныхБД готовит результат на аутпутМы гоняем по сети кучу пакетов данных, забивая каналывыгружаем всю коллекцию в память, все полтора миллиона продуктовдальше берем только первые два.Правильное решение, используем возможности Мадженто коллекции, добавляем лимит.
  • Неоптимальная логика. Пересчет данных каждый раз как мы обращаемся к методу.8% от всех проблем связанных с кодом.Проблема не всегдаявная с первоговзгляда. Реализовав один раз метод, мыегоиспользуемнеоднократно и каждый раз данныевнутри метода пересчитываются.Решением, лечением, будетиспользование так званого, логическогокеширования. На времявыполненияпхпсессиисохраняем результат в протектедпеременнуюИспользуем уже загруженыеданныеилиподсчитануюинформацию.
  • 5% от всех проблем связанных с кодом.Сложно придумать пример неправильно кода. Скажу просто. Мы полностью забываем про возможности кеширования в мадженте, особенно данных которые не будут меняться часто
  • Ну и все остальные… Куча болезней, симптомов, признаков.ВозможностьSQL инекцийНеоптимальная обработка данныхЗагрузка огромнейших файлов в память…
  • Предвесникамизаболеванийявляетсясыпь.Сыпь – еще не болезнь, но уже явный симптом чего-топриближающегося.Сыпьможноопределить по определенным признакам:Спагетти кодКопи-паста кодХардкодИгнорирование код стайлов (Zend)ОтсутствиеPHP-DOC-oвИспользованиеголобалсовЗакоментированые куски кодаМетодыпо 200 строкКлассы по 100500 строкРешение – Рефакторим!
  • Все проблемыначинаются с запаха. Открываешь код на проверкуилианализ и уже с первоговзглядаможноопределитьопределенных запахи кода. Как правилоэтоподозрительный код. Вродебынетукориминала, еслибы не соответствующиекоментарри к коду. Особенноонивидныкогдаразработчикипытаютсяихскрыть.
  • Скрываюткак правило дезодорантами.Самыепопулярныедезодоратны:ФиксМеТу ДуХакИногдаможно переборщить с дезодорантами и тогдаполучается:…
  • Ахе ефект.Тудушки и коменты, не всегдаплохо, главноечто б онибыли в нужномместе и в нужноевремя.
  • Какова же истинная проблема с запахами?!Если код находиться в разработке, то вообщеникаких.Проблема только с продакшиновым кодом.Все просто, имея в арсенале код дополненыйтудушками и фиксами мы:Создаем ощущение незавершённостиМожно забыть про то, что оставалось в коде.РешениеСоздаемтикеты в джиреЗаписываем задачи в роадмапДобавляем хистори в спринт беклог
  • Прежде чем приступить к диагностике, хотелось бы сказать про тренды и каталог болезней.Типичные проблемы и болезни, формирут тренды. Это все тенденции Мадженто бизнеса. Но они нам так же дают возможность понять что нужно в мадженте улучшать, что б разработчики больше не делали таких же ошибок или система не позволяла делать такие ошибки.Вся информация предоставляется в Мадженто УниверситетИ в маджентокор.Хорошим примером является дата лаер, который не позволит делать некоторые типичные ошибки, которые могут повлиять на производительность.
  • Начнем снебольшогопримера. К нам пришолнебольшойклиент с большимиамбициями. Попросилпосмотретькоданемного.А когдапосмотрелисколько там немножко оказалось:15 неймспейсов120 модулей2000 моделей100000, корочемного.
  • Ну, горажданеалкоголики, хулиганы, туниядцы.Ктохочетсегодняпоработать?На ликеро-водочныйсегоднянарядовнету и врятли в ближайшиймесяцпридвидиться.ТолькоанализкодаИзвращалиськактолько могли: груповоеревью, одиночное код ревью, сверхувниз-снизу вверх. Послеревьюразборполетов, по старойдобройрусскойтрадициибудемискатьвиноватого.Еще один такой код ревью и вся команда уже готоваувольняться.
  • Начали думать, что бы такое сделать что бы процесс проверки системы не был таким скучным и утомительным нужно его немного разнообразить.Все мы тут творческие люди и любим всякие новшества.Что можно сделать:Автоматизхировать процесс анализа, посмотреть в сторону написания сниферов на базеПхп код сниферПхппарсерИспользовать код ревью плагин для ИДЕшки, ревуАвтогенерациядокументоphpdocxА теперь остановимся на процессе автоматизации более детально, так как вручную, кто-угодно сможет
  • В интернете куча статей о том какавтоматизироватьпроцесспроверки. Ноочень мало, о том, каксистематезироватьпроверку.Случайно нашли статью о представлении програмного продукта в виде набораграфов.Корневойсистемойданноййидеиявляетсяфайловая система.Которая сама по себе уже графТак мы уже можемоперировать папками, файлами, подпапкамиИ еслипойтиглубже то мыоперируем проектом, неймспейсом, модулями, моделями-файлами.Уже идетсбор метрик.
  • Второйуровень, втораясоставляющая, Токенизацияпиейчпикода.На данномэтапеиспользуярефлексиюмытокенезируем код.Код превращается в плоскую структуру. Литерал в данном случае минимальная составляющая языка програмирования.При этомкаждомулитералуприсваивается ряд свойств.Вот пример кода.Ну и что, скажитевы, гляда на простенький пример, в Мадженте такого нету, там все сложней.
  • Да, сложней.Поэтому покажу второй пример, где мы разбираем цикл.Пример токенизации цикла. Как я уже говорил, литерал собирает в себе ряд свойств.Не смотря на линейную структура, у нас есть опенер и клозер, по которым мы можем линковать внутренние элементы.
  • Давайте посмотрикак же имеятокенизацию, можноорганизоватьпоискмефического готу в нашемкоде.Каксамый просто пример. Через реджестерзадаемтокены с кторымибудемработать и значениекоторыхбудемпроверять. Задаемотправную точку.Встретился готу – ругаемся матом.
  • Поиск «Ява»конкатенации в пхпкоде, когда строку через + конкатенируют, чтоможет привести к неправильному выводуинформации для клиента.Отправная точка токент т_плюс.А дальше используяфайндПревиус, файндНекспрогуливаемся по коду и ищемпредыдущий и следующийтокен, сравниваем с типом токена, являетсяли он строкой.
  • Следующимуровнемявляетсяпостроениелексического дерева.На данномуровнемы уже управляемлексическимиконструкциямиязыка, в отличии от последовательныхтокенов/литералов.1. Имея на входе простенький пхп код,2. Пропускаем код через пхппарсер и получаемлексическое дерево. Самоепростоепредставление дерева - естественнохмл.По сравнению с токенами у нас етсьоченькрасивоепредставлениеметодов в виде дерева.Начиная от класов и в глубь до простыхлитералов.Мыможемоперировать и анализировать на разномуровне: У нас естьконструкцииязыка, выражения, лексемы, литералыУ выраженияестьПеременная в которуюзаписываем результатподвыражениеУ выраженияестьсвоисостоявляющие… тип: плюсИ т.д. Этопростой пример, но на данноппростомпримере видно, что у нас простор для работы над проверкойкоданамногошире. Используяxpathмы можем прогуливаться по лексическому дереву и проверять код по определенным правилам.
  • Вот пример кода, поиска загрузки коллекций без ограничения размера коллекции.Как видим, одной строкой находим потенциальную проблему в коде.
  • Для сравнения, токен против лексического дерева, как можно найти потенциальную проблему загрузки моделей в цыкле.Время выполнения.Вам уже решатьчтоиспользовать
  • Вне поля зрения у нас будетоставиться, то что не автоматезировалосьХмлфайлыДб схемаДжаваскрипт и цссАвтоматизация находит только подозрения!20-25 % подозрений – это круто
  • В дополнение к Програмномуграфу хотел добавить, что вне нашего внимания остались такие интерестные моменты эволюции как:Семантические связиЦиклические вызовыЧестно говоря у нас не хватило ни сил ни времени с этим разбираться, хотя и накопали интересную тулзуLoco.Поэтомуоставшуюсячастьмыдоверилипроффесионалам в этомделеNew Relic. О опытеработы с которымповедаетмойколлегаКиррил Морозов.
  • Когда что-то случалось все ведут себя как всегда, воют, как слепые котята.А еще все любят котят, потому хватит нянчиться с котятами, и перейдем к делу.
  • Вот как-то так выглядит мониторинг важной системы,Особенно если простой системы недоприносит несколько сотен тысяч рублей или пары тысяч долларов или евро.Всем, хочется всем увидеть как оно на самом деле.Сразу оговорюсь, брал данные у реального клиента, клиент крупный, может и в суд подать.
  • За частую есть несколько факторов, которые сигнализируют о потенцчиальной проблеме.CPU – первыйТраффик – второйПамят – третийВремя ответа – сам надежный -
  • По какой-то причине
  • Вот, время ответа – самая надежная метрика для потенциальной проблемы.Сдесь очевидный всплеск до 2х секундЗагрузка процессора близка к
  • Можно заглянуть чуть глубже, и узнать больше о том, что случилось.
  • Какая прелесть, вот и долгожданная фича клиента
  • Вот как-то так выглядит мониторинг важной системы,Особенно если простой системы недоприносит несколько сотен тысяч рублей или пары тысяч долларов или евро.
  • Будем анализировать происходящее, Видим что контроллер долго отрабатывает.Все ясно, кому-то пора бить по рукам.
  • Вот он, кошмар для владельца магазина, это сказочный контроллер выполняет очень много интересных задач.В частности полторы тысячи запросов в к базе данных. Теперь можно вспомнить все, о чем говорил Александр.После того, как клиент получил информацию о состоянии своего магазина, он пошел к команде чудо-разработчиков, С тех по мы его не видели.
  • Апдекс Индекс поизводительности.
  • Апдекс Индекс поизводительности.
  • Мы будем выбирать с наименьшим апдексом.
  • Мы будем выбирать с наименьшим апдексом.
  • Мы будем выбирать с наименьшим апдексом.
  • Мы будем выбирать с наименьшим апдексом.
  • О, Вот он, пойман на гарячем!Видать вмешались в этап сборки страницы и много времени потратили на какую-то мелкую операцию.Кому такое знакомо?
  • Идем дальше, и видим, очередной косяк, в цикле идем по продуктам, и вызываем что-то свое. На этом стоило бы зако
  • Ну вот как бы все, осталось только выписать рецепт на будущее, как можно применить все выше сказанное на нашей Мадженте.Что бы наше приложение было всегда в тонусе, закалялось и никогда не требовало обращения к специалистам, для выявления проблем.
  • Проверка кода как часть методологии ведения проектовАвтоматические проверки кода сбилдами(CI)Пишем свои сниферыПользуемся Системами Мониторигна (Ньюрелик)Делаем диагностику Мадженты самостоятельно и не ждем пока она сама себя вылечит
  • Скучные вещи не всегда такие скучныеНе все можно автоматизироватьНе ждите пока проблемы начнут проявляться, проверяйте приложение чаще
  • Transcript

    • 1. Magentocommerce.com «Magento Health Check» (медосмотр) Каранда Александр, Кирилл Морозов
    • 2. О нас Каранда Александр, консультант Кирилл Морозов, консультант
    • 3. А поговорить?  Пролог  Теория заболеваний  Диагностика  Выписываем рецепт
    • 4. Пролог
    • 5. Пролог Ребята, нужно поработать, а не как обычно!
    • 6. Во что превратилось Health Check Upgrade Analysis Takeoff Check Business Requirements Analysis
    • 7. Теория заболеваний Мадженто
    • 8. 84% 16% I II III IV V Температура
    • 9. 37% 21% 13% 8% 5% 16% Температура 1. Загрузка моделей в цикле
    • 10. 37% 21% 13% 8% 5% 16% Температура 2. Загрузка одних и тех же сущностей больше одного раза
    • 11. 37% 21% 13% 8% 5% 16% Температура 3. Обрабатываем больше данных чем нужно
    • 12. 37% 21% 13% 8% 5% 16% Температура 4. Пересчет данных каждый раз при вызове метода
    • 13. 37% 21% 13% 8% 5% 16% Температура 5. Забываем о кешировании
    • 14. 37% 21% 13% 8% 5% 16% Температура 16% I II III IV V Все остальное
    • 15. Первые симптомы • Спагетти код • Копи-паста код • Хардкорд • Игнорирование код стилей (Zend) • Отсутствие PHP-DOC-oв • Использование голобалсов • Закоментированые куски кода • Методы по 200 строк • Классы по 100500 строк REFACTO RING
    • 16. Запах
    • 17. //@todo: fix this bull shit //@todo: possible PCI compliance issue //@todo: prepare header from revu format //@todo: We need to log such exceptions to somewhere //@todo: remove wish list observer processAddToCart //@todo: add filter by current website //@todo: add full name logic //@todo: move to config //@todo: implement setter for this value //@FIXME: stupid fix of previous multi-roles logic. //@todo: implement //@todo: merge with reason //@todo: fix possible issues with date format Запах Проблема Решение
    • 18. Тренды • Популярные проблемы • Проблемы по модулям • Классификация проблем
    • 19. Диагностика
    • 20. Реальный клиент Х 15+ Неймспесов 120+ Модулей 2000+ Моделей 100000+ Строчек Кода 1000+ Чашек кофе
    • 21. Реальный клиент Х
    • 22. Автоматизация ПХП Шторм плагин: reVu by Sylvain Francois Автоматизация: PHP CodeSniffer PHP Parser Автогенерация отчетов phpdocx
    • 23. Программный граф 1. Файловая Система
    • 24. Программный граф 1. Файловая Система 2. PHP Токенизация (TokenReflection) Token Type Token Content T_VARIABLE $a T_EQUAL = T_LNUMBER 5 T_SEMICOLON ; T_VARIABLE $c T_EQUAL = T_VARIABLE $a T_PLUS + T_LNUMBER 6 $a = 5; $c = $a + 6;
    • 25. Программный граф 1. Файловая Система 2. PHP Токенизация (TokenReflection) [code] => 320 [type] => T_FOR [content] => for [line] => 3 [parenthesis_opener] => 3 [parenthesis_closer] => 16 [parenthesis_owner] => 2 [scope_condition] => 2 [scope_opener] => 18 [scope_closer] => 26 [column] => 1 [23] => Array ( [type] => T_VARIABLE [content] => $i [line] => 3 [nested_parenthesis] => Array ( [3] => 16 ) for($i=0; $i < 5; $i++) { echo $i; }
    • 26. Программный граф 1. Файловая Система 2. PHP Токенизация (TokenReflection) Поиски Мифического GOTO в коде
    • 27. Программный граф 1. Файловая Система 2. PHP Токенизация (TokenReflection) Поиски конкатенации строк через +
    • 28. Программный граф 1. Файловая Система 2. PHP Токенизация (TokenReflection) 3. PHP Лексическое Дерево (PHP_Parser) $a = 1; $b = 2; $c = $a + $b;
    • 29. Программный граф 1. Файловая Система 2. PHP Токенизация (TokenReflection) 3. PHP Лексическое Дерево (PHP_Parser) xpath : > //node:Expr_MethodCall/subNode:name[ scalar:string="getFirstItem" and count( ./ancestor::node:Expr_MethodCall[1]/descendant::node:Expr_MethodCall/subNode:name[ scalar:string = "limit" or scalar:string = "setPageSize" or scalar:string = "setPage"]) = 0 ] Загрузка коллекций без ограниче
    • 30. Сравнение подходов PHP Токенизация (TokenReflection) class Ecg_Sniffs_Performance_LoopModelLoadSniff implements PHP_CodeSniffer_Sniff { public function register() { return array(T_WHILE, T_FOR, T_FOREACH, T_DO); } public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); $opener = $tokens[$stackPtr]['scope_opener']; $closer = $tokens[$stackPtr]['scope_closer']; for ($ptr = $opener + 1; $ptr < $closer; $ptr++) { $content = $tokens[$ptr]['content']; if ($tokens[$ptr]['code'] === T_STRING && $content == 'load') { $phpcsFile->addError('Model load in loop detected', $ptr, 'ModelLoad', array $content)); } } } } >> execution time: 0.05sec PHP Лексическое Дерево //*[ name()="node:Stmt_Foreach" or name()="node:Stmt_Do" or name()="node:Stmt_For" or name()="node:Stmt_While" ]//node:Expr_MethodCall/subNode:name[ scalar:string = "load" ] >>execution time: 0.0001sec Загрузка моделей в цикле
    • 31. что не нужно забывать Xml files (configuration & layout updates) DB Schema (indexes, non-optimal field types) Javascript, CSS & HTML Вне поля зрения Автоматизация находит только подозрения 20-25 % подозрений – это круто
    • 32. Программный граф 1. Файловая Система 2. PHP Токенизация (TokenReflection) 3. PHP Лексическое Дерево (PHP_Parser) 4. Семантические связи 5. Циклические вызовы
    • 33. Мониторинг
    • 34. Мониторинг Что за $%? Релиз, $% #%!
    • 35. Мониторинг: Процессор
    • 36. Мониторинг: Сеть
    • 37. Мониторинг: Время ответа
    • 38. Мониторинг: Время ответа
    • 39. Мониторинг: Самые медленные
    • 40. Мониторинг: Самые медленные
    • 41. Мониторинг: Самые медленные
    • 42. Мониторинг: Самые медленные
    • 43. APDEX
    • 44. APDEX
    • 45. По следам
    • 46. По следам: Мы знаем как
    • 47. По следам: Видно почему
    • 48. По следам: Видно почему
    • 49. По следам: Кто виноват
    • 50. По следам: Кто виноват
    • 51. Выписываем рецепт
    • 52. Рецепт • Проверка кода как часть методологии ведения проектов • Автоматические проверки кода с билдами (CI) • Расширяем базу для проверки(свои сниферы) • Пользуемся Системами Мониторинга (Ньюрелик) • Систематическая проверка
    • 53. Просто так • Скучные вещи не всегда такие скучные • Не все можно автоматизировать • Не ждите пока проблемы начнут проявляться, проверяйте приложение чаще
    • 54. Полезности ECG page http://magento.com/consulting Magento coding standards and best practices https://github.com/magento-ecg/coding-standard http://www.magentocommerce.com/knowledge-base https://wiki.magento.com/display/MAGE2DOC/PHP+Coding+Standards+and+Practices Tools https://github.com/nikic/PHP-Parser http://phpmd.org https://github.com/Andrewsville/PHP-Token-Reflection Common Weakness Enumeration http://cwe.mitre.org reVu code review plugin https://github.com/syllant/idea-plugin-revu
    • 55. Спрашивайте Каранда Александр alex.karanda@ebay.com Кирилл Морозов kirill.morozov@ebay.com
    • 56. Спасибо за внимание Вопросы?