Typecho 性能优化指北
本文将从后端角度分析 Typecho 性能提升关键,并最终实现 TTFB 时间缩短到 200ms 以内,业余且水平有限,仅供参考。
前言
最近跟朋友分享博客的时候发现博客在手机上打开及其缓慢,拿来电脑用工具看一下 TTFB 高达 2s,算上解析连接下载等一系列时间完成加载超过 4s。这时才意识到之前从 EMLOG 迁移以后根本没有做优化,今天着手干一下。
测试用的是 Hostdare 洛杉矶 CKVM2 型号,具体为 2 核,1.5G 内存,75G RAID10 SSD,60Mbps 最低保证 CN2GIA 网络。到国内全网延迟约 150ms,IO 约 130MB/s,VPS 仅运行一个网站没别的程序在跑,对于个人网站来说算是中等偏上的配置。
PHP
版本
PHP 版本无疑是罪魁祸首之一,EMLOG 太久没更新根本不支持 PHP7.x。而事实上,7.x 相比于 5.x 的提升是质的飞跃。甚至同样的 Typecho1.1(17.10.30) 版本分别在两个版本的 PHP 下执行时间相差甚远。
user@host:# time php index.php > /dev/null 2>&1
real 0m1.525s
user 0m0.180s
sys 0m0.036s
# php5.6.33
user@host:# time php index.php > /dev/null 2>&1
real 0m0.178s
user 0m0.067s
sys 0m0.006s
# php7.3.15
Opcache 脚本缓存
Opcache 是脚本缓存器。Opcache 加入编译可以进一步加速高并发时 PHP 的效率。
user@host:# time php index.php > /dev/null 2>&1
real 0m0.093s
user 0m0.037s
sys 0m0.007s
# php7.3.15 第二次执行
这时执行速度就比较优秀了,在亚太 VPS 上可以保证 TTFB 在 300ms 以下了。
Mencached 高性能页面缓存
通常 CMS 或其他大型程序都会自带基于 Redis 或 Mencache 的缓存,来保证高并发下的性能。而 Typecho 这样的轻量级程序显然是不会自带的。这时就要强推这款插件了。
TpCache 支持 Memcache,Memcached 和 Redis 缓存,开启后完全榨干 CPU 性能。
通过 loader.io 进行的压力测试。在 1W/min 的并发测试下。仅有 0.06% 的错误率,还能把延时保持在 2s 以内。
这时的性能瓶颈就是那最低保证 60M 的出口带宽了。
Nginx
Worker Process
新版 Nginx 默认工作进程数量都是 auto 。但是这个 auto 并不能正确识别超线程 CPU 的核心数而导致阻塞。所以手动把它改成 CPU 实际核心数更好。
Tcp Fast Open
TFO 可以使在 Session 过期前再次发起 TCP 链接的时候不需要再次进行而直接传输数据。TCP 三次握手消耗时间约为三倍 PING time,尤其对于大洋彼岸的服务器,这累计的时间是不可忽视的。
在 Nginx 配置的 server 段监听端口后添加 tcpfastopen=3
listen 443 ssl tcpfastopen=3;
TLS1.3
配合 TFO,TLS1.3 带来的 0-RTT 握手,从而提升了 HTTPS 性能,使得握手的时间缩短为一个 PING time 以内。
Brotli
理论上讲 Brotli 压缩比 GZIP 要高不少,所以对于网页打开速度也是有一定作用的。
Pagespeed
PageSpeed 是 Google 推出的一项网页加速服务,主要是通过改写 HTML、CSS、JS 文件源码以及图片、 SSL 等达到加速网站的效果。效果显著但吃 CPU,非 Chrome 浏览器兼容性也不好,这里就不展开说了。
Linux 内核
BBR 锐速之类的 TCP 加速就不多说了。
打开文件数
我发现系统默认的文件打开数太小,可以扩大一些。
比如 Ubuntu 默认 1024,高并发时可能会出现文件打开数过多导致 502 错误。
附
本文参考了如下文章。
- 挖站否 - 开启 Brotli 压缩:https://wzfou.com/tlsv1-3-brotli/
- 宝塔论坛 - Nginx 前端优化模块 Pagespeed:https://www.bt.cn/bbs/thread-12990-1-2.html
- 简书 - PHP 7.3 是时候升级了:https://www.jianshu.com/p/00c4bb772e02
- Geek Man - Tideways 与 Xhgui 实现 PHP 性能分析实践:https://blog.geekman.dev/use-tideways-and-xhgui-to-analyze-php-performance/
- 闪星空间 - HTTPS cipher suite 配置与检测:https://shansing.com/read/489/
博主你好,世纪互联绑定rclone后离线下载后文件没有自动上传。不知道是哪里的问题,世纪互联的绑定有教程嘛我小白一个可能哪里搞错了
不好意思,我的偏灰色项目不打算写详细教程,请参考README。在DashBoard里面有详细日志,可参考定位问题。若想更进一步讨论请在GitHub开Issue。
文章不错非常喜欢,支持一下
小伙子好久不见
忙于奔命