Проблемы с производительностью от 1 000 до 10 000 веб-сайтов / магазинов

9

Я пытаюсь найти способ улучшить производительность Magento, когда количество сайтов / магазинов превышает 1 тыс., А моя цель - около 10 тыс. Вот несколько вопросов; любые советы / подсказки приветствуются!

  1. Добавление новых сайтов / магазинов идет медленно;
    Я закомментирую $ this-> cleanModelCache () в _afterSave () в Mage_Core_Model_Abstract, и ситуация кажется лучше, но становится все медленнее с увеличением количества сайтов / магазинов. И я не знаю, что это повлияет на всю систему в будущем.

  2. Api звонки становятся медленными.
    Одним из основных процессов является размещение заказа; Моя настраиваемая модель работает с ней, обрабатывая некоторые данные и, в основном, используя модели sales / quote и модели sales / service_quote. Процесс начинается с Oauth. И Oauth, и размещение заказа занимают больше времени, когда количество сайтов / магазинов растет, а потребление памяти кажется больше. Имеет ли это какое-то отношение к загрузке Mage config xml и тому факту, что данные конфигурации увеличиваются с увеличением количества веб-сайтов?

  3. Открытие n98-magerun dev: консоль занимает больше времени; не знаю причину этого.

  4. Сохранение конфигурации из панели администратора занимает больше времени; не знаю как это улучшить.

Можно ли восстановить способ генерации и загрузки данных конфигурации Magento, чтобы снизить потребление памяти? Является ли это одним из факторов, вызывающих проблемы с производительностью в моей ситуации?

Текущий экземпляр Magento: Версия = Magento EE 1.14.2.4;
Кэш конфигурации включен; другой кеш выключен;
Использование Mysql 5.6 и MongoDB (для catalog_category_entity, catalog_product_entity, core_website);
количество сайтов = количество магазинов = количество просмотров = 1024;
номер продукта = 4501;

Спасибо всем заранее!

Jack.W
источник
2
почему поддержка magento не может вам помочь ???
MagenX
Как я могу получить помощь от них? Я новичок в сообществе .. спасибо!
Jack.W
1
у вас есть корпоративная версия, вы не знаете, где ее взять, но если за ней нет поддержки magento, просто потраченные впустую деньги и время. Вы должны хорошо ударить их по яйцам, чтобы заставить их бежать, как кролики, помогающие вам. какой смысл иметь корпоративную версию ???
MagenX
1
но очевидный ответ на ваш запрос - отдельные магазины magento с отдельными базами данных, например, партиями на 10-20 магазинов ...
MagenX
Ах да .. Я собираюсь попросить моего босса за счет .. ха-ха.
Jack.W

Ответы:

3

Одна из причин, по которой он работает медленно, заключается в том, что конфигурация для каждого магазина дублируется из / config / website и / config / global, а код для этого неэффективен. Любое изменение настроек может привести к снижению производительности и пропускной способности на несколько десятков минут, если не часов. Повышение его эффективности в основном будет означать, что Бен Маркс придет за вами ... и не в хорошем смысле.

Если вы собираетесь пойти по этому пути, проще всего было бы установить 10k Magento и иметь своего рода брокера, который делегирует запросы на соответствующий веб-сайт. Хотя, конечно, это будет зависеть от того, каков ваш реальный вариант использования.

[Добавлено]

В зависимости от варианта использования вы можете использовать категории в качестве псевдо-магазинов. Затем вы можете технически использовать макет XML для изменения темы для магазина. Но тогда вы столкнетесь с ограничением оформления заказа. Все магазины должны будут разделить заказ.

В любом случае, магазины 10k Magento выполнимы, в этом нет ничего невозможного. Но это будет трудный путь, какой бы путь вы ни выбрали.

Кевин Шредер
источник
Привет Кевин, спасибо за ваш ответ! Да, я вижу код, который обновляет дерево конфигурации, которое является loadToXml (), если я не ошибаюсь. Моя мысль и вы сказали, что не стоит менять его? Что вы имеете в виду, когда Бен Маркс идет за мной? Кроме того, кажется, что каждый http-запрос, который приходит в Magento, в конечном итоге загружает дерево конфигурации, это правильно? В любом случае, я могу уменьшить его размер? Наверное, мне стоит подумать о том, чтобы получить 10 000 экземпляров Magento ... какие-нибудь мысли о том, сколько ресурсов потребуется? Спасибо большое Кевин!
Jack.W
Но наличие 10 тыс. Установок Magento означает 10 тыс. Экземпляров mysql, верно? Я понятия не имею, как это сделать, или если это хорошая идея ..
Jack.W
1
Нет, это будет означать наличие 10 тысяч баз данных mysql, но все 10 тысяч из них могут быть в одном экземпляре mysql.
Кристиан
1
«Бен Маркс», следующий за вами, является ссылкой на этот camo.githubusercontent.com/…
Кевин Шредер,
1
Инсталляция 10k Magento означает базы данных MySQL 10k, однако это будет распространено. Намного проще было бы создать сценарий развертывания 10k отдельных установок Magento, чем заставить существующий базовый код работать с 10k хранилищами.
Кевин Шредер
1

Вы можете попробовать взломать ядро ​​и включить разбиение кеша сайта. Вы можете попробовать взломать базу данных и сохранить информацию о конфигурации в памяти. Вы можете попробовать заменить кэш конфигурации чем-то более умным - скажем, кэширование информации из файлов xml [которые являются статическими и применимы ко всем веб-сайтам и хранилищам) при динамическом извлечении данных переопределения.

Я серверный парень, так что я бы занялся изучением базы данных. Тем более что это тривиально.

Если у вас есть контроль над сервером базы данных: переименуйте таблицу core_config_data в core_config_data_offline. Создайте новую таблицу core_config_data, используя механизм хранения MEMORY http://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html. Скопируйте все данные из core_config_data_offline в core_config_data

Установите задание cron, чтобы проверить, существует ли core_config_data, копирует ли все данные оттуда в core_config_data_offline. Если это не так, создайте его и скопируйте все из core_config_data_offline в core_config_data

Отключить кеш конфига. Когда кеш конфигурации включен, вы получаете повышение производительности только при первом чтении данных конфигурации из базы данных - после этого они попадают в кеш, и вы страдаете. С другой стороны, XML-файлы больше не кэшируются, поэтому вы обменяли снижение производительности на несериализацию огромных данных конфигурации на снижение производительности при разборе нескольких XML-файлов.

Вы также можете поэкспериментировать с изменением файла Mage / Core / Model / Config.php и включить отдельные кэши веб-сайтов. По умолчанию каждый конкретный магазин данных конфигурации кешируется индивидуально. Все данные конфигурации сайта кэшируются в одном объекте.

Обратите внимание, что это только для переопределения конфигурации [настройки администратора]. Так что, если вы сделаете все свои изменения конфигурации на уровне магазина, ваш уже установлен. Если вы используете «унаследовать от веб-сайта» и вносите большую часть изменений конфигурации вашего магазина на уровне сайта - тогда кэш содержит каждый веб-сайт. Разделив его, вы можете разбить его намного лучше. protected $ _cacheSections = array ('admin' => 0, 'adminhtml' => 0, 'crontab' => 0, 'install' => 0, 'stores' => 1, 'website' => 0);

в

protected $_cacheSections = array(
    'admin'     => 0,
    'adminhtml' => 0,
    'crontab'   => 0,
    'install'   => 0,
    'stores'    => 1,
    'websites'  => 1
); 
Гэри Морт
источник
Привет Гэри, спасибо за такой полезный ответ! У меня есть несколько вопросов: 1) По моим наблюдениям, запрос к базе данных не проблема, даже с более чем 1 тыс. Веб-сайтов / магазинов; так что, если это так, поможет ли использование памяти? 2) Я не знаю, правильно ли это, но кеш конфигурации, кажется, хранит только информацию о системе и модулях; так это как-то связано с конфигурацией сайта / магазина? 3) Есть ли способ для magento распознавать определенный идентификатор магазина / веб-сайта из запроса http и, таким образом, загружать только соответствующий файл конфигурации? Большое спасибо Гэри!
Jack.W
2
Эти рекомендации не решают проблему, отмеченную ФП. Отключение кэша конфигурации в конечном итоге убьет систему. Это заставит Magento загрузить все файлы конфигурации, объединить их, затем объединить все / global, затем объединить все / website и затем объединить все это в каждый узел / stores. Это произойдет для каждого запроса. С 10k сайтов вы можете смотреть на минуты настенных часов за запрос .
Кевин Шредер
Привет, Кевин, спасибо за ответ; На самом деле я планирую переместить таблицу core_config_data в память, включить кэш для конфигурации системы и модуля, остановить слияние core_config_data в дерево конфигурации и заставить функции, которые считывают эту часть данных, напрямую запрашивать из базы данных. Что вы думаете?
Jack.W
1
Проблема не в core_config_data. Проблема в том, что конфиги магазина объединяются с / веб-сайтами, которые объединяются с / global в XML. С базой данных все будет в порядке. Это PHP, который будет ненавидеть жизнь из-за слияния конфигурации. На вашем шаге отладчика выполните Mage_Core_Model_Resource_Config :: loadToXml, обратив особое внимание на строки 110 и далее
Кевин Шредер,
1
Теперь, чтобы вернуться к моей таблице памяти. Кэширование данных означает, что они хранятся где-то, к чему можно быстро получить доступ. Magento кэширует данные конфигурации в сериализованный объект php - если ваши данные конфигурации огромны, это означает, что PHP должен десериализовать огромное количество данных для каждого запроса. Если вы знаете, как использовать xdebug, профилируйте некоторые из ваших медленных загрузок страниц и посмотрите, сколько времени уходит на запуск функции unserialize: php.net/manual/en/function.unserialize.php - если она огромна [более 100 мс], то «кэширование» конфигурации нарушает вашу систему.
Гэри Морт