2009-11-17 3 views
2

У меня есть сайт сообщества около 12 000 пользователей (писать тяжелый), 100 одновременных пользователей max на одном VPS с 1 ГБ оперативной памяти. Нагрузка редко превышает 3, и реакция довольно хорошая.Оптимизация PHP, производительность сайта сообщества MYSQL

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

Как я могу узнать, что такое узкое место?

Я предполагаю, что БД прекрасно работает, поскольку кеш работает нормально, однако Disk IO может вызвать проблемы. Каждая pageload имеет около 10 включений и 10-20 запросов из БД или из кеша файлов, плюс много обработки php.

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

Я планирую использовать альтернативный кэш PHP, но я до сих пор не совсем понимаю, как этот кэш недействителен. У меня есть singe index.php, который обрабатывает все запросы. Будет ли кеш хранить результат для каждого отдельного запроса? Будет ли он автоматически очищать кеш, если один из моих включит (или результат запроса из кеша) изменится?

Любые другие предложения по поиску узких мест (попробовали xdebug)?

Спасибо, Гамлет

+0

Не могли бы вы привести пример запроса, который вы используете чаще всего? – Quassnoi

ответ

5

Я планирую использовать альтернативный PHP Cache, , но я до сих пор не понимаю, как аннулируется, что кэш.У меня есть singe index.php, который обрабатывает все запросы . Будет ли кэш хранить результат для каждого индивидуального запроса? Будет ли он автоматически очищать кеш , если один из моих включит (или результат запроса из кеша) изменится?

APC не кэширует выход. Он кэширует ваш скомпилированный байт-код.

По существу, нормальный запрос PHP выглядит следующим образом:

  1. PHP файлы обрабатываются и компилируется в байткод
  2. интерпретатор PHP выполняет байт-код

APC кэширует результат первого шаг, так что вы не переупаковываете/перекомпилируете один и тот же код снова и снова. По умолчанию все ваши файлы PHP по-прежнему stat(), чтобы узнать, был ли файл изменен с момента его сбивания кешированной копии, поэтому любые изменения в коде автоматически аннулируют кешированную копию.

Вы также можете использовать APC так же, как если бы вы использовали memcached для хранения произвольных пользовательских данных. Однако имейте в виду:

  1. Сервер memcached может обслуживать данные на нескольких серверах; данные, кэшированные в APC, могут реально использоваться только локально. Лучше обслуживать показ данных из одного ящика memcached на четыре сервера, чем иметь 4 копии этого концерта данных в APC на каждом отдельном сервере.
  2. Memcached, по моему опыту, лучше справляется с большим количеством одновременных операций записи в один ключ кеша.
  3. APC, похоже, не очень хорошо справляется с заполнением кэш-памяти. Фрагментация увеличивается, а производительность падает.

Кроме того, будьте осторожны: если вы не создали какой-либо механизм блокировки, ваш кэш на основе файлов, скорее всего, станет поврежденным из-за одновременной записи. Если вы внедрили блокировку, это может стать узким местом. IMO, параллелизм сложный - пусть memcached/APC/база данных справиться с этим.

+0

APC не только не очень хорошо справляется, когда заполняется, но также не обрабатывает очень большие объемы памяти. Он неожиданно завершает работу, и также становится невозможным удалить ключи. – Sergi

+0

У меня нет личного опыта с ним (я только храню несколько мегабайт ключей в APC), но в своих презентациях facebook утверждает, что для каждого сервера используется несколько гигабайтов кэша APC - в дополнение к их массивной установке memcached , Они используют пользовательскую сборку APC, хотя - возможно, они внесли некоторые изменения, которых нет в открытой версии APC (пока) –

0

MySQL имеет свой собственный кэш запросов.

Вы можете включить его, установив query_cache_size на номер более чем 0.

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

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

1

Вы упомянули, что использовали XDebug - что вы не могли сделать? Как правило, чтобы начать отслеживать узкое место, вы разрешаете профилирование запроса, а затем просматриваете полученный файл «cachegrind» в KCacheGrind или WinCacheGrind.

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

  • построить кэш «ключ» из уникальных материалов для сценария
  • задать систему кэширования, если у него есть данные для этого ключа. Если есть, вы готовы идти!
  • В противном случае выполните всю сложную работу по созданию данных и попросите систему кэширования сохранить ее под нужную клавишу в следующий раз.

APC Cache может помочь ускорить процесс путем кэширования анализируемой версии PHP-кода.

0

Я включил и настроен APC на тестовом сервере и получил прирост производительности около 400%

300 одновременных пользователей с временем отклика 1,4 секунды максимум :) Хорошо для начала.


Update:

результаты испытаний Live сервер

Оригинал:

Нет APC: 220 одновременных пользователей, нагрузку на сервер 20, время отклика 5000 мс

Нет APC : 250 одновременных пользователей, загрузка сервера 20+, сайт недоступен

Новые:

APC включены: 250 одновременных пользователей, нагрузка на сервере 2, время отклика включен 600мс

APC: 350 одновременных пользователей, нагрузка на сервере 10, время отклика 1500ms

APC enabled: 500 одновременных пользователей, загрузка сервера 20, ответ 5000 мс + сайт полностью работоспособен, но немного медленный, но может использоваться обычно

Спасибо за предложения, это довольно большое улучшение.

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

0

Я бы сказал, что, вероятно, ваша база данных привязана к IO, я точно не знаю, что такое «VPS», но если это какая-то виртуальная машина, то почти гарантировано будет очень плохо выполняться IO.

Получите доступ к реальному оборудованию как можно скорее; и получить разумное количество барана (1G крошечный, 16G звучит более разумно).

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

Я предполагаю, что вы используете двигатель innodb; если да, то настройте буферный пул, чтобы он был достаточно большим для всех ваших данных - если у вас недостаточно бара, покупайте больше, пока не сделаете (нет, действительно!).

Затем ваши запросы на db должны быть быстрыми, даже если они довольно плохие (да).

Сложный бит, если у вас есть одна машина, как вырезать использование бара между mysql и PHP - веб-сервер (я предполагаю, что Apache), особенно если вы используете prefork и много MaxClients, можете использовать нагрузки из ram и лишить вашу базу данных.

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

+0

Хорошо ... нам нужен приличный сервер с нагрузками ОЗУ. Мой следующий вопрос: как зарабатывать деньги на сайте? :) – hamlet

+0

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

Смежные вопросы