我正在运行一个 WordPress 网站,该网站每月有 50 万访问者,15 万篇帖子,平均每秒有 100 次页面浏览量。我想弄清楚服务器上的负载是否正常,或者我是否可以做些什么来解决性能问题,而无需增加服务器设置和每月费用。
这是我现在正在运行的服务器设置:
- 2 个前端服务器,Nginx:2 个 CPU 和 4GB RAM
- 1 个数据库服务器,MariaDB:8 个 CPU 和 16GB RAM
- 1 个 Redis 服务器:2 个 CPU 和 4GB RAM
WordPress 主题是从头开始开发的,我优化了查询并尽量减少插件的使用(总共 5 个插件)。
我运行带有反向代理缓存的 Nginx,其中我将所有页面缓存 5 分钟,以便能够处理流量高峰(每天两次的高峰,发送新闻通讯时 30 分钟内有 3k 名访问者)。
MariaDB 和 Redis 服务器运行 Debian,采用开箱即用的配置。我唯一更改的是 MariaDB 中的 innodb_buffer_pool_size = 11G 和 max_connections = 300。
当有 100 个实时访问者时,DB CPU 的运行率为 50%,而当有 300-700 个实时访问者时,DB CPU 的运行率为 85-90%。
问题是,即使 CPU 负载为 50%,查询也需要一些时间才能加载(3-6 秒)。
我的暂存环境在完全相同的服务器上运行,但使用另一个数据库表(相同数量的帖子),查询时间为 0.5-1.5 秒。
因此唯一的区别是生产数据库拥有更多的并发用户。
什么原因导致查询需要这么长时间才能加载?
答案1
首先,如果您还没有启用慢查询日志记录,请启用它:
https://mariadb.com/kb/en/library/slow-query-log-overview/
接下来,您可以取出其中一个查询并将EXPLAIN
其放在前面。这将向您显示一个表格,解释执行查询时发生的情况。例如,它将显示执行查询时是否使用了索引。以下页面解释了所有列的含义:
https://mariadb.com/kb/en/library/explain/
大多数时候,在具有良好基数的列上放置一个经过深思熟虑的索引将显著减少执行查询所需的时间。
答案2
WP 中的一个主要缓慢问题是可以修复的。
http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta 讨论如何更改 postmeta(以及可选的其他元表)的模式,以便使用该表的主要查询运行得更快。