Этим сообщением мне бы хотелось начать серию публикаций посвященных вопросам оптимизации продукта. Возможно, что ряд следующих публикаций будет подготовлен моими коллегами, так как потребуется давать более дельные советы и рекомендации разработчикам.
Без сомнения, в жизни любого продукта есть этапы развития. Сначала мы максимум внимания уделяли функциональности. Следующим шагом была безопасность. Потом интерфейсы и юзабилити. Не значит, что эти этапы пройдены и работы в этих направлениях не будут вестись. Скорее наоборот, работы ведутся еще активнее. Просто в каждом из этих направлений достигнуты заметные результаты.
Как вы видите, мы закрывали наиболее значимые проблемы для наших клиентов.
На сегодняшний момент мы считаем, что наиболее актуальная для наших клиентов проблемы - это производительность продукта. И именно этому вопросу будут посвящены значительные усилия в развитии ближайшего времени.
Производительность - это очень многогранная проблема.
В производительности участвует парсинг кода PHP, исполнение кода PHP, запросы к базе данных, конкуретная нагрузка и блокировки в базе данных, объемы передаваемых данных, число запросов к базе, производительность веб-сервера, буферы для страниц для PHP и масса других параметров и характеристик.
Причем, поведение одного и того же кода может принципиально отличаться для выделенного сервера или для виртуального хостинга. За счет чего?
Например, на выделенной машине база данных и запросы к данным кэшированы. Т.е. обычный select * from b_lang таблицы с двумя строчками данных выполняется за 0.000ХХ секунды. Так как данные просто уже в памяти базы данных и не требуется выполнять медленную операцию чтения данных с диска.
На виртуальном хостинге сотни пользователей обращаются к базе данных и учитывая, что кэш базы данных умеет вытеснять редко используемые данные, получается, что этот простой запрос, выполняется каждый раз в десятки раз медленнее. Просто потому, что базе данных нужно прочитать данные с диска.
Аналогичная ситуация с файлами PHP. Мы делаем Include файла PHP. Его нужно прочитать с диска. На выделенной системе этот файл в файловом КЭШе и читается быстро. Как результат, время выполнения скрипта, а в него все включается и парсинг и чтение файла и исполнение, будет минимальным.
На виртуальном хостинге опять же жуткая ситуация, каждый файл будет читаться с диска, процессора не будет хватать для быстрого парсинга.
Причем получается, что чем меньше посещаемость сайта, тем больше проект вытесняется из КЭШа базы данных и файлового КЭШа и тем медленнее работает.
Вот такой получается парадокс и очень противоречивые стратегии по оптимизации.
В этом сообщении я немного расскажу об обновлении главного модуля 5.1, которое будет выпущено в ближайшее время. Вообще, в ближайшее время планируется много обновлений, но это будет интересно с точки зрения производительности.
Начнем.
1. Оптимизация кода ядра.
Проведена глобальная проверка и оптимизация кода ядра продукта. Фактически, каждый участок кода был перепроверен. Весь продукт многократно исследовался специальными продуктами оптимизации. Каждая функция и системный вызов проверялись. Некоторые функции были оптимизированы или просто переписаны. Исследовалось и оптимизировалось покрытие кода, поведение под нагрузкой и в разных тестовых системах.
2. Число SQL запросов к базе данных.
Ядром продукта используются справочные таблицы, обычно небольшого размера с редко изменяющимся содержимым. Запросы к таким таблицам выполняются быстро, но только в случае, когда кэш базы данных не "перегружен" и задержки на передачу запроса по каналу и получение данных от SQL сервера невелики. В противном случае целесообразнее использовать файловый кэш.
В версии продукта 5.1 реализован так называемый "управляемый КЭШ".
Управляемый кэш - означает, что при изменении данных, кэш сам чиститься и обновляется. Т.е. кэширование работает прозрачно и незаметно для пользователя.
На статической странице наш продукт выполняет до 24 запросов. В новой версии ядра, не потребуется ни одного SQL запроса, более того, продукт сможет обойтись даже без открытия соединения к базе данных. И что очень важно, будут отсутствовать запросы на блокировку данных таблицы агентов и событий, что увеличит параллельность исполнения.
Файлы кэша создаются в подкаталоге /bitrix/cache/bitrix, т.е. требуются соответствующие права операционной системы на запись в данном каталоге.
По умолчанию в версии 5.1 кэш ядра будет включен. Для его отключения требуется в файле /bitrix/php_interface/dbconn.php определить следующие константы:
define("CACHED_b_lang", false);
define("CACHED_b_option", false);
define("CACHED_b_lang_domain", false);
define("CACHED_b_site_template", false);
define("CACHED_b_event", false);
define("CACHED_b_agent", false);
Такой вариант работы теоретически может пригодиться для крупных проектов на выделенных машинах.
Как я уже сказал, очистка и обновление КЭШа будет происходит автоматически при изменении данных. Естественно, что изменение будет выполняться только в случае, когда такое изменение происходит с использованием API продукта.
Также есть возможность настроить время кэширования.
Например:
define("CACHED_b_option", 3600*24);
По умолчанию кэширование будет выполняться на 1 час. Мы считаем этого достаточным.
В связи с тем, что на чистой странице или странице с кэшированными компонентами, возможно полное отсутствие SQL запросов появляется возможность не устанавливать подключение к базе данных. Или вернее сказать, подключение к базе данных будет автоматически устанавливаться при первом запросе через API функции.
Для работы такого режима достаточно в файле /bitrix/php_interface/dbconn.php определить следующую константу:
define("DELAY_DB_CONNECT", true);
Тогда подключение к БД будет выполнено при первом запросе через API продукта прозрачно для разработчика.
По умолчанию эта возможность будет выключена т.к. не редка ситуация "прямых"
вызовов функций базы данных из PHP. Но в новом дистрибутиве продукта мы планируем этот режим включить.
3. Оптимизация работы меню.
Следующий важный пункт - оптимизация дисковых операций для разделяемого хостинга. Тесты показали, что кэширование части операций в меню позволит ускорить работу.
В новой версии 5.1 будет по умолчанию включен режим кэширования права доступа и части проверок для меню для неавторизованных пользователей. Учитывая, что большая часть посетителей - это незарегистрированные пользователи, к ним применен специальный алгоритм кэширования. Кэш управляемый и обновляется при редактировании меню или изменении прав доступа к файлам и папкам через административный интерфейс и API. Т.е. обычные пользователи вообще не заметят, что существует какой-то алгоритм кэширования. Если только разработчики правят меню руками, то им потребуется скинуть кэш меню в интерфейсе. Кэш можно будет отключить, определив следующую константу:
define("CACHED_menu", false);
===================
Перечисленные оптимизации по нашим тестам обеспечили на выделенной тестовой машине более чем 40% ускорение. Мы ожидаем, что на виртуальном хостинге ускорение будет еще больше.
Так же отмечу, что в новой версии ядра для параметров show_page_exec_time=Y и show_include_exec_time=Y для админа будет выводиться дополнительная информация по числу SQL запросов и общему времени исполнения запросов на SQL сервере. Это поможет разработчикам быстрее выявлять узкие места в разработке.
Оптимизация через создание файлов КЭШа имеет еще одно большое преимущество для проектов, которые используют прекомпиляторы. Файлы КЭШа являются PHP файлами, отлично прекомпилируются и хранятся в памяти, что дает еще больший прирост производительности.
В завершении этой темы отмечу, что для всех проектов мы рекомендуем PHP прекомпиляторы, это очень существенный ресурс оптимизации PHP приложений.
Ждем обновление 5.1
Дальше на очереди, инфоблоки+ (выпуск уже скоро), реклама, статистика, поиск и другие модули...