【发布时间】:2019-02-09 20:17:32
【问题描述】:
所以随着时间的推移,我注意到我的网站变得越来越慢,通常在高峰时段和周末 - CPU 负载会达到应有的 10 倍,并且网站通常会变得无响应。
经过大量修改后,我发现注释掉这一行会使 CPU 负载降至正常水平:
$this->file_hits++;
$this->weekly_file_hits++;
$this->daily_file_hits++;
$this->file_last_dl_ip = $downloader_ip;
$this->file_last_dl_time = current_time('mysql');
$wpdb->query("UPDATE " . $wpdb->wpfilebase_files
. " SET file_hits = file_hits + 1, weekly_file_hits = weekly_file_hits + 1, daily_file_hits = daily_file_hits + 1, file_last_dl_ip = '"
. $downloader_ip . "', file_last_dl_time = '"
. $this->file_last_dl_time . "' WHERE file_id = "
. (0+$this->file_id));
这是来自 WordPress 插件的代码。它在下载文件时触发,并且非常不言自明,只需将命中/IP/日期等记录到数据库中的相应行中。
我不明白为什么这个非常简单的更新查询会导致这种情况?
一些信息:
- 该网站在正常流量下可以很好地处理约 150 个同时用户,其中大多数人没有登录,因此会收到缓存页面。
- 在大约 300 个同时用户的大流量下,情况会变得很糟糕。但即使在正常流量下,CPU 也可以跳到“坏”范围。关键是,极端的 CPU 负载似乎非常零星,但随着流量的增加肯定会更加明显。
- 删除此查询 - 因此仍然提供下载服务,并且除了正在更新的数据库之外,仍然执行所有其他与下载相关的代码 - 并且 CPU 负载保持在“良好”到“正常”范围内,即使有大约 300 个用户在线。所以这个查询肯定是罪魁祸首,或者至少是最大的罪魁祸首。
- 有问题的 DB 表包含大约 23,000 行。如果有的话,我认为文本搜索可能是造成这种情况的原因,但禁用用户的前端搜索并没有解决任何问题。
【问题讨论】:
-
表中有多少个file_id?是否已编入索引?
-
你查看慢查询日志了吗?要么它很慢,你可能只需要一个索引。或者它只是执行得太频繁了。
-
我认为你已经达到了 wordpress 的极限。如果您有 150 个 并发 用户,恕我直言,您应该考虑一些缓存/集群解决方案。以某种方式解决此更新问题可能会有所帮助 - 直到您不会遇到下一个主要问题。
-
请显示查询之后它被拼接在一起。
标签: php mysql wordpress query-performance