如何从5-15secs改善Woocommerce WP_List_Table ::显示性能?

时间:2018-05-09 20:07:02

标签: php wordpress nginx webserver mariadb

我有一个WordPress WooCommerce网站,拥有3.500个产品和100个自定义属性(通常每个产品4-7个)(首页需要图像优化)(总大小为4MB)。服务器经常滞后于延迟页面响应10 +秒。 (我不知道它是否与问题有关,或者只是php opcache,如果我尝试运行php echo' test'然后将其更改为echo' test2&# 39;网址将给我测试而不是test2)。

有5-6人使用管理仪表板(全部来自1个连接,5mbps下载/ 0.7mbps上传)。

当5-6人使用该网站时,它开始显示出巨大的延迟(10 +秒)。我正在寻找如何发现错误或找出瓶颈/问题。

RAM: 32 GB使用仅2GB(见htop显示器图片) nginx错误记录有关某些WooCommerce弃用函数的警告/错误 有时浏览器控制台报告无法加载admin-ajax.php 错误日志在一天内变为20MB,弃用错误。

更新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分钟_sare 17 start 35 max_spare 50, 但是当我在edit.php(管理仪表板)刷新页面时,我还有4.83秒等待

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

规格:

  • 8个核心:每个4200个bogomips

  • Nginx with PHP7.2-fpm

  • Mariadb innodb表

error.log

htop照片,最后访问日志:

htop

server graph

enter image description here

配置:

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

如果我未登录该站点,则在30ms内响应TTFB(在1-3秒内完全加载)。如果我登录该站点,则在5000毫秒内响应TTFB(在7-9秒内完全加载)。

更新2

如果启用了所有内容(插件),则与WooCommerce产品相关的任何页面都将具有4-6秒的TTFB响应延迟。不相关的页面(联系人,常规设置,帖子,页面,插件安装将具有低TTFB(800ms-1200ms)

如果我停用所有插件,TTFB会下降到500毫秒0.5秒。如果我启用除Woocommerce之外的任何插件,TTFB将为500-700ms。

如果我禁用所有插件并且我只启用Woocommerce并尝试访问产品列表,则页面将延迟TTFB 5秒(+加载内容)。

我根据店面建立了自己的孩子主题。如果我更改活动主题,WooCommerce仍会出现相同的故障(5秒TTFB等待产品列表)。

如果我在匿名Chrome标签页(未登录)并刷新,则页面会快速加载。我启用了Nginx,PHP opcache和w3总缓存(如果我清除缓存,匿名会话将需要TTFB 5秒来加载带有产品的页面)。

我也尝试了一个新的WordPress安装。仅使用店面下载WooCommerce并从实时站点复制数据库。问题仍然存在(如果您尝试查看管理仪表板中的产品列表,您将获得4秒TTFB等待响应)。

感谢下面的评论者,我安装了Newrelic。 parse_query在不到30分钟内完成2.0百万次:

enter image description here

enter image description here

更新3 WP_List_Table ::包含产品的显示需要花费太多时间才能执行

延迟的原因可能是php打印吗?和与产品相关的数据库查询(参见update3)

wp-admin / edit.php(woocommerce产品列表) 模板主页(包含2张产品幻灯片) 存档产品(包含产品列表+ woof - >属性过滤插件) 单页产品也有些延迟

在管理员上我为[DOM]发现broswer控制台错误找到了2个具有非唯一ID的元素#in-product_cat-99:

数据库查询各占14-30ms,但在Web事务跟踪中可以看出打印产品(WP_List_Table :: display)需要花费太多时间。

我该如何解决这个问题?这是不好的PHP配置?坏代码? sql配置不好?

PHP配置:link with all my files (nginx php mariadb)

新报告的图片:

enter image description here

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

这是慢查询吗?

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 BYGROUP BY子句中的SELECT所有非聚合列都是“错误的”。您将获得其他列的不可预测的值。

在两个不同的表(tt和tr)上过滤(WHERE)会使优化器难以知道要从哪个表开始。

您真的需要*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的“many:many”映射表的其他性能建议。我假设wp_termmeta就是这样一张桌子。也许其他一些人也是?

请为4个表中的每个表提供SHOW CREATE TABLE,如果您想进一步讨论,请EXPLAIN SELECT ...