1. Уважаемые пользователи, прежде чем ответить в теме или создать новую,
    внимательно ознакомьтесь с правилами раздела

    Кому лень работать или руки не оттуда - пользуйтесь услугами специалистов
  2. Не задавайте глупых вопросов "Посоветуйте какой-нибудь компонент.."

    Есть JED!!! Ищите там!!!

VM 2.x Оптимизация потребления памяти и уменьшение SQL запросов

Тема в разделе "Virtuemart", создана пользователем Smart.Support, 22 сен 2013.

Информация :
  • Уважаемые пользователи, прежде чем ответить в теме или создать новую, внимательно ознакомьтесь с правилами раздела
  • Не задавайте глупых вопросов "Посоветуйте какой-нибудь компонент.." Есть JED!!! Ищите там!!!
  • Аналоги ищите там же - на JED!!!
  • Новая версия? - У кого будет - тот выложит!
  1. Smart.Support

    Smart.Support Постоялец

    Регистр.:
    22 авг 2012
    Сообщения:
    98
    Симпатии:
    8
    Всем привет! Как бы я хорошо не относился к Joomla и VirtueMart 2 (особенно сравнивая с линейкой 1.х) но в целом каждый раз происходит одно и тоже. Увеличивается количество посетителей на сайте до 50-100 в час и тут начинаются проблемы.

    VM 2 начинает отжирать все больше памяти и как следствие падает то nginx то Apache. На VPS'ах так просто вываливается все в 500 ошибку или чего хуже - не могу подключить к БД.

    Хотелось бы с общественностью обсудить вопрос - кто и как борется с аппетитом VM2 и какие методы оптимизации потребления ресурсов сервера вы прибегаете!?
     
  2. Omny

    Omny Создатель

    Регистр.:
    23 сен 2012
    Сообщения:
    49
    Симпатии:
    12
    Ну во первых тотальное кеширование для незарегистрированных.

    А во вторых - тюнинг mysql.
    mysql.conf нужно заменить на mysql-large.conf, идущий с доками на mysql
    дальше гугли на тему mysqlpertuner. Скачаешь его запустишь, он выдаст советы, что подкрутить в конфиге.
    Если оперативки много, то ускорение можно получить очень даже.

    В третьих, отключаешь всё, что только можно отключить. Я поудалял даже страны ненужные и валюты. Потом полез в базу и физически поочищал некоторые таблицы. У меня от quick start шаблона там остались какие-то английские товары, примеры расчетов цен, комментарии, оценки. Это дало, как ни странно, ощутимый прирост в скорости.

    Добавлено Genk0: Нарушение правил раздела: 3 поста подряд
     
    Последнее редактирование модератором: 26 окт 2013
    dima_v и Servelat нравится это.
  3. zartsergey

    zartsergey Постоялец

    Регистр.:
    1 окт 2013
    Сообщения:
    69
    Симпатии:
    6
    Ну ты конфигурацию сервера напиши. И какой у тебя онлайн, не средний в час, а количество активных посетителей.
    Просто быть может что все ок, так и должно быть, просто сервер не очень.
     
  4. dwib

    dwib Постоялец

    Регистр.:
    6 май 2013
    Сообщения:
    55
    Симпатии:
    12
    Virtuemart 2: Оптимизация Category
    Открываем administrator/components/com_virtuemart/models/category.php ищем функциюgetChildCategoryList примерно 120 строка
    $query запрос
    Код:
    $query = 'SELECT L.* FROM `#__virtuemart_categories_'.VMLANG.'` as L
                JOIN `#__virtuemart_categories` as C using (`virtuemart_category_id`)';
    $query .= ' LEFT JOIN `#__virtuemart_category_categories` as CC on C.`virtuemart_category_id` = CC.`category_child_id`';
    $query .= 'WHERE CC.`category_parent_id` = ' . (int)$virtuemart_category_id . ' ';
    $query .= 'AND C.`virtuemart_vendor_id` = ' . (int)$vendorId . ' ';
    $query .= 'AND C.`published` = 1 ';
    $query .= ' ORDER BY C.`ordering`, L.`'.$selectedOrdering.'` '.$orderDir;
    меняем на
    Код:
    if(!empty($childList)){
        if(!class_exists('TableCategory_medias'))require(JPATH_VM_ADMINISTRATOR.DS.'tables'.DS.'category_medias.php');
        foreach($childList as $child){
            $xrefTable = new TableCategory_medias($db);
            //$xrefTable = $this->getTable('category_medias');
            $child->virtuemart_media_id = $xrefTable->load($child->virtuemart_category_id);
        }
    }  
    Ну вот как то так уменьшил количество запросов к базе данных вдвое!
     
    badneko нравится это.
  5. artserge

    artserge Создатель

    Регистр.:
    4 ноя 2012
    Сообщения:
    31
    Симпатии:
    8
    на данный момент вижу узкое место в router.php виртумарта - при каждом вызове JROUTE для получения ссылки на категорию/производителя/товар выполняется 1-2 запроса только для того чтоб узнать sef-путь по ID ... вот и думаю - как бы это оптимизировать... какие ваши варианты ? может быть мне одному только кажется что для построения выпадающего меню из 200 категорий нужно сделать 300-350 запросов к базе? может кто решил эту проблему ? Кэширование конечно хорошо, но оно имеет свои недостатки в работе корзины/фильтра

    сейчас копаю выборочное кэширование модулей - пока на стадии тестов

    Во, почитал немного всякие доки и нашел интересную штуку
    В свойствах системы кэширование не включаем, а в router.php виртумарта в метод getCategoryRoute пихаем после

    Код:
    $cache = JFactory::getCache('_virtuemart','');
    строку
    Код:
    $cache->setCaching( 1 );
    Таким образом включаем принудительный кэш для ссылок
    Это помогло нам скэшировать урлы категорий, таким образом я уменьшил кол-во запросов на 300... при редактировании категории кэш обновляется
    UPD: обновляется каждые XX минут - настройки кэша в панели управления, по умолчанию 15 минут

    В общем можете потестить и отписаться.

    Да, плагин "System - кэш" должен быть ВЫКЛЮЧЕН.


    Нашел способ как кэшировать результаты работы функций - дебаг показывает уменьшение запросов, в папке /cache/ создаются и обновляются раз в 15 мин нужные файлики...

    например закэшировал вывод модуля "производителей":
    пошел в файл
    modules\mod_virtuemart_manufacturer\mod_virtuemart_manufacturer.php

    находим там обычные строки

    $manufacturers = $model->getManufacturers(true, true,true);
    $model->addImages($manufacturers);

    т.е. мы как бы присваиваем переменной $manufacturers результат выполнения метода getManufacturers и пихем картинки туда методом addImages.
    Неплохо бы не дергать эти методы постоянно - производители же не меняются каждую минуту, верно?

    вставил перед вышеуказанными строками:
    Код:
    $cache = JFactory::getCache('virtuemart_frontend_manufacturers', ''); // понятное название директории с кэшем
    $cache->setCaching( 1 ); // принудительно включаем кэширование
    $key = 'virtuemart_frontend_manufacturers' ; // уникальный ключ кэша - тут можно вязать ID модуля и т.п. но у меня модуль один и на главной - поэтому я не заморачивался - у меня уникальным является и "virtuemart_frontend_manufacturers"
    
    вместо вышеуказанных строк -
    Код:
    if (!($manufacturers = $cache->get($key))) {  // если короче в кэше не нашли наших производитлей
       $manufacturers = $model->getManufacturers(true, true,true); // таки вызываем методы
       $model->addImages($manufacturers); // и картинки тоже пихаем
       $cache->store($manufacturers, $key); // ну и сохраняем в кэш нашу переменную под уникальным кеем
    }
    
    Вуаля - тестим, проверяем запросы.По этому способу можно извращаться с кэшем как угодно)))

    Да, у меня отчего-то начал пихаться кэш страниц в папку /cache/pages/ и как результат начали кэшироваться всякие ненужности типа корзины и т.п. - то из-за чего я решился на правку кода и тонкие эксперименты
    я решил пока проблему заглушкой, поставив права "444" на эту папку :rolleyes:
     
    Последнее редактирование: 10 фев 2014
  6. testaross

    testaross Постоялец

    Регистр.:
    22 авг 2013
    Сообщения:
    74
    Симпатии:
    6
    Сразу видно "спец" писал. С каких пор кеширование в вирте можно включать?
     
  7. Omny

    Omny Создатель

    Регистр.:
    23 сен 2012
    Сообщения:
    49
    Симпатии:
    12
    С тех пор, как прочти пост выше. И с тех пор, как существуют сторонние компоненты для кэширования, такие как Jotcache
    Решил флудом постов набить?
     
  8. testaross

    testaross Постоялец

    Регистр.:
    22 авг 2013
    Сообщения:
    74
    Симпатии:
    6
    В котором написано:
    Чувствуешь разницу с:
    ?
     
  9. Omny

    Omny Создатель

    Регистр.:
    23 сен 2012
    Сообщения:
    49
    Симпатии:
    12
    Jotcache, nginx, аналоги
    ?
     
  10. artserge

    artserge Создатель

    Регистр.:
    4 ноя 2012
    Сообщения:
    31
    Симпатии:
    8
    testaross, вроде ж понятно написано. Выключено общее кэширование чтоб не кэшировать корзины, меню, фильтры и т.п.
    А в свою очередь,
    В нужном месте включает как раз таки принудительно кэширование того что хотим, при этом можем сами создавать кэш и использовать его. Тонко. Удобно.