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 性能。

1.png

通过 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 错误。

本文参考了如下文章。

  1. 挖站否 - 开启 Brotli 压缩:https://wzfou.com/tlsv1-3-brotli/
  2. 宝塔论坛 - Nginx 前端优化模块 Pagespeed:https://www.bt.cn/bbs/thread-12990-1-2.html
  3. 简书 - PHP 7.3 是时候升级了:https://www.jianshu.com/p/00c4bb772e02
  4. Geek Man - Tideways 与 Xhgui 实现 PHP 性能分析实践:https://blog.geekman.dev/use-tideways-and-xhgui-to-analyze-php-performance/
  5. 闪星空间 - HTTPS cipher suite 配置与检测:https://shansing.com/read/489/

本文链接:https://zeallr.com/read/427.html
若无特别说明,本文系原创,且遵循 创意共享 4.0 许可证 (署名 - 非商业性使用 - 相同方式共享)

    一叶
    一叶  2020-04-02, 14:34

    博主你好,世纪互联绑定rclone后离线下载后文件没有自动上传。不知道是哪里的问题,世纪互联的绑定有教程嘛我小白一个可能哪里搞错了

      xinxin8816
      xinxin8816  2020-04-02, 17:10

      不好意思,我的偏灰色项目不打算写详细教程,请参考README。在DashBoard里面有详细日志,可参考定位问题。若想更进一步讨论请在GitHub开Issue。

    容添下
    容添下  2021-06-04, 18:52

    文章不错非常喜欢,支持一下