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

Ускоряем XenForo: включаем кэширование

Тема в разделе "Советы, руководства и видео-уроки", создана пользователем FractalizeR, 12.10.2010.

Загрузка
  1. maus

    maus Местный

    Регистрация:
    27.03.12
    Сообщения:
    187
    Симпатии:
    129
    Если по умолчанию, то пусть техподдержка и разбирается, их косяк. Подсказать не могу, без полной информации о том, как там fcgi настроен, сказать мне просто нечего.
     
  2. Mike

    Mike Местный

    Регистрация:
    30.11.11
    Сообщения:
    149
    Симпатии:
    3
    Версия XF:
    1.1.0 Final
    Мда, там в настройках www домена было указано CGI а не Php как модуль Apache. )

    Но, теперь все работает.

    Время: 0,0907 сек. Память: 5,984 МБ Запросов к БД: 13​

    В 2-3 раза быстрее. По-моему могло и быстрее работать...​
    [​IMG]
    Итак, настройки xcache :​
    Код:
    [xcache]
    xcache.shm_scheme = "mmap"
    xcache.size = 64M
    xcache.count = 6
    xcache.slots = 8K
    xcache.ttl = 7200
    xcache.gc_interval = 0
    xcache.var_size = 16M
    xcache.var_count = 2
    xcache.var_slots = 1K
    xcache.var_ttl = 3600
    xcache.var_maxttl = 7200
    xcache.var_gc_interval = 300
    xcache.test = Off
    xcache.readonly_protection = Off
    xcache.mmap_path = "/dev/zero"
    xcache.coredump_directory = "/tmp/phpcore/"
    xcache.cacher = On
    xcache.stat = Off
    xcache.optimizer = On
    xcache.coverager = Off
    xcache.coveragedump_directory = "/tmp/phpcore/"
    
    Настройки XenForo :

    Код:
    $config['cache'] = array(
    'enabled' => true,
    'cacheSessions' => true,
    'frontend' => 'Core',
    'frontendOptions' => array(
    'caching' => true,
    'automatic_serialization' => true,
    'cache_id_prefix' => 'xf_',
    'lifetime' => 18000
    ),
    'backend' => 'Xcache',
    'backendOptions' => array(),
    );
    Все, более ничего не пытаться сделать, чтобы улучшить производительность? Или еще чего есть ? :)
     
  3. maus

    maus Местный

    Регистрация:
    27.03.12
    Сообщения:
    187
    Симпатии:
    129
    База данных очень медленно работает. На один из запросов вообще 0.01с - нонсенс, у меня домашний компьютер быстрее. Нужно буферы увеличивать и, если ещё не сделано, innodb_flush_log_at_trx_commit=0.
     
  4. Mike

    Mike Местный

    Регистрация:
    30.11.11
    Сообщения:
    149
    Симпатии:
    3
    Версия XF:
    1.1.0 Final
    1. Буферы это где увеличить надо, я нубас еще тот ? :)
    2. Эту строчку добавить в настройки xcache? Или XenForo?
     
  5. maus

    maus Местный

    Регистрация:
    27.03.12
    Сообщения:
    187
    Симпатии:
    129
    В файле настроек mysql. Толку-то что говорить, если нубас? Вернетесь к этому вопросу, как опыта больше станет.
     
  6. Mike

    Mike Местный

    Регистрация:
    30.11.11
    Сообщения:
    149
    Симпатии:
    3
    Версия XF:
    1.1.0 Final
    А тут я разве опыт не получаю?) Мало того еще и драгоценный. Есть просто разные пути к его получению. Ну да ладно. *Нубас имелось ввиду конкретно в этих вопросах, не надо обобщать в целом. :)

    По 2 - conf.f/mysql.ini - видимо тут.
    А 1 - где и как увеличить? в xcache?
     
  7. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Да, скорее всего проблема как раз в том, что у него кеш обнуляется. Попутно еще подправить xcache.gc_interval нужно, установив в качестве значения 300.
     
  8. Mike

    Mike Местный

    Регистрация:
    30.11.11
    Сообщения:
    149
    Симпатии:
    3
    Версия XF:
    1.1.0 Final
    Вот, что пишет суппорт :

    Уважаемый Михаил!

    Согласно информации утилиты strace, больше всего времени при выполнении php-скриптов сайта мойфорумforum.ru занимает системный вызов lstat:

    strace -cp `ps -e -o pid,cmd --sort=%cpu | grep '/usr/sbin/apache2 -k start' | grep -v grep | awk '{ print $1 }' | tail -1`
    Process 15931 attached - interrupt to quit
    Process 15931 detached
    % time seconds usecs/call calls errors syscall
    ------ ----------- ----------- --------- --------- ----------------
    97.05 0.001249 0 4653 1 lstat
    1.94 0.000025 0 98 write
    ..
    ------ ----------- ----------- --------- --------- ----------------
    100.00 0.001287 5604 23 total

    % time seconds usecs/call calls errors syscall
    ------ ----------- ----------- --------- --------- ----------------
    51.83 0.005542 0 136864 6 lstat
    31.14 0.003330 1 4160 34 read
    ..
    ------ ----------- ----------- --------- --------- ----------------
    100.00 0.010693 163295 369 total

    % time seconds usecs/call calls errors syscall
    ------ ----------- ----------- --------- --------- ----------------
    71.32 0.004994 0 113661 lstat
    7.57 0.000530 0 3123 26 read
    ..
    ------ ----------- ----------- --------- --------- ----------------
    100.00 0.007002 134681 261 total

    Системный вызов lstat служит для работы файловой системой и получения информации о файлах, большей частью данные вызовы связаны с php-файлами сайта. Например, довольно большую часть вызовов среди вызовов lstat занимают обращения к файлу /var/www/мойфорумforum/data/www/мойфорумforum.ru/library/Zend/Db/Profiler/Query.php и сопутствующие:

    strace -o /root/tmp/strace-apache.log.0 -p `ps -e -o pid,cmd --sort=%cpu | grep '/usr/sbin/apache2 -k start' | grep -v grep | awk '{ print $1 }' | tail -1`
    Process 1991 attached - interrupt to quit
    Process 1991 detached

    /root/tmp/strace-apache.log.0
    ..
    lstat("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lstat("/var/www", {st_mode=S_IFDIR|0751, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum", {st_mode=S_IFDIR|0501, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data", {st_mode=S_IFDIR|0751, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www", {st_mode=S_IFDIR|0751, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www/мойфорумforum.ru", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www/мойфорумforum.ru/library", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www/мойфорумforum.ru/library/Zend", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www/мойфорумforum.ru/library/Zend/Db", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www/мойфорумforum.ru/library/Zend/Db/Profiler", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www/мойфорумforum.ru/library/Zend/Db/Profiler/Query.php", {st_mode=S_IFREG|0644, st_size=4989, ...}) = 0

    egrep -c '^lstat' /root/tmp/strace-apache.log.0
    71682

    egrep '^lstat' /root/tmp/strace-apache.log.0 | grep -c 'Query.php'
    1156

    echo '11*1156' | bc
    12716

    Также это обращения к другим php-скриптам сайта на чтенние:
    /root/tmp/strace-apache.log.0
    ..
    lstat("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lstat("/var/www", {st_mode=S_IFDIR|0751, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum", {st_mode=S_IFDIR|0501, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data", {st_mode=S_IFDIR|0751, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www", {st_mode=S_IFDIR|0751, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www/мойфорумforum.ru", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www/мойфорумforum.ru/library", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www/мойфорумforum.ru/library/Zend", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www/мойфорумforum.ru/library/Zend/Controller", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www/мойфорумforum.ru/library/Zend/Controller/Response", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lstat("/var/www/мойфорумforum/data/www/мойфорумforum.ru/library/Zend/Controller/Response/Abstract.php", {st_mode=S_IFREG|0644, st_size=20647, ...}) = 0
    open("/var/www/мойфорумforum/data/www/мойфорумforum.ru/library/Zend/Controller/Response/Abstract.php", O_RDONLY) = 256

    По всей видимости требуется корректировать настройки php-акселератора, чтобы опкод php-скриптов брался из кэша акселерератора, а не с файловой системы.
    - Что написать в ответ можно? Настройте пхп-акеселератор? :)
     
  9. maus

    maus Местный

    Регистрация:
    27.03.12
    Сообщения:
    187
    Симпатии:
    129
    У вас xcache.stat все ещё off? Как только вы переставили php на модуль apache, стал использоваться другой файл настроек php. Проверьте ещё раз. Дело все в настройках xcache, как только он перестанет опрашивать файловую систему, нагрузка спадет.
    Так, с настройками все в порядке.

    Как вариант - у вас мало памяти для кэша выделено. Попробуйте изменить в настройках xcache.size на 256M
     
  10. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    OOMs — сколько раз файлы не попали в кэш из-за нехватки памяти. Нужно стремиться к нулю. Если один демон Apache с модулем php5 обслуживает сразу несколько доменов или, когда используется одновременно несколько различных движков (форум, портал, сайт, и т.д.) на одном домене, требуется довольно большой объем памяти на то, чтобы все влазило в кеш и не приходилось каждый раз подгружать все из файловой системы. При этом нет надобности постоянно все хранить в кеше. Т.е. лучше поставить xcache.gc_interval в какое-нибудь значение типа 300 или более секунд. Это позволит постепенно освобождать кеш от неиспользуемого кода. Таким образом можно и незапредельно много выделять памяти под кеш и сохранить хорошее быстродействие.

    Кстати, если будет использоваться одновременно несколько движков ксена (на разных доменах или на одном - не важно), то обратите внимание на 'cache_id_prefix' => 'xf_' в конфиге ксена. Для всех нужно делать их разными. Иначе кешируемые переменные от разных движков будут пересекаться, что приведет к разного рода "глюкам".
     
  11. maus

    maus Местный

    Регистрация:
    27.03.12
    Сообщения:
    187
    Симпатии:
    129
    infis, в xcache кэш файлов общий, или он правда делится поровну между ядрами?
     
  12. infis

    infis Местный

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

    Вроде так получается. Могу ошибаться, и это сейчас уже работает иначе, но раньше точно работало так.

    Привожу пример ниже:
    xcache.jpg
    Здесь видим четыре потока по 16 Мб. В сумме 64 Мб. В каждом из потоков доступно от 1.93 Мб до 5.29 Мб. Теоретически должно бы влезть что-то и достаточно тяжелое до 5.29 Мб. Но! Пусть файл php будет занимать 4.5 Мб. Однозначно в потоки #0 и #1 он не влезет, поэтому будет предпринята попытка разместить его в поток #2. Как видим, там достаточно места вообще, но вот количество последовательных слотов там, скорее всего, меньше, чем нам нужно - где-то около 3.8 Мб. Получается, что не влазит. Хорошо, тогда будет предпринята попытка поместить его в поток #3. Опять-таки, почти влез..., но там, хотя и больше, но где-то около 4 Мб. Результат печальный - опкод такого файла просто не будет помещен в кеш, о чем в колонке OOMs будет указано. И каждый раз при попытке кеширования этого файла будут впустую тратиться ресурсы, на попытку размещения его в кеше. Падает производительность, так как процессор будет лишний раз лопатить всю процедуру. Если на дисковую подсистему нагрузка будет невысокая, то на производительности файловой системы это не сильно отразится, так как файловый кеш самой ОС никто не отменял.
    Так как у меня памяти не много, поэтому я использовал GC - таймер очистки кеша (xcache.gc_interval), что позволяет производить очистку кеша от неиспользуемых в текущее время каких-то файлов.
     
    Yoskaldyr, Mike и maus нравится это.
  13. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    infis так расписал что и добавить нечего :)
     
  14. Mike

    Mike Местный

    Регистрация:
    30.11.11
    Сообщения:
    149
    Симпатии:
    3
    Версия XF:
    1.1.0 Final
    Вот так прискорбно выглядит сегодняшняя статистика :

    [​IMG]

    Суппорт fastvps.ru - ничего с этим поделать не может. Как только не пробовал конфигурировать xcache, не судьба. Пробовать на других провайдерах разместить и там потестировать хкаш с хенфоро?

    Время: 0,1201 сек. Память: 6,175 МБ Запросов к БД: 13
     
  15. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Что еще у Вас там крутится помимо XenForo? Слишком много закешированных файлов соответственно сильно забит кеш
     
  16. maus

    maus Местный

    Регистрация:
    27.03.12
    Сообщения:
    187
    Симпатии:
    129
    Спасибо ему за это. А то код там дико нечитаемый. Си пора на пенсию.

    Mike, если с икскэшем не получается, попробуйте apc с аналогичными настройками (тем же stat). Или count уменьшить до 2. Больше идей нет.
     
  17. Mike

    Mike Местный

    Регистрация:
    30.11.11
    Сообщения:
    149
    Симпатии:
    3
    Версия XF:
    1.1.0 Final
    Стоят форумы vbulletin, но я их никак не оптимизировал, т.к по-умолчанию не уверен что они используют xcache, т.к про это слово я узнал только поставив хенфоро. :)

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

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

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Если движок не умеет пользоваться Xcache, то кешируется только опкод. Я показал свой отчет по одному форуму на 4-й булке. У меня закешировано 280 файлов почти на 50 Мб. Если используется несколько форумов, то просто умножьте эти цифры на их количество и получите необходимый размер кеша. Т.е. для 5 форумов нужно будет около 300 Мб под кеш опкода. Переменные у меня не кешируются, так как не прикручивал поддержку Xcache под булку.
    Судя по Вашему количеству закешированных файлов, крутится у несколько больше форумов, чем у меня :). Поэтому выделяйте под Xcache памяти достаточно, чтобы обеспечить помещение всех файлов в кеш. Различные плагины, кстати, также добавляют и количество файлов и необходимый размер под опкод. Это тоже учитывайте.
    Вам просто недостаточно памяти под кеш. О кешировании переменных пока речь не идет. А кеширование опкода обеспечивается и APC и Xcache примерно одинаково. Поэтому другой кешер без выделения необходимого количества памяти Вам не поможет.

    P.S. Посмотреть, какие файлы закешированы, Вы можете в той же админке Xcache, пройдя там по ссылке "List PHP".
     
    Mike нравится это.
  19. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Mike поставьте последнюю версию xcache 2.х, она позволяет не дублировать в памяти опкод кеш если содержимое 2-х или более файлов одинаковое, даже если они и находятся по разным путям (1.3.3 тоже кажется умеет но не могу гарантировать).
    Т.е. в Вашем случае если у Вас установлено много одинаковых движков (в Вашем случае vb, при условии что версии у Вас одинаковые) это значительно сократит расход памяти при кешировании и тогда может хватить того размера что у Вас задан, т.е. 128Мб.
     
    Mike нравится это.
  20. Mike

    Mike Местный

    Регистрация:
    30.11.11
    Сообщения:
    149
    Симпатии:
    3
    Версия XF:
    1.1.0 Final
    Посмотрел List PHP - там все проекты, которые на этом VDS жрут опкод на сколько я понял. ))) Каким образом можно запретить всем проектам жрать хкаш, кроме 1 (ну или 2) выбранных мною?)

    В настройках xcache желательно, ибо проектов там под 50-60. Не все форумы, есть другие движки. На сколько я понял, все жрут опкод.
     

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