The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Ускорение форума phpBB при помощи memcached
Решение по кэшированию повторяющихся запросов к MySQL, для оптимизации работы форума phpBB.


Устанавливаем memcached под Debian или Ubuntu:

   apt-get install memcached php5-memcached

После установки не забываем перезагрузить apache или php-cgi. Чтобы php увидел новые модули.

Включаем лог медленных запросов у mysql:

   log_slow_queries = /var/log/mysql/mysql-slow.log
   long_query_time = 3

и ждем с часик, после чего смотрим лог. У меня в лог попало порядка 4000 запросов - 
из них легко было выделить запросы типа:

   SELECT COUNT(user_id) AS total FROM phpbb_users WHERE user_id <> -1

Запрос постоянно подсчитывал количество пользователей форума на phpBB. 
Понятно, что это число не особо важно - это просто статистика. Значит данные по
этому запросу можно закешировать часа на 2.

Для этого открываем файл includes/functions.php ищем функцию get_db_stat()

находим код:

   if ( !($result = $db->sql_query($sql)) )
   {
      return false;
   }
   $row = $db->sql_fetchrow($result);

изменяем на

   $memcached = new Memcache;
   $memcached->connect('localhost', 11211);

   if(!$row = $memcached->get($sql))
   {
   
      if ( !($result = $db->sql_query($sql)) )
      {
         return false;
      }
      $row = $db->sql_fetchrow($result);
   
      $memcached->set($sql, $row, MEMCACHE_COMPRESSED, time() + 7200);
   }
   $memcached->close();

Смысл изменения состоит в том, что в memcached данные хранятся парами (ключ, значение). 
Ключом служит SQL запрос - он уникальный. Алгоритм приведенного кода состоит в следующем:

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

Немного о грустном - модов для phpBB + memcache я не нашел. Зато в phpbb3 эта поддержка заявлена. 
А для phpBB2 придется самому выискивать такие запросы для кеширования, 
а ведь еще есть моды - они тоже генерируют тяжелые запросы. 
Если все сделать правильно - тормоза базы можно сократить в 2-3 раза.
 
01.10.2008 , Автор: EugeneVC , Источник: http://lastage.ru/blogs/181.html...
Ключи: memcached, php, optimization
Раздел:    Корень / Программисту и web-разработчику / PHP / Серверная часть и интерпретатор

Обсуждение [ RSS ]
  • 1.1, BOLK (?), 10:19, 01/10/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Memcached не нужен на localhost, учите другие способы доступа к разделяемой памяти.
     
  • 1.2, EugeneVC (?), 12:44, 01/10/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Согласен. Но memcached стандартное решение. Применить его можно быстро и не затратно. А использование shm_open функций не всем по силам. Или есть какая нить обертка над этим?
     
     
  • 2.3, uldus (ok), 13:28, 01/10/2008 [^] [^^] [^^^] [ответить]  
  • +/
    >Согласен. Но memcached стандартное решение. Применить его можно быстро и не затратно.
    >А использование shm_open функций не всем по силам. Или есть какая
    >нить обертка над этим?

    Использование memcached - это в первую очередь возможность масштабирования, а shared memory лишь временный выход, по производительности не выигрывающий у memcached, особенно работающего через unix socket. Дополнительный геморой - вечные глюки кеширования через средства разных php-акселераторов, в багзилах которых то и дело поднимаются очередные утечки памяти.

     
     
  • 3.6, User294 (??), 18:47, 01/10/2008 [^] [^^] [^^^] [ответить]  
  • +/
    >разных php-акселераторов,

    Пардон, а php акселераторы кешируют ведь страницу а не запросы к базе, снимая нагрузку на php интерпретер, а не на базу (на нее если только косвенно - если страница отдается как статика запросов к БД на это, очевидно, не делается).

     
     
  • 4.7, uldus (ok), 21:39, 01/10/2008 [^] [^^] [^^^] [ответить]  
  • +/
    >>разных php-акселераторов,
    >
    >Пардон, а php акселераторы кешируют ведь страницу а не запросы к базе,

    Речь про API некоторых php акселераторов, позволяющих хранить ключ/значение в shared memory. Натыкался на пару багов приводящих к утечке памяти в eaccelerator, при использовании данной фичи.

     

  • 1.4, kill9 (??), 18:28, 01/10/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Криво прикручено, от дедлоков не спасет
     
  • 1.5, User294 (??), 18:45, 01/10/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    phpBB2 имхо давно пора выкинуть в /dev/null.Бажный, с вагоном секурити дыр. phpBB3 - тотальный rewrite с учетом грабель phpBB2.По-моему, 3-я версия намного лучше 2-й.

    P.S. ну не пи..ц?Лечить тормоза базы по сути примитивной DB вида key,value.А если вместо memcached под это скажем, Berkeley DB какоенить припахать или подобную "простую" бд в стиле key, value - интересно, что получится? :)

     
     
  • 2.9, ihanick (?), 00:11, 03/10/2008 [^] [^^] [^^^] [ответить]  
  • +/
    berkley db уже перестало биться?
    её можно будет раскидать на 3-4 сервера, для того чтобы обслуживать запросы 50-400 серверов апачей?
    а кеши будут когерентные?
     
     
  • 3.11, User294 (ok), 03:36, 03/10/2008 [^] [^^] [^^^] [ответить]  
  • +/
    >berkley db уже перестало биться?

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

    >её можно будет раскидать на 3-4 сервера, для того чтобы обслуживать запросы
    >50-400 серверов апачей?

    Мне к великому счастью не надо столько гуано :).Если вы не заметиле я вовсе не предлагал таким манером такие нагрузки обслуживать.Чего вы взвились?Меня скорее интересует другой случай - есть какое-то обычное весьма среднее железо, а не 400 серверов и еще что-то с вагоном оперативы под этот memcached. Допустим что RAM как раз не дофига и процессоров не 128 а 1-2-4.Не прокатит ли вместо жручего до RAM ... поюзать ..., допустим, диски у железа не слишком позорные?В общем то единственное что меня интересовало.

    >а кеши будут когерентные?

    Если вам непременно надо это на 400 апачей (ужосн*х!) сами и ломайте голову над вопросом как этого достичь.Мне же к счастью не надо столь монстрильные решения - еще одних "однокласников" и "facebook" я делать вроде не собираюсь.

     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру