Оптимизация веб-сайтов на основе Kohana для скорости и масштабируемости


сайт, который я построил с Коханой, вчера был забит огромным количеством трафика, что заставило меня сделать шаг назад и оценить некоторые из проектов. Мне любопытно, каковы некоторые стандартные методы оптимизации приложений на основе Kohana?

Я также заинтересован в бенчмаркинге. Мне нужно настроить Benchmark::start() и Benchmark::stop() для каждого метода контроллера, чтобы увидеть время выполнения для всех страниц, или я могу применить бенчмаркинг глобально и быстро?

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

6 80

6 ответов:

то, что я скажу в этом ответе, не относится к Kohana и, вероятно, может применяться к множеству PHP-проектов.

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


Прежде всего, когда дело доходит до выступлений, есть много аспекты / вопросы, которые необходимо рассмотреть:

  • настройки сервера (как Apache, PHP, MySQL, другие возможные демоны, так и система); вы можете получить дополнительную помощь Об этом на ServerFault, Я полагаю,
  • PHP-кода
  • запросы к базе данных,
  • используя или не ваш веб-сервер?
  • можете ли вы использовать какой-либо механизм кэширования? Или вам всегда нужно больше, что в курсе данные на сайте?


С помощью обратного прокси-сервера

первое, что может быть действительно полезным является использование обратного прокси-сервера, как лак, перед вашим веб-сервер: да кэш столько вещей, сколько возможно, поэтому только запросы, которые действительно нуждаются в вычислениях PHP / MySQL (и, конечно же, некоторые другие запросы, когда их нет в кэше прокси) сделать это для Apache / PHP / MySQL.

  • прежде всего, ваш CSS/Javascript/Images -- ну, все, что статично-- вероятно, не нужно всегда обслуживаться Apache
    • таким образом, вы можете иметь обратный прокси-кэш все это.
    • обслуживание этих статических файлов не имеет большого значения для Apache, но чем меньше он должен работать для них, тем больше он сможет сделать с PHP.
    • помните: Apache может использовать только конечное, ограниченное количество запросы за один раз.
  • затем, чтобы обратный прокси обслуживал как можно больше PHP-страниц из кэша: вероятно, есть некоторые страницы, которые не меняются так часто и может быть обслужен из кэша. Вместо того, чтобы использовать какой-то PHP-кэш, почему бы не позволить другому, более легкому, серверу обслуживать эти (и время от времени извлекайте их с PHP-сервера, поэтому они всегда почти актуальны)?
    • например, если у вас есть некоторые RSS кормит (мы вообще склонны забывать о них, когда пытаемся оптимизировать для выступлений) по просьбе очень часто, имея их в кэше в течение нескольких минут может сэкономить сотни / тысячи запросов к Apache + PHP + MySQL!
    • то же самое для самых посещаемых страниц вашего сайта, если они не меняются в течение хотя бы нескольких минут (пример: Домашняя страница?), то нет необходимости тратить процессор повторно генерировать их каждый раз, когда пользователь запрашивает их.
  • может быть, есть разница между страниц для анонимных пользователей (одна и та же страница для всех анонимных пользователей) и страницы служили для идентифицированных пользователей ("Здравствуйте, г-н X, у вас есть новые сообщения", например)?
    • если это так, вы, вероятно, можете настроить обратный прокси-сервер для кэширования страницы, которая обслуживается для анонимных пользователей (на основе cookie, например, cookie сеанса, как правило)
    • это будет означать, что Apache + PHP имеет меньше проблем: только идентифицированные пользователи - которые могут быть только небольшой частью ваших пользователей.

о использование обратного прокси-сервера в качестве кэш -, для PHP-приложения, вы можете, например, взглянуть на результаты тестов показывают 400%-700% увеличение возможностей сервера с APC и Squid Cache.
(Да, они используют кальмаров, и Я говорил о лаке - это просто еще одна возможность ^^ лак более поздний, но более посвященный кэшированию)

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


В качестве побочного Примечания: вы есть говоря в ОП:

сайт, который я построил с Коханой, был захлопнут огромное количество трафика вчера,

Это внезапная ситуация, когда обратный прокси-сервер может буквально спасти день, если ваш сайт может не быть в курсе на втором:

  • установить его, настроить его, пусть он всегда -- каждый нормальный день... run:
    • настроить его, чтобы не держать PHP страницы в кэше; или только на короткое время; таким образом, у вас всегда есть последние данные отображаются
  • и, в тот день, когда вы берете slashdot или digg эффект:
    • настройка обратного прокси для хранения PHP страниц в кэше; или в течение более длительного периода времени; возможно, ваши страницы не будут обновлены на секунду, но это позволит вашему сайту пережить digg-эффект!

об этом как я могу обнаружить и выжить "Slashdotted"? может быть интересно читать.


на PHP стороне вещей:

прежде всего: вы используете последняя версия PHP? Есть регулярно улучшения в скорости, с новыми версиями ;-)
например, посмотри бенчмарк PHP филиалов 3.0 через 5.3-CVS.

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

вы используете какой-либо кэш кода операции?

  • я думал о APC-альтернативный PHP кэш, например ( pecl,руководство), который является решение, которое я видел, используется больше всего-и это используется на всех серверах, на которых я работал.
  • это действительно может снизить нагрузку на процессор сервера много, в некоторых случаях (Я видел загрузку процессора на некоторых серверах от 80% до 40%, просто установив APC и активировав его функциональность opcode-cache!)
  • в принципе, выполнение PHP скрипта идет в два этапа:
    • компиляция исходного кода PHP в opcodes (своего рода эквивалент байт-кода JAVA)
    • выполнение этих кодов операций
    • APC сохраняет их в памяти, поэтому при каждом выполнении PHP-скрипта/файла требуется меньше работы: только извлеките коды операций из ОЗУ и выполните их.
  • возможно, вам придется взглянуть на БТР!--213-->параметры конфигурации, кстати
    • их довольно много, и некоторые из них могут оказать большое влияние на скорость / загрузку процессора / простоту использования для вас
    • например, отключение [apc.stat](http://php.net/manual/en/apc.configuration.php#ini.apc.stat) может быть хорошо для загрузки системы; но это означает, что изменения, внесенные в файлы PHP, не будут учитываться, если вы не очистите весь кэш-код; об этом подробнее подробности, см., например,стат () или не стат ()?


использование кэша для данных

насколько это возможно, лучше не делать то же самое снова и снова.

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

Это может быть очень интересно для вас, чтобы определить:

  • какие запросы выполняются много раз, всегда возвращаются одни и те же данные
  • какие другие (тяжелый) вычисления выполняются много раз, всегда возвращая один и тот же результат

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

большие механизмы кэширования, например:

  • APC: в дополнение к коду операции-кэш, о котором я говорил ранее, он позволяет хранить данные в памяти,
  • и/или memcached(см. также), что очень полезно, если вы буквально много данных и/или использование нескольких серверов, как это распространяется.
  • конечно, вы можете думать о файлах; и, вероятно, многие другие идеи.

Я уверен, что ваш фреймворк поставляется с некоторыми кэш-связанными вещами; вы, вероятно, уже знаете это, как вы сказали "Я буду использовать Кэш-библиотека больше в будущем" в ОП ;-)


профилирования

Теперь, хорошая вещь, чтобы сделать, было бы использовать Xdebug

использовать XDebug и WinCacheGrind или WebCacheGrind для профилирования и анализа медленного выполнения кода.

WebCacheGrind http://jokke.dk/media/2008-webgrind/webgrind_small.png WinCacheGrind

код профиля с XDebug.

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

в Kohana из коробки очень быстро, за исключением использования объектов базы данных. Чтобы процитировать Zombor "вы можете уменьшить использование памяти, гарантируя, что вы используете объект результата базы данных вместо массивов результатов."Это делает огромную разницу в производительности на сайте, который захлопывается. Он не только использует больше памяти, но и замедляет выполнение скриптов.

также необходимо использовать кэширование. Я предпочитаю memcache и использовать его в моих моделях, как это:

public function get($e_id)
{
    $event_data = $this->cache->get('event_get_'.$e_id.Kohana::config('config.site_domain'));

    if ($event_data === NULL)
    {
        $this->db_slave
            ->select('e_id,e_name')
            ->from('Events')
            ->where('e_id', $e_id);

        $result = $this->db_slave->get();
        $event_data = ($result->count() ==1)? $result->current() : FALSE;

        $this->cache->set('event_get_'.$e_id.Kohana::config('config.site_domain'), $event_data, NULL, 300); // 5 minutes
    }

    return $event_data;
}

Это также резко повышается производительность. Вышеуказанные два метода улучшили производительность сайтов на 80%.

Если бы вы дали дополнительную информацию о том, где, по вашему мнению, узкое место, я уверен, что мы могли бы дать некоторые лучшие идеи.

также проверьте yslow (google it) для некоторых других советов по производительности.

строго связано с Кохана (вы, вероятно, уже сделали это, или нет):

в рабочем режиме:

  1. включить внутреннее кэширование (это будет только кэшировать результаты Kohana::find_file, но это на самом деле может помочь много.
  2. отключить профайлер

только мои 2 цента:)

Я полностью согласен с ответами XDebug и кэширования. Не смотрите в слой Kohana для оптимизации, пока вы не определили свои самые большие узкие места скорости и масштаба.

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

пример задачи и решения: Если вы обнаружите, что вы создаете дорогие объекты из база данных каждый раз, что на самом деле не часто меняются, то вы можете посмотреть на кэширование их с memcached или другим механизмом. Все эти исправления производительности требуют времени и усложняют вашу систему, поэтому убедитесь в своих узких местах, прежде чем начать их исправлять.