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

Fixed Внимание! Держателям крупных проектов

Тема в разделе "Баги XenForo", создана пользователем neodev, 22.08.2014.

Загрузка
  1. neodev

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

    Регистрация:
    14.05.14
    Сообщения:
    22
    Симпатии:
    17
    Версия XF:
    1.3.2
    На протяжении нескольких дней боролся с зависанием сайта одного из моих клиентов, ковырял лимиты, php-fpm, nginx, mysql - сайт постоянного вываливался постоянно то с 502, то с 504 ошибкой. Явных причин тому небыло - трафик нормальный, нагрузка в норме.

    Запустив профайлер запросов mysql - обнаружил долгое время выполнения запрос в таблицу xf_session_activity. Полез в консоль и phpmyadmin смотреть, из чего же состоит эта таблица - убица форума. Как оказалось - HEAP (MEMORY). Странный выбор разработчиков? Кривые руки программистов или старых админов? Данные в ней не особо ценные - это список Online посетителей сайта, и сами действия, кто чем сейчас занят на сайте, все это хранится в памяти и при рестарте mysql естественно не восстанавливается. Только одно но: HEAP (MEMORY) не поддерживает транзакции, и происходит блокировка ВСЕЙ таблицы на время записи и/или чтения.

    Подробности бага и борьба с ним:
    https://blog-admina.com/master/63-xenforo-xf-session-activity.html

    На правах рекламы:
    http://www.xf-russia.ru/forum/threads/administrirovanie-vds-i-dedicated-serverov.9402/
     
    Dmitriy Jurkin нравится это.
  2. infis

    infis Местный

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

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Выбор вполне обоснованный и разработчики отписались насчет этой таблицы у себя на форуме еще во времена первой публичной беты. Выбор данного типа для этого таблицы это компромисс между универсальностью и скоростью.

    Основная проблема, что 99% сайтов работают на криво настроенном innodb, который в таком случае работает медленнее memory для данных запросов. И считается что если сайт посещаемый ( >1К одновременно онлайн) и админ может посмотреть лог медленных запросов, то разработчик сможет сам разобраться и сменить тип таблицы. Также на посещаемом сайте должен быть включен варкеш, тогда количество запросов к данной таблице тоже значительно уменьшается.

    P.S. И если из-за этой таблицы у вас были 50х ошибки, то могу с уверенностью сказать что проблема не только в ней и и в не совсем оптимальной настройке все остального, т.к. даже на >3К одновременно онлайн с типом таблици по умолчанию (мемори) все работает без ошибок.

    P.P.S. И еще раз повторюсь решение со сменой типа таблицы поможет только при условии правильно настроенной базы, а это меньше 1% всех инсталляций, как бы это и не было печально (я сталкивался когда довольно посещаемые проекты работали на стоковых настройках и на старом ПО - все тормоза решали мощностями железа (рейд, ссд, куча памяти и т.д.)).
     
  4. neodev

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

    Регистрация:
    14.05.14
    Сообщения:
    22
    Симпатии:
    17
    Версия XF:
    1.3.2
    Уважаемый, вы вообще понимаете что такое блокировка таблиц? И как она будет работать при online ~ 500?

    PHP:
    $config['cache'] = array(
        
    'enabled' => true,
        
    'cacheSessions' => true,
        
    'backend' => 'Memcached',
        
    'backendOptions' => array(
            
    'compression' => false,
            
    'servers' => array(
                array(
                    
    'host' => 'localhost',
                    
    'port' => 11211,
                )
            )
        )
    );
    Код:
    # free
                 total       used       free     shared    buffers     cached
    Mem:      32849360    6334016   26515344          0       9728     123332
    -/+ buffers/cache:    6200956   26648404
    Swap:      8000508          0    8000508
    Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz
     
  5. Yoskaldyr

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

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

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

    Регистрация:
    14.05.14
    Сообщения:
    22
    Симпатии:
    17
    Версия XF:
    1.3.2
    Когда это было? тесты InnoDB vs HEAP давно проводились? Или со времен первой беты и MySQL 4 - 5.1?

    Увы, соглашусь с вами.

    http://src24.ru/img/k

    fastcgi_connect_timeout 5; - вам о чем нибудь говорит?

    http://src24.ru/img/t
    --- добавлено : Aug 23, 2014 9:09 AM ---
    Скопировано и переведено со stackoverflow. Поправим.
     
    Последнее редактирование модератором: 31.08.2014
  7. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Я не говорил что данный фикс (а именно смена типа таблицы на InnoDB) не рабочий - он рабочий и его обязательно надо делать если посещалка больше 1К, но только при выполении ряда условий, а именно правильно настроенной базе.
    Блокировка есть и она замедляет работу. Но на стандартном форуме без хаков, которые могут дополнительно обращаться к таблице активности - это не критично, особенно при онлайне 500.

    Я оптимизировал сервера под нагрузку значительно больше 500 онлайн - от 1.5 до 10К одновременно онлайн (да есть и такие форумы), потому могу с уверенностью сказать что на 500 онлайн на чистом форуме эту таблицу можно и не трогать (лучше конечно изменить, но это не критично).

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

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

    Регистрация:
    14.05.14
    Сообщения:
    22
    Симпатии:
    17
    Версия XF:
    1.3.2
    с ?_debug=1 параметром на главной:

    Page Time: 0.0867s
    Memory: 7.0785 MB (Peak: 8.4807 MB)
    Queries (8, time: 0.0079s, 4.7%)

    Код:
    SELECT session_activity.*, user.*, user_profile.*, user_option.*
    FROM xf_session_activity AS session_activity
        LEFT JOIN xf_user AS user ON (user.user_id = session_activity.user_id)
        LEFT JOIN xf_user_profile AS user_profile ON (user_profile.user_id = user.user_id)
        LEFT JOIN xf_user_option AS user_option ON (user_option.user_id = user.user_id)
    WHERE (session_activity.view_date > 1408784611) ORDER BY session_activity.view_date DESC
    Run Time: 0.001450

    Код:
    INSERT INTO xf_session_activity
        (user_id, unique_key, ip, controller_name, controller_action, view_state, params, view_date, robot_key)
    VALUES
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
    ON DUPLICATE KEY UPDATE
        ip = VALUES(ip),
        controller_name = VALUES(controller_name),
        controller_action = VALUES(controller_action),
        view_state = VALUES(view_state),
        params = VALUES(params),
        view_date = VALUES(view_date),
        robot_key = VALUES(robot_key)
    Run Time: 0.000222

    P.S. mysql as percona-xtradb-cluster 5.6
     
    Последнее редактирование: 23.08.2014
  9. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    В том то и дело что 5.1 стоит везде где только можно. Даже брать тот же редхат центос 6.х линейки - по умолчанию идет 5.1 а не что-то более новое.

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

    Если говорить насчет 50х ошибок то если говорить о связке php-fpm + xenforo, то данная таблица сессий не единственное узкое место, например, отсылка почты через smtp-серевер тоже может вызывать такие проблемы. Т.е. главное избегать долгих скриптов, но это в идеале, но на практике бывает что единственным способом (без переписывания кода сторонних дополнений) является значительное увеличение количества воркеров и значительное увеличение очереди (backlog).
     
  10. neodev

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

    Регистрация:
    14.05.14
    Сообщения:
    22
    Симпатии:
    17
    Версия XF:
    1.3.2
    Я настроил sendmail на пересылку через gmail. Вся почта моментально уходит, складывается в очередь mailq и затем уже отправляется postfix'ом. (Думаю это самый оптимальный вариант, у клиента настроены MX на google.)

    Код:
    ...
    net.ipv4.tcp_syncookies=1
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    net.ipv4.tcp_rmem = 4096 87380 16777216
    net.ipv4.tcp_wmem = 4096 16384 16777216
    net.core.somaxconn = 4096
    net.core.netdev_max_backlog = 16384
    net.ipv4.tcp_max_syn_backlog = 8192
    ...
    Код:
    php-fpm: listen.backlog = -1
    Код:
    listen 0.0.0.0:80 backlog=1024;
     
    Последнее редактирование: 23.08.2014
  11. hasvanbinsun

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

    Регистрация:
    03.10.14
    Сообщения:
    8
    Симпатии:
    0
    Версия XF:
    1.4.1
    Ссылка мёртвая, как решить проблему, у меня в xf_session_activity запрос по 2-5 секунд обрабатывается.
     
  12. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    В ссылке в качестве решения меняли тип таблицы на InnoDB.
     
  13. hasvanbinsun

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

    Регистрация:
    03.10.14
    Сообщения:
    8
    Симпатии:
    0
    Версия XF:
    1.4.1
    Решил кэшированием сессий, если проблема повторится поменяю на InnoDB. Разработчики не дураки, не просто так там MyISAM. Если все таблицы в ксене поменять на инну, это не скажется на безопасности, но прибавит производительность, верно?
     
  14. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Они и так там практически все InnoDB (за редким исключением MyISAM). А вот таблица активных сессий по умолчанию идет с типом MEMORY. Вот из-за этого типа и возникает проблема, так как при большом онлайне происходит частое обращение к этой таблице на запись, а при типе MEMORY блокируется вся таблица для выполнения этой операции. Изменение на InnoDB позволяет обойтись без блокировки всей таблицы. Но зато это ухудшает чтение. В общем кеширование сессий, конечно, также может быть решением.
     
  15. slowpoke

    slowpoke Местный

    Регистрация:
    07.10.10
    Сообщения:
    158
    Симпатии:
    81
    Версия XF:
    1.1.1
    Ну мемори быстрее, а нету аддонов для переноса этой части в тот-же redis или memcached?
     
  16. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Так при включенном кеше можно и сессии кешировать. Вот пример:
    Код:
    $config['cache'] = array(
       'enabled' => true,
       'frontend' => 'Core',
       'frontendOptions' => array(
          'caching' => true,
          'automatic_serialization' => false,
          'cache_id_prefix' => 'myprefix_',
          'lifetime' => 18000
       ),
       'backend' => 'Xcache',
       'backendOptions' => array(),
       'cacheSessions' => true,
    );
    У меня под XCache, но можно использовать и мемкеш.
    --- добавлено : Mar 13, 2015 10:41 AM ---
    А вообще на офе есть даже специальная справка - https://xenforo.com/help/cache/
     
    Последнее редактирование модератором: 21.03.2015
    slowpoke, FractalizeR и Mirovinger нравится это.

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