АРХИВНАЯ КОПИЯ САЙТАрабочая версия здесь | |
начало > читальный зал > Медленная загрузка сайтов и как с ней бороться | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Проекту 23.7 лет навигация по сайту клуб провайдеров
новости сайта
новости провайдеров
партнеры
| Медленная загрузка сайтов
|
Наверное, любой веб-разработчик хотя бы иногда бывает недоволен скоростью, с которой открывается его сайт. В рамках виртуального хостинга существует несколько основных причин медленной загрузки сайта (главной его страницы или каких-то отдельных разделов). Некоторые из этих причин мы рассмотрим в данной статье.
Передача данных по коммутируемой линии
Первая (и самая очевидная) причина медленной загрузки сайта - низкая скорость передачи данных от сервера клиенту. Обычно так происходит в том случае, если используется соединение с сетью Интернет по коммутируемой (телефонной) линии, то есть по обычному Dial-Up'у. Как правило, скорость соединения по такой линии не превышает 57600 Кбит/сек, но такая скорость скорее является идеальной и в условиях работы российских телефонных линий практически не достижимой.
Дело в том, что скорость свыше 33600 Кбит/сек определяется протоколами X2, k56flex, V.90, V.92, которым для работы нужно очень хорошее качество телефонной линии. Медная пара, на основе которой существуют большинство российских телефонных линий, проложена зачастую в малопригодных условиях для ее эксплуатации и не может обеспечить качественное прохождение сигнала. И даже если первоначальное соединение было установлено на скорости 57600 Кбит/сек, большинство модемов автоматически переходят на передачу данных по протоколу V.34 и понижают скорость, если определяют, что пропускная способность линии стала хуже. Поэтому реально можно рассчитывать на скорость соединения примерно 33600 Кбит/сек. Нетрудно подсчитать, что скорость передачи данных по такой линии будет 4.2 Кбайт/сек, соответственно, страница размером 10 Кбайт будет загружаться более 2 секунд. Конечно же, практически всегда используется сжатие данных, предусмотренное протоколом, что несколько увеличивает скорость. Однако, как минимум, нужно учитывать тот факт, что передается не только сама страница сайта, но и некоторые дополнительные служебные данные (например, http-заголовки).
Если же при передаче информации модем пытается подобрать оптимальную скорость, то данные в этот момент не передаются, и время загрузки страницы может затянуться до нескольких десятков секунд.
Передача данных по выделенной линии
Казалось бы, что в случае подключения по выделенной линии подобного рода проблемы со скоростью загрузки должны исчезнуть, но, оказывается, тут также есть свои нюансы. Один из которых - малая пропускная способность канала, соединяющего сети, в которых находится сам сервер и компьютер, запросивший с него документ.
Обычно такая проблема может наблюдаться в случае перехода одной из сетей на использование резервного канала связи, который, как правило, имеет меньшую пропускную способность, чем основной канал. Также задержки при передаче данных могут появляться в случае нестабильной работы описываемых каналов - например, из-за сбоев в работе программно-аппаратной части.
Посмотреть маршрут и время задержки прохождения пакетов на различных участках от клиентского компьютера до сервера, на котором расположен сайт, можно с помощью утилиты traceroute (в *nix-системах) или tracert (в Windows), которая показывает список хостов, через которые проходят пакеты от локального компьютера до сайта.
Однако следует учесть, что правильная работа данной утилиты зависит от схемы построения вашей сети, поэтому имеет смысл проконсультироваться с вашим системным администратором в случае, если трейс не выдает полного списка хостов или же вообще не работает.
Проблема с загрузкой канала передачи данных также может возникать на выделенной линии, работающей по технологии ADSL. Аббревиатура ADSL (Asymmetric Digital Subscriber Line) расшифровывается как "Асимметричная цифровая абонентская линия", что подчеркивает изначально заложенное в этой технологии различие скоростей обмена данными в направлениях траффика к абоненту и от абонента. Как правило, скорость передачи от абонента ниже, чем скорость к абоненту. Ничего плохого в этом нет, поскольку большинству пользователей, подключенных по ADSL, скорость как раз нужна для того, чтобы быстро загружать на свой компьютер данные из сети Интернет.
В этом случае передача служебной информации (например, подтверждение принятия данных) от абонента к источнику создает траффик, который составляет малую часть от общей пропускной способности канала, большая же часть траффика в этом случае идет к абоненту. Если во время загрузки файла или страницы необходимая информация от абонента перестает поступать к источнику, то последний, как правило, на какое-то время прекращает передачу данных клиенту. Такое может случиться, если канал в направлении от абонента к серверу полностью загружен.
Динамические страницы, скрипты
Теперь рассмотрим причины медленной загрузки сайта, которые имеют непосредственное отношение к серверной стороне.
Очень часто низкая скорость загрузки сайта обусловлена медленным выполнением скриптов, формирующих динамический контент сайта. Как правило, это связано с ограничениями на использование ресурсов в рамках предоставляемых тарифных планов. Другими словами, пользователь хостинга не может использовать все ресурсы физической машины, на которой расположен его сайт. Такой механизм, реализованный теми или иными средствами, используют практически все хостинговые компании для предотвращения перегрузки или отказа всей физической машины из-за некорректно написанных скриптов отдельного пользователя.
Иными словами, каждый пользовательский процесс получает в свое распоряжение лишь часть ресурсов физической машины: часть оперативной памяти, определенное количество процессорного времени и т.д.
На низкую скорость выполнения скриптов могут влиять следующие факторы:
Конкретно в случае работы с PHP проблему во многом решает использование PHP-оптимизаторов (например, Zend Optimizer или Turck MMCache). Основная их задача - оптимизация и ускорение выполнения PHP-скриптов (компиляция скрипта в байт-код и кэширование результатов для последующего вызова именно скомпилированного варианта).
Пример использования PHP-оптимизатора Turck MMCache
Рассмотрим способ диагностики с помощью Turck MMCache.
Сразу же отметим, что это - далеко не единственный оптимизатор PHP. Более того, развитие данного проекта остановилось, последняя версия - 2.4.6 - была выпущена в ноябре 2003 года. Позднее на базе исходного кода Turck MMCache был создан новый продукт - eAccelerator. В нем, в основном, исправлены некоторые ошибки Turck MMCache.
Мы рассматриваем Turck MMCache только в качестве примера. Вы можете узнать,
установлены ли на Вашем хостинге те или иные PHP-оптимизаторы, обратившись
в службу технической поддержки Вашего хостинг-провайдера или посмотрев
вывод функции phpinfo()
.
Создайте в www-пространстве php-файл со следующей строчкой:
<?php mmcache() ?>
Вызвав этот скрипт из браузера, вы увидите таблицы, в которых содержится информация о работе Turck MMCache:
Во второй таблице представлен список всех выполненных скриптов, а также такие параметры, как размер (Size) каждого скрипта и количество удачных загрузок (Hits) из памяти Turck MMCache. Если параметр Hits имеет значение 0, то это означает, что Turck MMCache не смог закэшировать этот скрипт.
Чтобы определить объем загружаемых файлов для выполнения одного скрипта, нужно сначала очистить память Turck MMCache от уже закэшированных скриптов. Для этого необходимо нажать кнопку Clear и убедиться, что кэш-память очищена - в списке скриптов должен остаться только один созданный нами скрипт. После этого нужно вызвать конкретный скрипт через браузер и после завершения его работы обновить страницу с таблицами Turck MMCache. В результате этих действий вы получите список файлов, которые вызываются при выполнении данного запроса. Общий объем этих файлов можно подсчитать, просуммировав все показанные скрипты по полю Size.
Где использовать оптимизаторы PHP
Ощутимый прирост производительности PHP-оптимизаторы дают в работе форумов (например, phpBB, vBulletin), CMS - систем управления контентом (например, Битрикс (Bitrix), PHP-Nuke, Mambo).
В принципе, практически любая большая система, написанная на PHP, будет работать быстрее при использовании оптимизаторов PHP. Но, тем не менее, стоит помнить о том, что не всегда те скрипты, которые корректно работали без оптимизаторов, будут на 100% совместимы с дополнительными модулями к PHP. При подключении того или иного модуля постарайтесь убедиться в том, что написанный вами код совместим с ним.
Еще одним "узким" местом в работе сайта зачастую является неоптимальное использование базы данных.
Например, посетитель вашего сайта обращается к динамической странице, для построения которой генерирующий ее скрипт выполняет один или несколько SQL-запросов. Если по каким-то причинам SQL-сервер будет долго их обрабатывать или же в результате обработки запроса скрипту будет передаваться слишком много данных, запрошенная страница будет генерироваться слишком долго.
На виртуальном хостинге в качестве базы данных чаще всего используется MySQL. И одной из наиболее частых причин медленного выполнения SQL-запросов является отсутствие индексов в таблицах MySQL. Если база содержит таблицы с большими объемами данных, то выполнение запросов типа SELECT по полям такой таблицы без индексов может занять достаточно продолжительное время, что в конечном итоге скажется на времени формирования страницы. Именно поэтому рекомендуется периодически отслеживать и оптимизировать такие запросы. Это можно делать с помощью команды MySQL SHOW FULL PROCESSLIST, которая выводит таблицу всех выполняющихся в данный момент запросов. Колонка Time указывает, как долго выполняется каждый запрос. Если время выполнения запроса составляет более одной секунды - есть повод проверить количество просматриваемых этим запросом строк в таблице. Для этого нужно использовать команду EXPLAIN, которая также выдаст таблицу с результатами. Значение в столбце Rows покажет, сколько строк в таблице просматривается при выполнении данного запроса. Если количество строк более 1000, то нужно попробовать построить индексы для тех полей, по которым идет выборка. Как правило, в большинстве случаев после построения индексов удается добиться уменьшения числа просматриваемых строк в десятки раз, что положительно сказывается на времени выполнения запроса.
Рассмотрим конкретный пример:
mysql> SELECT title FROM products WHERE id = 123212; +-----------+ | title | +-----------+ | Product N | +-----------+ 1 row in set (0.60 sec) mysql> EXPLAIN SELECT title FROM products WHERE id = 123212; +----------+------+---------------+------+---------+------+--------+-------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +----------+------+---------------+------+---------+------+--------+-------------+ | products | ALL | NULL | NULL | NULL | NULL | 175246 | Using where | +----------+------+---------------+------+---------+------+--------+-------------+ 1 row in set (0.00 sec)Мы делаем запрос из таблицы 'products' с условием по полю 'id', для которого не построен индекс. Запрос выполняется 0.60 сек., и при его выполнении MySQL "просматривает" 175246 строк в таблице. Можно построить индекс по полю 'id' и сравнить результаты.
mysql> CREATE INDEX id_index ON products (id); Query OK, 175246 rows affected (2.05 sec) Records: 175246 Duplicates: 0 Warnings: 0 mysql> SELECT title FROM products WHERE id = 123212; +-----------+ | title | +-----------+ | Product N | +-----------+ 1 row in set (0.00 sec) mysql> EXPLAIN SELECT title FROM products WHERE id = 123212; +----------+------+---------------+----------+---------+-------+------+-------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +----------+------+---------------+----------+---------+-------+------+-------------+ | products | ref | id_index | id_index | 5 | const | 1 | Using where | +----------+------+---------------+----------+---------+-------+------+-------------+ 1 row in set (0.00 sec)После построения индекса по полю 'id' тот же запрос выполняется практически мгновенно, так как MySQL фактически "просматривает" только одну строку.
Более подробно об оптимизации работы с MySQL можно прочитать на сайте разработчиков.
Передача файлов большого объема по HTTP
Еще одная частая проблема, приводящая к медленной загрузке сайта, связана с объемом информации, скачиваемой с сайта, и частотой запросов на скачивание файлов. Допустим, у Вас на сайте расположено много файлов очень большого объема (по несколько мегабайт). Посетители сайта могут скачивать эти файлы, но на обработку их запросов будет уходить ощутимое время из-за того, что файлы имеют большой объем. В случае, если запросов приходит сразу несколько, то велика вероятность того, что сайт будет открываться с большими задержками или не открываться вовсе, поскольку сервер будет занят исключительно обслуживанием этих запросов. Часто такая проблема может возникнуть и из-за использования посетителями специальных программ, предназначенных для загрузки файлов (менеджеры загрузки) - некоторые такие программы скачивают большие файлы в несколько потоков, в результате чего количество работающих на виртуальном сервере процессов множится и очень быстро достигает лимита.
В случае, если у Вас действительно имеется необходимость постоянно предоставлять для скачивания файлы большого объема, то лучше всего рассмотреть возможность использования иных транспортов для передачи данных. Например, предоставить доступ к файлам по протоколу FTP, если такую возможность может предоставить Вам Ваш хостер (возможно, в виде дополнительной услуги). Тем самым Вы разгрузите веб-сервер Apache и переложите работу по обработке запросов на скачивание файлов на FTP-сервер.
В данной статье мы рассмотрели не все факторы, влияющие на медленную загрузку сайта. Тем не менее, все основные моменты, влияющие на работу сервера в рамках виртуального хостинга, описаны достаточно подробно. Надеемся, что эта статья будет полезна вам.
30.11.2005
Сергей Скуридин
Владимир Чупраков
Александр Демидов
компания Зенон Н.С.П.
обсудить статью
Примечание hostobzor.ru:
Перепечатка разрешена с сохранением авторства и указанием ссылки на данную страницу, как первоисточник.
© 2005 Все права защищены и принадлежат авторам статьи.
|
©2001-2024 Петр П.Паламарчук Все права защищены. Каталог статей. Статьи |
|
|
|
|
|
|
|
|
|
|
|
|
|