День добрый честному народу.
Есть такая проблема...
Есть магазин на уберкарте с корзинкой uc_ajax_cart. В "чистом" виде (все виды кэширования отключены), на достаточно хорошем выделенном сервере без нагрузки строит страницу каталога примерно за 6-8 секунд.
Требования - отдача любой страницы не более, чем за секунду под рабочей нагрузкой (30 незаренистрированных пользователй, 3 покупателя (это те, кто имеет сессию), один зарегистрированный пользователь - админ).
Генерация страницы каталога включает в себя примерно 5100 запросов к базе, которые занимают в среднем 4 секунды.
Пробовалось:
cacherouter + APC - работает, время отдачи страницы порядка 3,5с. Обнуляет кэш по хрону, но полагаю это несложно вылечить. Неплохо, но недостаточно.
APC + object cache - работает, отдает страницу за 2,5-3c но с глюками: если пользователь положил что-либо в корзину (в этот момент стартует пользовательская сессия и появляется соответствующая кука), а потом вернулся на ранее просмотренную страницу (а ему ее отдадут преимущественно из кэша браузера) - он увидит в блоке корзины помимо корректного содержимого сообщение об ошибке вида "не найдена функция user_access(). Сообщение убирается нажатием на F5, но кому нужна такая работа?
boost с различными вариантами разумных настроек - не работает корзина уберкарта - кэшируется насмерть вместе со страницей, либо не кэширует всю страницу, на которой есть корзина (а она есть на всех страницах), либо не кэширует страницы, если есть сессия пользователя. Ни один вариант не годится. Попытки комбинирования с block cache и запретом кэширования отдельно блока корзины - ничего не дают.
Authcache - поведение слабо отличается от boost.
Включение и отключение использования аякса для незарегистрированных пользователей в модуле корзины - никакого видимого эффекта не дает.
Есть у кого опыт радикального ускорения уберкарта?
Комментарии
А еще каждому юзеру оптоволоконный канал :)!
да уж, мертвому припарка. - вуд
А почему не сюда?
Автор, данные девела по времени генерации и скорости выполнения запросов, ещё лучше лог запросов скопипастить и приложить
как говорится уж чего-чего а логов - есть (это пример весьма тормозной страницы каталога уберкарта).
Магазин ничего особенного из себя не представляет: ubercart+advanced catalog+ajax cart. Все остальное к магазину имеет мало отношения.
В основном логи набиты выборками терминов таксономии, относящихся к странице. Прорва коротких запросов. И это при том, что словари, классифицирующие товары по различным признакам - еще даже не все созданы. Правда изделий в каталоге не очень мало: сейчас около 5000, в максимальной конфигурации будет порядка 15000.
Сайт, за исключением корзины - чистая статика. На нем нет и не будет никакого интерактива.
Собственно если бы удалось закэшировать страницы так, чтобы корзинка при загрузке себя из кэша перечитывала свое содержимое принудительно - это бы всех устроило. Потому что с бустом быстродействие приемлемое.
подпишусь
вобщем наиболее действенным решением (на сегодняшний день) оказалось использование CDN.
1) У меня лично основные тормоза были связаны с выводом блока меню, в котором было очень много терминов таксономии. Пришлось переписать блок на простой tpl-скрипт вывода терминов таксономии и обертки его в "меню-like" блок.
2) Еще я отказался от тормозного Advanced Catalog и сделал каталог через Views, это не сильно сложно. Заодно поимел плюшки - exposed-фильтры, выборка по имени, сортировка по разным параметрам, вывод в мини-карточке товара любых CCK-полей (да и вообще чего угодно из ноды) с помощью тупой темизации
3) Насчет классификации товаров через таксономию - есть мнение, что модуль таксономии написан неоптимально и вносит значительную долю тормозов в общую тормознутость проекта. Лучше использовать CCK-поля, и делать выборки по ним, а не по терминам таксономии. Особенно если это связано с числовыми значениями и диапазонами значений.
Магазин с около 200 категорий, 7000 товаров, 50/5 (примерно) гостей/юзеров онлайн, около сотни CCK-полей, поиск через Apache Solr, крутится без особых проблем на "облачном" VDS от selectel.ru, жрет примерно 20 рублей в день Да, Ajax Cart используется, отличная штука
p.s. 5100 запросов к БД это что-то за пределами добра и зла, как так получилось?
Проблема тут не в кеше, а в том, что каталог построен на таксономии.
И вообще причем здесь CDN, он ведь никак не влияет на время генерации страницы на стороне сервера, и уж тем более не уменьшает количество запросов к бд
-- элементарно: когда небезызвестный advanced catalog определяет что и как ему отображать на конкретной странице - он начинает перебирать все возможные комбинации терминов таксономии запросами вида:
2.451taxonomy_node_get_terms_by_vocabulary
И такого будет 4000+ штук. Ну и еще тысчонка набегает по-мелочи.
Что каталог плохо написан - очевидно... но комбинация apache_solr+faceted _searh+display_suite не шибко быстрее. Можно сравнить - у меня на legrand1.ru есть и то и другое.
CDN позволяет вообще не транслировать серверу запросы на статику от незарегистрированных пользователей. Т.е. даже простой передачи файлов из кэша не будет. А 99% покупателей в инет-магазине - просто смотрят и никаких запросов к базе строго говоря вообще не требуется.
Эффективность этого дела очень проста: CDN обработал 531,284 запросов, за то же самое время сервер - только 351,729. При этом трафик облака был 8Гб, а трафик сервера - 3,1Гб.
А учитывая, что системы серверного кэширования друпала с магазином работают довольно коряво, разница получается существенной.
com_net, а сделать аналог на Views и сравнить по запросам можно ли сделать, для интереса? Просто такое ощущение, что Views-то полегче будет, и там точно нет такой тупни, как перебор терминов последовательным поиском
Насчет CDN - хорошая информация, согласен, беру на заметку, спасибо
с CDN есть такая штука... Если сайт без нагрузки и сам по себе не совсем медленный, то с CDN он будет работать... медленнее. Из-за сложной и многоходовой последовательности DNS запросов и большого раундтрипа между разбросанными компонентами облака. Во всех остальных случаях будет выигрыш. Основной - за счет практически полной независимости от количества просмотров незарегистрированными пользователями. По поводу "сделать каталог на вьюсах"... сначала я попробую связку Drupal7+ Drupal Commerce. Как-то не очень есть время на не примитивные эксперименты...
Хоть вы что со мной делайте, я не могу понять, каким образом CDN может решить проблему производительности, если на каждый просмотр страницы делается 5 кило запросов к базе. Боже, я таких цифр-то не встречал и вообще не думал что такое возможно!
Ну да ладно. Что такое статика? Это картинки, CSS, JS и HTML целых страниц. Обычно, наибольшее количество файлов статики это картинки (80-90%). При тяжелом дизайне (если говорить о магазинах) их может быть от 30 до 50 и возможно больше. Примем условно 50 как максимальное количество картинок. Размер картинок тоже может быть разным, бывают легкие картинки, а есть дизайны с толстыми шапками, подвалами и прочими элементами. CSS и JS это еще несколько файлов, ну допустим пять. Самыми тяжелыми для сервера, вплане статики может быть первый заход, когда вся статика загружается в первый раз. При следующих просмотрах, статика не должна отдаваться, должен приходить ответ not modified. Да, Запросы к серваку все-же делаются, согласен, но картинки не качаются заново.
А теперь - что такое запросы к БД? По факту, БД это тоже файлы, которые лежат на том-же жестком диске (если у вас конечно вся база не в мемкеше), и разница между отдачей статики и выполнением запроса в том, что для того чтобы выполнить запрос серваку нужно сожрать намного больше ресурсов (проц, память, это дольше) чем при отдаче статики. А теперь давайте сопоставим количество статики и количество запросов. 55 к 5000 это будет примерно 1%. Ну грубо. Так вот, по идее если вы снимаете с сервака работу по отдаче статики, грубо говоря вы избавляетесь от 55 запросов, но в контексте просто колоссального количества запросов к БД это пренебрежимо малая величина. То есть этой величиной можно просто пренебречь. Я правильно рассуждаю?
Вы писали, что на выполнение 5к запросов уходить 4 секунды. И еще писали, что одна секунда общего времени вас устроит. И что, вы поставили CDN, и время выполнения этих несчастных 5к уменьшилось с четырех секунд до 500 мсек?
Прислушайтесь к тому что говорит маразмус. Если есть возможность переделать каталог на CCK поля вместо таксономии, может это и будет решением?
В Iframe никак не получится запихать корзину? У меня тоже на одном сайте был буст, а в iframe показывался динамический блок (не корзина). Не знаю, возможно-ли туда запихать корзину, но может прикините?
Там делов-то - фильтр по типу "Товар", сортировка по цене или наименованию, аргумент по термину таксономии и добавочный Views для вывода подкатегорий текущей категории. Не вижу ничего сложного, и намного лучше, чем Advanced Catalog. К тому же всякие плюшки можно навернуть со временем, типа сортировки по произвольным полям и exposed-фильтров на любые поля. Плохо штоле?
-- общее время генерации страницы каталога уменьшилось с 5-7 секунд до 1,3-1,6. Тоже не слишком здорово, но уже не катастрофично.
-- в этом весь и фокус. Для неавторизованного пользователя любая страница каталога - статический html. Нажатие на кнопку "купить" - создает пользователя, открывает пользовательскую сессию и, соответсвенно, запрещает кэширование. А картинки - кроме картинок товаров, которые на каждой странице разные, дизайна просто нет вовсе. Логотип на 10Кб.
-- это было бы так, если бы картинки были одни и те же. Мало кто смотрит одну и ту же страницу каталога два раза.
-- а не требуется, каталог сведен к одноуровневому. Там еще придется подумать как организовывать разбиение на страницы и переход между ними при изменении сортировки. А атрибутивный фасетный поиск у меня организован через apache solr. Еще бы догадаться как сделать, чтобы он искал не только целые слова, но и их фрагменты - было бы вообще все хорошо. Скорее всего для этого надо всего-то прочесть документацию, но пока некогда :-).
-- как то я не жалую i-frame с давних пор :-).
может уже не актуально, но при использовании буста можно:
1) использовать самописные выводы блоков, указывать, что их не кэшировать
2) использовать ajax блоки (вроде даже в последних версиях ajax корзины для уберкарта решили проблему с кешированием буста)
3) использовать модуль ajaxblocks, ajax regions
я юзаю 3-й вариант. корзина для анонимов при включенном бусте больше не такая надоедливая для новых анонимов=)
вобще буст конечно монстр.