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

Smart.Support

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

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

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

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

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

Добавлено Genk0: Нарушение правил раздела: 3 поста подряд
 
Последнее редактирование модератором:
Ну ты конфигурацию сервера напиши. И какой у тебя онлайн, не средний в час, а количество активных посетителей.
Просто быть может что все ок, так и должно быть, просто сервер не очень.
 
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);
    }
}
Ну вот как то так уменьшил количество запросов к базе данных вдвое!
 
на данный момент вижу узкое место в 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:
 
Последнее редактирование:
Сразу видно "спец" писал. С каких пор кеширование в вирте можно включать?
С тех пор, как прочти пост выше. И с тех пор, как существуют сторонние компоненты для кэширования, такие как Jotcache
Решил флудом постов набить?
 
testaross, вроде ж понятно написано. Выключено общее кэширование чтоб не кэшировать корзины, меню, фильтры и т.п.
А в свою очередь,
В нужном месте включает как раз таки принудительно кэширование того что хотим, при этом можем сами создавать кэш и использовать его. Тонко. Удобно.
 
Назад
Сверху