1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

Уменьшить время выполнения запроса

Тема в разделе "Оптимизация XenForo", создана пользователем 1981, 14.02.2012.

Загрузка
  1. 1981

    1981 Местный

    Регистрация:
    15.10.11
    Сообщения:
    273
    Симпатии:
    19
    Версия XF:
    1.1.4
    Page Time: 1.1766s
    Memory: 13.0175 MB (Peak: 14.5807 MB)
    Queries (16, time: 0.9332s, 79.3%)

    1. SELECT session_data
      FROM xf_session
      WHERE session_id = ?
      AND expiry_date >= ?
      Params: 3e1b26be22310a396a8da11d, 132906
      Run Time: 0.928200
      Select TypeTableTypePossible KeysKeyKey LenRefRowsExtra
      SIMPLE xf_session const PRIMARY,expiry_date PRIMARY 34 const 1
    Что можно сделать чтоб уменьшить время? (бывает и больше частенько
    ([хостинг вдс, памяти и проца с запасом)
     
  2. grizone

    grizone Местный

    Регистрация:
    16.06.11
    Сообщения:
    189
    Симпатии:
    143
    Версия XF:
    1.1.4
    хостинг / vps / vds ???/
    параметры железа? посещаемость?
    дайте информацию какую-то чтоб люди могли дать адекватный ответ, не думайте что мы все это можем угадать =\
     
    1981 нравится это.
  3. koodry

    koodry Местный

    Регистрация:
    15.01.12
    Сообщения:
    39
    Симпатии:
    6
    Дамы и господа приветствуем, экстрасенс Михаил. :)
    Такое ощущение, что на сайт установлено много модулей. Попробуйте включить кеширование ссылка, мне это дало около 60% прироста производительности.

    2 grizone возможно он тоже не может угадать какая информация для вас будет полезной. :)
     
    1981 и TAIFUN нравится это.
  4. 1981

    1981 Местный

    Регистрация:
    15.10.11
    Сообщения:
    273
    Симпатии:
    19
    Версия XF:
    1.1.4
    VDS. 512 памяти, посещаемость до 900 чел в сутки, включен Memcached, в конфиге

    $config['cache']['enabled'] = true;
    $config['cache']['frontend'] = 'Core';
    $config['cache']['frontendOptions'] = array(
    'caching' => true,
    'automatic_serialization' => true,
    'lifetime' => 3300,
    'cache_id_prefix' => 'xf_'
    );
    $config['cache']['backend'] = 'Memcached';
    $config['cache']['backendOptions'] = array(
    'backendOptions' => array(
    'compression' => false,
    'servers' => array(
    array(
    // your memcached server ip /address
    'host' => 'localhost',

    // memcached port
    'port' => 11211,
    )
    )
    )
    );
     
  5. koodry

    koodry Местный

    Регистрация:
    15.01.12
    Сообщения:
    39
    Симпатии:
    6
    попробуйте установить на сервере apc или xcache. У меня после установки apc использование памяти и время выполнения сократилось примерно на 65-70%.
     
    1981 нравится это.
  6. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    У меня складывается впечатление, что MySQL тормозит, а не движок.
    Если так много уходит времени только на запрос сессий, а на все остальное более-менее, то можно включить кеширование сессий:
    Код:
    $config['cache']['cacheSessions'] = true;
    Если и это не поможет, тогда отключайте плагины и включайте их один за другим, либо наоборот - отключайте их один за другим. Как только заметите ощутимую разницу, значит это был такой-то плагин. Ну а дальше нужно разбираться, почему из-за него такие тормоза.

    И еще. Использование мемкешера может быть нерациональным. Попробуйте другой кешер. Все же мемкешер не кеширует код PHP. Тот же XCache может Вам заменить и кеширование переменных (memcached) и добавить кеширование опкода PHP.
     
    1981 нравится это.
  7. 1981

    1981 Местный

    Регистрация:
    15.10.11
    Сообщения:
    273
    Симпатии:
    19
    Версия XF:
    1.1.4
    Прописал $config['cache']['cacheSessions'] = true; вроде чуток быстрее, иногда тупи притормаживает форум, может что то с базой?
    А для apc какой конфиг прописали?
     
  8. koodry

    koodry Местный

    Регистрация:
    15.01.12
    Сообщения:
    39
    Симпатии:
    6
    в конфиге у меня прописан только memcached. Apc просто установлен на сервере. Можно сказать, у вас сейчас вообще не включен кеш.
     
  9. 1981

    1981 Местный

    Регистрация:
    15.10.11
    Сообщения:
    273
    Симпатии:
    19
    Версия XF:
    1.1.4
    То есть оба одновременно? (они оба наверно хорошо кушают память, сколько у вас на сервере вообще памяти? сколько фактически примерно загружено?
     
  10. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Ну наверное не "не включен кеш", а не включен кеш кода, что не одно и то же.
    А разделять кешеры отдельно для кода и переменных нужно ли? Проще единый использовать. Да и мемкешер только при очень высоких нагрузках даст прирост производительности. А на хилом VDS с сайтом даже средней посещаемости не имеет смысла держать в памяти лишний демон. ИМХО, конечно же.
    Прописывание в конфиге XenForo кешера - это кеширование переменных. На кеширование кода это никак не отражается. Поэтому можно использовать отдельно кешер кода и кешер переменных. В его случае переменными занимается memcached, а кодом - APC. Если в APC отключить кеширование переменных, то он не будет резервировать под эту задачу память. Поэтому памяти должно хватать и туда и туда. Вот только целесообразность отдельных кешеров все же под вопросом...
    Кешер кода работает независимо от движка и вообще скриптов. Он просто работает, кешируя опкод скриптов PHP, любых.

    Чуть не забыл. Если используется Apache, то можно сильно снизить нагрузку на сервер, поставив в качестве фронтенда nginx.
     
  11. koodry

    koodry Местный

    Регистрация:
    15.01.12
    Сообщения:
    39
    Симпатии:
    6
    У меня 800 мб, в статистике написано, что использовано 20-30%.

    infis прав, думаю вам лучше поставить xcache и nginx. Вообще, memcached рекомендуют ставить на большие проекты.
     
    1981 нравится это.
  12. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Если в shell на момент тормозов выполнить top, что он показывает? Интересует по большей части строчка

    Код:
    Cpu(s): 13.6%us,  6.5%sy,  0.0%ni, 76.5%id,  3.2%wa,  0.1%hi,  0.2%si,  0.0%st
    Если %wa слишком велик - скорее всего, у вас там все отчаянно свопит от недостатка памяти.
     
  13. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Там уже разобрались.

    Думаю, что автор топика будет не против некоторых сведений о проведенной оптимизации. Просто рецепт на самом деле общий и не является чем-то конфиденциальным.

    Хостинг не шустрый, ну да ладно. Плюс стояло отображение последних тем на главной. А это добавляло 2 лишних запроса. Также отсутствовало кеширование опкода. В качестве фронтэнда уже установлен nginx.

    Что было сделано:
    1) установлен XCache в качестве кешера кода и кешера переменных;
    2) отключен за ненадобностью memcached;
    3) отключен вывод последних тем (можно было бы оставить, но на этой вдс будет работать слишком медленно).

    Время генерации главной страницы сократилось примерно раз в 10 (при обновлении страницы, но и при первой загрузке время также раз в пять меньше). Потом последние темы вернули на место (уже без меня), но убрали блок активных пользователей. Думаю, что примерно тот же эффект сохранился. В общем при настройке главной страницы учитывайте, какие блоки будут отображаться и как будут влиять на скорость генерации страницы. Часто такие блоки добавляют лишние запросы, что может привести к ощутимым тормозам.

    По идее что еще можно сделать:
    1) найти более шустрого хостера;
    2) тюнинг MySQL.

    Ах да. Еще руки нужно отрывать специалистам хостера за такую настройку сервера :)
     
    TAIFUN нравится это.
  14. ayep

    ayep Пользователь

    Регистрация:
    20.02.12
    Сообщения:
    9
    Симпатии:
    3
    Версия XF:
    1.1.2
    Ребят, вы, конечно, молодцы, но конкретно эта проблема, судя по первому посту, лечится простым изменением типа таблицы xf_session с myisam на innodb, иначе она при каждом (каждом!) обращении пользователя к форуму блокируется целиком, для обновления expiry_date. Настройка кэшера, конечно, не менее важна, но как только у него кончится память, проблема вернется.
     
  15. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Проще вообще сессии из базы вынести, что легко реализуется с помощью параметра в конфиге ксена. Затем установка кешера переменных хорошо отрабатывает переменные. Да и кешер опкода сильно снижает нагрузку на сервер. Ну а полгига памяти для сервера с такой посещаемостью - за глаза. Конечно, если там не держать какую-нибудь галерею с обработкой картинок во время аплода, например.
     
  16. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    А что, софт на сервере хостер настраивал? Я так понял, там VDS арендован. Или нет?
     
  17. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Да. Помимо предустановленного сервера специалисты хостера еще дополнительно настраивали. Во всяком случае мне так сказали. Если не вдаваться в детали, то там некоторые конфиги лежат немного не там, где им должно было быть место, а также часть конфигурации просто не совсем корректно настроена (есть некоторые нюансы, которые непосредственно на работе не сказываются, так как игнорируются).
     
    1981 нравится это.
  18. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Да, это правильный совет, но только для большой посещалки (хотя бы от 200 чел. одновременно онлайн и то спорно, но точно надо переключать при более чем 1К онлайн одновременно). Т.к. при небольшом онлайне работа с мемори таблицой и блокировкой все равно будет быстрее чем с тем же innodb, но без блокировки. А учитывая какие проблемы описывает ТС, то у него явно не большой онлайн + уверен что иннодб настроен не самым лучшим образом (т.е. если перевести таблицу сессий в innodb - будут еще большие тормоза).

    Innodb при желании можно разогнать быстрее memory, но только при правильной настройке, но из практики - правильная настройка - это редкость.

    P.S. Кстати давно думаю написать хак для использования хандлер сокета - тогда автоматом избавимся от единственного узкого места ксена под большой нагрузкой - сессий. Но мне пока не надо и поэтому лень с недостатком свободного времени побеждают :)
     
    Динарейка и infis нравится это.
  19. ayep

    ayep Пользователь

    Регистрация:
    20.02.12
    Сообщения:
    9
    Симпатии:
    3
    Версия XF:
    1.1.2
    И тем не менее, иначе как блокировкой такой расклад (один простой запрос занимает в 185 раз больше времени, чем остальные 15, да ещё более сложные, в сумме) не объяснить. К тому же, сколько можно выиграть myisam'ом на таблице с 3-4 тыс. однокилобайтных записей, да к тому же используемых как key-value? 0,01 секунды на запрос?

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

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

    Много чего можно сделать, но все упирается в сложность моделей, они в Ксене сделаны отвратительно :(
     
  20. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Ксен - это все же больше преднастроенный конструктор на базе Zend Framework. То, что Вы описали, хорошо подходит под законченное решение, где можно увеличить разными способами производительность в ущерб легкой расширяемости в динамике. Не думаю, что ксен будет развиваться в эту сторону, хотя, конечно, будет и дальше оптимизироваться. Вот только баланс между производительностью и расширямостью всегда сложно соблюсти.
     

Поделиться этой страницей