Как улучшить производительность Woocommerce WP_List_Table :: display с 5-15 сек? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть сайт WordPress WooCommerce с 3500 продуктами и 100 пользовательскими атрибутами (обычно 4-7 для каждого продукта) (главной странице требуется оптимизация изображения) (общий размер 4 МБ). Серверы часто отстают, задерживая ответ страницы 10 + сек. (Я не знаю, связано ли это с проблемой или это просто php opcache, если я попытаюсь запустить php echo 'test', а затем изменить его на echo 'test2', URL даст мне test вместо test2) .

Есть 5-6 человек, использующих панель администратора (все из 1 соединения с загрузкой 5 Мбит / с / загрузкой 0,7 Мбит / с).

Когда 5-6 человек используют сайт, он начинает показывать огромную задержку (10 + сек). Я смотрю, как определить ошибку или определить узкое место / проблему.

ОЗУ: Из 32 ГБ используется только 2 ГБ (видно изображение монитора htop) nginx регистрирует предупреждения / ошибки о некоторых устаревших функциях WooCommerce также иногда отчет консоли браузера не может загрузить admin-ajax.php Журнал ошибок получает 20 МБ за один день с ошибками устаревания.

Обновление файлов PHP LOG сообщало все время

[09-May-2018 22:06:28] WARNING: [pool www] server reached pm.max_children setting (15), consider raising it
[09-May-2018 21:19:52] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 5 idle, and 14 total children

У меня увеличилось число детей до 150 min_spare 17 start 35 max_spare 50, но все же, когда я обновляю страницу в edit.php (панель администратора), у меня 4.83s ожидания

Queued at 0
Started at 0.20 ms
Resource Scheduling     TIME
Queueing    
​
0.20 ms
Connection Start        TIME
Stalled 
​
1.27 ms
DNS Lookup  
​
0.53 ms
Initial connection  
​
45.20 ms
Request/Response        TIME
Request sent    
​
31 μs
**Waiting (TTFB)     4.83 s**

Content Download    
​
287.13 ms

Spec:

  • 8 ядер: 4200 bogomips каждый

  • Nginx с PHP7.2-fpm

  • Mariadb innodb таблицы

error.log

Фотографии htop, лог доступа в конце:

htop

server graph

enter image description here

Config:

NGINX config
user www-data;
worker_processes 8;
pid /run/nginx.pid;


events {
    worker_connections 1024;
    # multi_accept on;
}

http {
    proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=3000m inactive=600m;
    proxy_temp_path /var/tmp;

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 15;
    types_hash_max_size 2048;
    server_tokens off;
    client_max_body_size 20M;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    fastcgi_buffers 16 16k; 
    fastcgi_buffer_size 32k;
    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    #access_log off;
    #error_log off;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

     gzip_vary on;
     gzip_proxied any;
     gzip_comp_level 6;
     gzip_buffers 16 8k;
     gzip_http_version 1.1;
     gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Обновление 1

Если я не авторизован на сайте, отвечаю TTFB за 30 мс (загружается полностью через 1-3 с). Если я зашел на сайт, ответьте TTFB за 5000 мс (загружается полностью за 7-9 секунд).

Обновление 2

Если все (плагины) включено, любая страница, связанная с продуктами WooCommerce, будет иметь задержку ответа TTFB 4-6 секунд. несвязанные страницы (Контакт, Общие настройки, Сообщения, Страницы, установка плагина будут иметь низкий TTFB (800 мс - 1200 мс)

Если я деактивирую все плагины, TTFB снижается до 500 мс 0,5 с. Если я включу любой плагин, кроме Woocommerce, TTFB будет 500-700 мс.

Если я отключу все плагины и включу только Woocommerce и попытаюсь получить доступ к списку продуктов, страница задержит TTFB на 5 секунд (+ загрузка контента).

Я создал собственную дочернюю тему на основе витрины магазина. Если я изменю активную тему, WooCommerce по-прежнему будет иметь ту же неисправность (5 секунд TTFB, ожидающих в списке продуктов).

Если я нахожусь на анонимной вкладке Chrome (не вошел в систему) и обновляюсь, страница загружается быстро. У меня включены Nginx, PHP opcache и общий кеш w3 (если я очищаю кеш, анонимному сеансу понадобится 5 секунд TTFB для загрузки страницы с продуктами).

Я также попробовал свежую установку WordPress. Загрузите только WooCommerce с магазином и скопируйте базу данных с живого сайта. Проблема сохраняется (если вы попытаетесь просмотреть список продуктов на панели администратора, вы получите ответ ожидания TTFB 4 с).

Благодаря приведенному ниже комментарию я установил Newrelic. parse_query 2.0 миллиона менее чем за 30 минут:

enter image description here

enter image description here

Обновление 3 WP_List_Table :: отображение, содержащее продукты, занимает слишком много времени для выполнения

Может ли причиной задержки быть печать php? и запросы к базе данных, связанные с продуктом (см. update3)

wp-admin / edit.php (список продуктов woocommerce) template-homepage (содержит 2 слайд-шоу товаров) Архив продукта (содержит список продукта + woof -> плагин атрибутного фильтра) Одностраничный продукт также с некоторой задержкой

В админке я получаю в консоли консоли сообщение об ошибке [DOM] Найдено 2 элемента с неуникальным идентификатором # in-product_cat-99:

Каждый запрос к базе данных составляет 14-30 мс, но на трассировке веб-транзакции видно, что печать продуктов (WP_List_Table :: display) занимает слишком много времени.

Как я могу это исправить? Это плохая конфигурация php? плохой код? sql плохая конфигурация?

PHP config: ссылка со всеми моими файлами (nginx php mariadb)

Изображения нового реликвия:

enter image description here

enter image description here

enter image description here

enter image description here

1 Ответ

0 голосов
/ 23 мая 2018

Это медленный запрос?

SELECT  t.*, tt.*, tm.meta_value
    FROM  wp_terms AS t
    INNER JOIN  wp_term_taxonomy AS tt
              ON t.term_id = tt.term_id
    INNER JOIN  wp_term_relationships AS tr
              ON tr.term_taxonomy_id = tt.term_taxonomy_id
    LEFT JOIN  wp_termmeta AS tm
              ON ( t.term_id = tm.term_id
             AND   tm.meta_key = ? )
    WHERE  tt.taxonomy IN (?)
      AND  tr.object_id IN (?)
    GROUP BY  t.term_id
    ORDER BY  tm.meta_value+? ASC,
              t.name ASC 

Почему GROUP BY? Неправильно не GROUP BY все неагрегированные столбцы в предложении SELECT. Вы получите непредсказуемые значения для других столбцов.

Фильтрация (WHERE) по двум разным таблицам (tt и tr) затрудняет оптимизатору понимание, с какой таблицы начинать.

Вам действительно нужны все столбцы (*) t и tt? Запрос ограниченного набора столбцов может ускорить запрос и / или может предоставить дополнительные параметры оптимизации.

Если Оптимизатор решит начать с tt, тогда нужны следующие индексы:

tt:  (taxonomy)
t:   (term_id)
tr:  (term_taxonomy_id)
tm:  (term_id, meta_key)

Если оно начинается с tr:

tr:  (object_id, term_taxonomy_id)
plus most of the above

Добавьте все эти индексы, если они еще не существуют.

Если вам не удастся добавить индекс для meta_key, есть несколько вариантов. См http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

Эта ссылка дает другие рекомендации по производительности для таблиц сопоставления "многие: многие" на основе WordPress. Я предполагаю, что wp_termmeta такая таблица. Может быть, другие тоже?

Пожалуйста, укажите SHOW CREATE TABLE для каждой из 4 таблиц и EXPLAIN SELECT ..., если вы хотите обсудить это далее.

...