This post was published in 2020-12-28. Obviously, expired content is less useful to users if it has already pasted its expiration date.
本文仅涉及:
- 单线程测试程序
- page generation time: timer_stop(1)
本文不涉及:
- 多线程压力测试、并发测试(比如apache2-utils、loader.io)
- 各类页面缓存插件(page cache plugins)
- 页面打开速度
- GTmetrix跑分、pagespeed跑分、lighthouse跑分
起因:在wordpress下安装了任意一款page cache相关的插件(比如w3 total cache、wp rocket)以后,wordpress网页的打开速度确实提升了很多很多。但打开一个非cache页面——比如一个搜索结果页面,或者操作wp-admin/*界面,仍然会很慢。
我的博客目前(2020-2021)部署在Fastcomet最便宜($2.95/m)的shared web hosting服务器上,无法开启opcache、object cache,也无法进行web server的切换。所以我购买了另一个VPS来进行一些娱乐性质的实验,通过切换几个不同的wordpress部署环境来进行性能对比,包括Apache、Nginx、OpenLiteSpeed、是否开启Opcache、是否开启object cache等。
Table of Contents
Fastcomet
目前正在使用的web hosting供应商。
属性:
- apache 2.4
- php 7.4
- 没有opcache、redia、memcached、varnish
- 2GB内存
- shared hosting,性能受限
- 无法编辑php.ini文件
在主题里添加 timer_stop(1) 来显示页面生成时间:
<?php echo get_num_queries(); ?> queries in <?php timer_stop(1); ?> seconds using memory <?php echo round(memory_get_peak_usage()/1024/1024,2); ?> MB.
我在另一个VPS上跑一个python程序用于遍历整个sitemap,默认为单线程。结果显示,大部分页面的生成时间都在1.5秒上下浮动:
当然,如果开了多线程,结果会更加糟糕:
额外的VPS
- 腾讯云标准型S2
- 把我在fastcomet上托管的网站原封不动复制过来进行测试
- Debian 10.2
- 2GB内存
- vcpu:1核
- 为了排除外界干扰,限制了ip access,只允许python程序访问
- python程序:1 thread
Apache
- apache 2.4.6
- php 7.4
- mysql 5.7
初始环境
先不安装opcache,让运行环境尽可能和fastcomet一致:
结果:总体要比fastcomet好很多,毕竟我在fastcomet用的是最便宜的shared web hosting plan,性能处处受限。
+ Opcache
然后开启opcache:
页面生成时间普遍降低了4~5倍,由此可见opcache可能是提高性能最关键的一步,而fastcomet就正好不给我开opcache。
+ Memcached / Redis
额外跑了一下memcached和redis,但效果提升不是很明显,这种娱乐性质的单线程实验本身也很难精确体现出它们的优势。
Nginx
nginx就是走个过场,因为单线程程序完全体现不出nginx的优势。
- nginx 1.19
- php 7.4
- mysql 5.7
理论上推测nginx和apache的结果应该差不多。事实也确实如此:
后续的memcached / redis也和上文一样,在单线程程序里难以体现出明显的性能提升。
OpenLiteSpeed
由于这是测试环境,无法申请到LiteSpeed,所以只能使用它的开源版本OpenLiteSpeed。
- 使用官方的1-click-install安装
- 使用默认配置:mariadb 10.2,LSPHP 7.4
初始环境
(OpenLiteSpeed默认开启opcache)
好吧,单从页面生成时间的角度来看,OpenLiteSpeed确实很强。
+ LSMCD UNIX Socket / Redis TCP
LiteSpeed Memcached (“LSMCD”) is LiteSpeed's persistent memcache-compatible cache daemon. It’s performance and interface are similar to the popular Memcached, with the addition of high-availability replication. In LSMCD, cache data is persistent on both single and multiple box setups -- preserving all cache data through updates and instances of server failure.
https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:lsmcd:installation
好吧,也尝试一下LiteSpeed推荐的LSMCD in UNIX Socket mode。
需要先编译一个LSMCD:https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:lsmcd:installation,然后安装LSPHP-memcached扩展,至少确保LiteSpeed能够连接127.0.0.1:11211;最后修改配置文件,把LSMCD TCP变成LSMCD Unix Socket。
此外Redis(这里用的是TCP模式)的测试也跑了一次:
总结
结果对比
注:FastComet:没有Opcache;Apache、Nginx、OpenLiteSpeed:已开启Opcache
后续
LiteSpeed很强,Opcache很关键,然而这又有什么用呢?我购买了1年的FastComet套餐,在折腾完这些优化实验后还是要面对FastComet的廉价共享主机。
* 补充:过了一年我搬出了FastComet,但并没有使用Litespeed,而是使用了nginx + fastcgi . 具体内容见:🔗 本站使用的插件 - Truxton's blog;🔗 WordPress cache preload code (python3) - Truxton's blog .