Оптимизация веб-сайтов на основе Kohana для скорости и масштабируемости
сайт, который я построил с Kohana, вчера был забит огромным количеством трафика, что заставило меня сделать шаг назад и оценить некоторые из проектов. Мне любопытно, каковы некоторые стандартные методы оптимизации приложений на основе Kohana?
меня также интересует бенчмаркинг. Мне нужно настроить Benchmark::start()
и Benchmark::stop()
для каждого метода контроллера, чтобы увидеть время выполнения для всех страниц, или я могу применить бенчмаркинг глобально и быстро?
I будет использовать кэш-библиотеку больше в будущем, но я открыт для большего количества предложений, поскольку я уверен, что есть много, что я могу сделать, о чем я просто не знаю на данный момент.
6 ответов
то, что я скажу в этом ответе, не относится к Kohana и, вероятно, может применяться ко многим проектам PHP.
вот некоторые моменты, которые приходят мне на ум, когда речь идет о производительности, масштабируемости, 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!
- то же самое для самых посещаемых страниц вашего сайта, если они не меняются в течение хотя бы пары минут (пример: Домашняя страница?), то нет необходимости тратить CPU повторно генерировать их каждый раз, когда пользователь запрашивает их.
- может быть, есть разница между страниц для анонимных пользователей (одна и та же страница для всех анонимных пользователей) и страницы, предназначенные для идентифицированных пользователей ("Здравствуйте, мистер Икс, у вас новые сообщения", например)?
- если это так, вы, вероятно, можете настроить обратный прокси-сервер для кэширования страницы, которая обслуживается для анонимных пользователей (на основе cookie, например, cookie сеанса, как правило)
- это будет означать, что Apache+PHP имеет меньше проблем: только идентифицированные пользователи , которые могут быть только небольшой частью ваших пользователей.
о использование обратного прокси-сервера в качестве кэш -, для приложения PHP, вы можете, например, взглянуть на результаты тестов показывают 400% -700% увеличение возможностей сервера с APC и Squid Cache.
(Да, они используют Squid, и Я говорил о лаке - это просто еще одна возможность ^^ лак быть более недавним, но более посвященным кэшированию)
Если вы сделаете это достаточно хорошо, и удастся остановить регенерировать снова и снова, слишком много страниц, возможно, вам даже не придется оптимизировать код ;-)
по крайней мере, может быть, не в любой пик... И всегда лучше выполнять оптимизацию, когда вы не находитесь под слишком большим давлением...
Как sidenote: вы говорят в ОП:
сайт я создал с Кохана окатили огромное количество трафика вчера,
Это внезапная ситуация, когда обратный прокси-сервер может буквально спасти день, если ваш сайт может не быть в курсе на втором:
- установите его, настройте его, пусть он всегда -- каждый нормальный день... выполнить:
- настроить его, чтобы не держать 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, не будут учитываться, если вы не очистите весь кэш кода операции; об этом, для более подробности, см., например,stat () или не stat ()?
использование кэша для данных
насколько это возможно, лучше не делать то же самое снова и снова.
главное, о чем я думаю, это, конечно, SQL-запросы: многие из ваших страниц, вероятно, выполняют одни и те же запросы, и результаты некоторых из них, вероятно, почти всегда одинаковы... Который значит много "бесполезно" запросы к базе данных, которая должна тратить время на обслуживание одних и тех же данных снова и снова.
конечно, это верно для других вещей, таких как вызовы веб-сервисов, получение информации с других веб-сайтов, тяжелые вычисления ...
Это может быть очень интересно для вас, чтобы определить:
- какие запросы выполняются много раз, всегда возвращаются одни и те же данные
- какие другие (тяжелый) вычисления выполняются много времени, всегда возвращая один и тот же результат
и хранить эти данные/результаты в каком-то кэше, поэтому их легче сделать -- быстрее -- и вам не нужно идти на свой SQL server для "ничего".
большие механизмы кэширования, например:
- APC: в дополнение к кэш-коду, о котором я говорил ранее, он позволяет хранить данные в памяти,
- и/или memcached (см. также), что очень полезно, если вы буквально много данных и/или использование нескольких серверов, так как он распространяется.
- конечно, вы можете думать о файлах; и, вероятно, многие другие идеи.
Я уверен, что ваш фреймворк поставляется с некоторыми связанными с кэшем вещами; вы, вероятно, уже знаете это, как вы сказали "Я буду использовать Кэш-библиотека больше во времени, чтобы прийти" в ОП ;-)
профилирования
Теперь неплохо было бы использовать отладчик xdebug
Если вы все еще читаете, что еще можно оптимизировать? Ну, есть еще место для улучшений... Пара архитектурно-ориентированных идей может быть: Ну, может быть, некоторые из этих идей немного перебор в вашей ситуации ^^
ваш первоначальный вопрос был об оптимизации приложения, которое использует Кохана... Ну, я опубликовал некоторые идеи, которые верны для любого приложения PHP... Что означает, что они верны для Кохана тоже ;-)
Я сказал: используйте кэш; Кохана, кажется, поддерживает некоторые кэширование вещи (вы сами об этом говорили, так что ничего нового здесь нет...)
Я также сказал, что вы не должны делать ничего, что не является необходимым; есть ли что-то включено по умолчанию в Kohana, что вам не нужно?
тем не менее, вот несколько ссылок, которые могут быть полезны: и, в заключение, простая мысль: Я не говорю, что вы не должны оптимизировать: вы, безусловно, должны!
О, и кстати: прежде чем что-то делать: положите некоторый контроль вещи на месте, так что вы знаете, какие улучшения были сделаны, и как!
например, вы можете использовать что-то вроде RRDtool + кактусы.
и что теперь?
но, все-таки... Почему бы не изучить их немного, на всякий случай ? ;-)а как же Кохана?
(даже если это не специфично для него ^^)
если есть что-то, что можно сделать быстро, попробуйте ;-)
просмотр сети, кажется, есть на хотя бы что-то о фильтрации XSS; вам это нужно?
вывод?
но перейти на" быстрые " оптимизации, которые получат вам большие награды во-первых: использование некоторого кэша кодов операций может помочь вам получить от 10 до 50 процентов от загрузки процессора вашего сервера... И это займет всего пару минут, чтобы настроить ;-) с другой стороны, потратив 3 дня на 2 процента...
без мониторинга, вы не будете иметь никакого представления о влиянии того, что вы сделали... Даже если это настоящая оптимизация или нет!
и показывая вашему боссу некоторые хорошие графики с 40% CPU-падение нагрузки всегда здорово ; -)
Во всяком случае, и действительно вывод:удачи!
(да, оптимизация-это удовольствие!)
(Ergh, я не думал, что буду писать так много... Надеюсь, по крайней мере, некоторые части этого полезны... И я должен помнить этот ответ: может быть, пригодится в другой раз...)
использовать отладчик xdebug и WinCacheGrind или WebCacheGrind профилировать и анализировать медленное выполнение кода.
WebCacheGrind http://jokke.dk/media/2008-webgrind/webgrind_small.png
код профиля с отладчик xdebug.
используйте много кэширования. Если ваши страницы относительно статичны, то обратный прокси-сервер может быть лучшим способом сделать это.
в Kohana из коробки очень быстро, за исключением использования объектов базы данных. Цитата Zombor " вы можете уменьшить использование памяти, гарантируя, что вы используете объект результата базы данных вместо результирующих массивов."Это делает разницу в производительности HUGEE на сайте, который захлопывается. Он не только использует больше памяти, но и замедляет выполнение скриптов.
также необходимо использовать кэширование. Я предпочитаю 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) для некоторых других советов по производительности.
строго связано с Кохана (вы, вероятно, уже сделали это, или нет):
в рабочем режиме:
- включить внутреннее кэширование (это будет кэшировать только результаты Kohana::find_file, но это действительно может помочь.
- отключить профайлер
только мои 2 цента:)
Я полностью согласен с ответами XDebug и кэширования. Не смотрите в слой Kohana для оптимизации, пока вы не определили свои самые большие узкие места скорости и масштаба.
XDebug скажет вам, что вы проводите большую часть своего времени и идентифицируете "горячие точки" в своем коде. Сохраните эту информацию профилирования, чтобы можно было определить базовые показатели и измерить улучшения производительности.
пример проблемы и решения: Если вы обнаружите, что строите дорогие объекты из база данных каждый раз, что на самом деле не часто меняется, то вы можете посмотреть на кэширование их с memcached или другим механизмом. Все эти исправления производительности требуют времени и усложняют систему, поэтому прежде чем приступить к их устранению, убедитесь в наличии узких мест.