Производительность

Сделайте так, чтобы ваш сайт работал как можно более плавно и отзывчиво.

Может ли Elgg масштабироваться до X миллионов пользователей?

Люди часто спрашивают, может ли Elgg масштабироваться до больших установок.

Во-первых, мы можем остановиться и спросить: «Откуда вы планируете получить всех этих пользователей?» Если серьезно, то это действительно интересная проблема. Масштабирование Elgg — это, если что, вопрос технической инженерии. Это интересно, но более или менее решенная проблема. Информатика работает для Elgg не иначе, чем для Google, например. Получить миллионы пользователей? Это как Святой Грааль всей технологической индустрии.

Во-вторых, как и в большинстве случаев в жизни, ответ — «это зависит»:

  • Насколько активны ваши пользователи?

  • На каком оборудовании работает Elgg?

  • Хорошо ли ведут себя ваши плагины?

Повышение эффективности движка Elgg — это постоянный проект, хотя есть ограничения на то, что может сделать любой скрипт.

Если вы серьезно относитесь к масштабируемости, вам, вероятно, захочется самостоятельно рассмотреть ряд вещей.

Сначала измерьте

Нет смысла бросать ресурсы на проблему, если вы не знаете:

  • в чем проблема

  • какие ресурсы нужны для решения проблемы

  • где нужны эти ресурсы

Инвестируйте в какой-либо профилировщик, который покажет, где находится ваше узкое место, особенно если вы рассматриваете возможность вложения значительных средств в решение проблемы.

Настройте MySQL

Elgg активно использует внутреннюю базу данных, совершая множество обращений при каждой загрузке страницы. Это совершенно нормально, и хорошо настроенный сервер базы данных сможет справляться с тысячами запросов в секунду.

Вот несколько советов по конфигурации, которые могут помочь:

  • Убедитесь, что MySQL настроен на использование соответствующего my.cnf для размера вашего сайта.

  • Увеличьте объем памяти, доступной для PHP и MySQL (в любом случае вам придется увеличить объем памяти, доступной для процесса php)

Включите кэширование

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

Простой кэш

По умолчанию представления кэшируются в каталоге данных Elgg на определенный период времени. Это устраняет необходимость регенерации представления при каждой загрузке страницы.

Это можно отключить, установив $CONFIG->simplecache_enabled = false; Для наилучшей производительности убедитесь, что это значение установлено в true.

Это может привести к артефактам во время разработки, если вы редактируете темы в своем плагине, поскольку кэшированная версия будет использоваться в предпочтении той, что предоставлена вашим плагином.

Простой кэш можно отключить через меню администрирования. Рекомендуется сделать это на вашей платформе разработки, если вы пишете плагины для Elgg.

Этот кэш автоматически очищается при включении, отключении или изменении порядка плагинов, или при выполнении upgrade.php.

Для наилучшей производительности вы также можете создать символическую ссылку из /cache/ в корневом каталоге www в каталог assetroot, указанный в вашей конфигурации (по умолчанию он расположен в /path/to/dataroot/caches/views_simplecache/:

cd /path/to/wwwroot/
ln -s /path/to/dataroot/caches/views_simplecache/ cache

Если ваш веб-сервер поддерживает следование символическим ссылкам, это позволит обслуживать файлы напрямую с диска без запуска PHP каждый раз.

По соображениям безопасности некоторые веб-серверы (например, Apache версии 2.4) могут следовать символическим ссылкам по умолчанию только если владелец источника и цели ссылки совпадают. Если символическая ссылка кэша не работает на вашем сервере, вы можете изменить владельца самой символической ссылки кэша (а не каталога /views_simplecache/) с помощью

cd /path/to/wwwroot/
chown -h wwwrun:www cache

В этом примере предполагается, что каталог /views_simplecache/ в каталоге данных принадлежит аккаунту wwwrun, который относится к группе www. Если это не так на вашем сервере, вам нужно соответствующим образом изменить команду chown.

Системный кэш

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

Это можно отключить, установив $CONFIG->system_cache_enabled = false; Для наилучшей производительности убедитесь, что это значение установлено в true.

В настоящее время это хранится в файлах в вашем dataroot. Как и в случае с простым кэшем, он очищается при включении, отключении или изменении порядка плагинов, или при выполнении upgrade.php.

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

Кэш загрузки

Elgg имеет возможность кэшировать многочисленные ресурсы, созданные и полученные в процессе загрузки. Чтобы настроить, как долго этот кэш действителен, вы должны установить TTL в вашем файле settings.php: $CONFIG->boot_cache_ttl = 3600;

Кэш запросов базы данных

В течение времени выполнения данной страницы сохраняется кэш всех запросов SELECT. Это означает, что для данной загрузки страницы данный запрос select будет отправлен в базу данных только один раз, даже если он выполняется несколько раз. Любая запись в базу данных очистит этот кэш. Этот кэш будет автоматически очищен в конце загрузки страницы.

Вы можете столкнуться с проблемами памяти, если используете фреймворк Elgg как библиотеку в скрипте PHP CLI. Это можно отключить, установив $CONFIG->db_disable_query_cache = true;

Заголовки Etags и Expires

Эти технологии указывают браузерам ваших пользователей кэшировать статические ресурсы (CSS, JS, изображения) локально. Включение этих функций значительно снижает нагрузку на сервер и улучшает воспринимаемую пользователем производительность.

Используйте плагин Firefox yslow или Chrome DevTools Audits, чтобы подтвердить, какие технологии в настоящее время работают на вашем сайте.

Если статические ресурсы не кэшируются:
  • Убедитесь, что эти расширения установлены и включены на вашем хосте

  • Обновите файл .htaccess, если вы обновляетесь с предыдущей версии Elgg

  • Включите Simplecache, который превращает выбранные представления в кэшируемые браузером ресурсы

Кэширование байт-кода

На рынке доступно множество кэшей кода PHP. Они ускоряют ваш сайт, кэшируя скомпилированный байт-код из вашего скрипта, что означает, что вашему серверу не нужно компилировать код PHP каждый раз при его выполнении.

Прямая раздача файлов

Если ваш сервер можно настроить для поддержки заголовков X-Sendfile или X-Accel, вы можете настроить его использование в settings.php. Это позволяет вашему веб-серверу напрямую передавать файлы клиенту вместо использования PHP readfile().

Оптимизация автозагрузчика Composer

Автозагрузчик Composer отвечает за загрузку классов, предоставляемых зависимостями Elgg. Автозагрузчик работает путем поиска имени класса в установленных зависимостях. Хотя это в основном быстрый процесс, его можно оптимизировать.

Вы можете оптимизировать автозагрузчик двумя разными способами. Первый — в командной строке, второй — в файле composer.json вашего проекта.

Если вы хотите оптимизировать автозагрузчик с помощью командной строки, используйте флаг -o. Недостаток в том, что вам нужно добавлять флаг -o каждый раз при запуске Composer.

# During the installation
composer install -o

# Or during the upgrade process
composer upgrade -o

Второй вариант — добавить оптимизацию в файл composer.json, чтобы вы никогда не забыли об этом.

{
        "config": {
                "optimize-autoloader": true,
                "apcu-autoloader": true
        }
}

См.также

Посетите страницу Оптимизация автозагрузчика для получения дополнительной информации о том, как оптимизировать автозагрузчик Composer.

Примечание

Начиная с Elgg 3.0 все загрузки Elgg с веб-сайта имеют оптимизированный автозагрузчик.

Хостинг

Не ожидайте, что сможете запустить сайт для миллионов пользователей на дешевом общем хостинге. Вам понадобится собственное серверное оборудование и доступ к конфигурации, а также большой объем пропускной способности и памяти.

Память, ЦП и пропускная способность

В связи с природой кэширования, все решения для кэширования требуют памяти. Это довольно дешевое решение — выделить память и ЦП для решения проблемы.

На современном оборудовании вероятно, что пропускная способность станет вашим узким местом раньше, чем сам сервер. Убедитесь, что ваш хостинг может поддерживать предполагаемую нагрузку.

Конфигурация

Наконец, взгляните на свою конфигурацию, так как есть несколько подводных камней, которые могут поймать людей.

Например, из коробки Apache может обрабатывать довольно высокую нагрузку. Однако большинство дистрибутивов Linux поставляются с mysql, настроенным для небольших сайтов. Это может привести к тому, что процессы Apache будут зависать в ожидании общения с одним очень перегруженным процессом MySQL.

Проверьте плохо работающие плагины

Плагины могут быть запрограммированы очень наивным способом, и это может привести к тому, что весь ваш сайт будет казаться медленным.

Попробуйте отключить некоторые плагины, чтобы увидеть, заметно ли это улучшает производительность. Как только вы найдете вероятного виновника, обратитесь к автору оригинального плагина и сообщите о своих выводах.

Используйте клиентский рендеринг HTML

Мы обнаружили, что в определенный момент большая часть времени, затрачиваемого на сервере, просто тратится на построение HTML страницы с помощью системы представлений Elgg.

Очень сложно кэшировать вывод шаблонов, поскольку они обычно могут принимать произвольные входные данные. Вместо попытки кэшировать вывод HTML определенных страниц или представлений, предлагается переключиться на систему шаблонов на основе HTML, чтобы браузер пользователя мог кэшировать сами шаблоны. Затем пусть компьютер пользователя выполняет работу по генерации вывода, применяя данные JSON к этим шаблонам.

Это может быть очень эффективным, но имеет недостаток в виде значительных дополнительных затрат на разработку. Команда Elgg стремится интегрировать эту стратегию непосредственно в Elgg, поскольку она очень эффективна, особенно на страницах с повторяющимся или скрытым контентом.