本文将从全栈角度分析typecho性能提高关键,并最终实现首屏时间缩短到1s之内
<!--more-->
文中服务器是用的是tsukaeru 日本2核1G内存 50G SSD 100Mbps网络的KVM架构vps 到国内电信延迟约150ms
IO约170MB/s(超过1Gbps), UnixBench 双核跑分1400左右
对于我的网站来讲算是中等偏上的配置php
php版本毋庸置疑地影响着以php架构的typecho的运行
php7 相比于php5.x 性能的提高是质的飞跃
一样的typecho版本分别在两个版本的php下执行时间想去甚远
在typecho根目录下执行index.php时间对比css
user@fqdn:# time php index.php > /dev/null 2>&1 real 0m1.525s user 0m0.180s sys 0m0.036s # php5.6.33
user@fqdn:# time php index.php > /dev/null 2>&1 real 0m0.178s user 0m0.067s sys 0m0.006s # php7.2.7
php性能直接影响TTFB(首字节时间),趁早升级吧。html
Opcache
是php缓存器,相似的还有eAccelerater
等。Opcache
加入编译能够进一步加速高并发时php的效率
一般而言php官方源中已经加入Opcache,各大一键lnmp脚本或管理面板都会安装Opcache
如下是屡次执行后再次执行index.php的耗时前端
user@fqdn:# time php index.php > /dev/null 2>&1 real 0m0.093s user 0m0.037s sys 0m0.007s # php7.2.7 第二次执行
能够看出,此时php执行已经很是快了,如果在国内或是香港的vps上,TTFB已经能够缩短到一般建议的300ms如下了mysql
一般大型php站点都会配置页面缓存,这样在高并发下的性能优点很是突出。
typecho做为轻量级博客框架,并无自带Memcached缓存的功能。好在插件老是万能的
推荐一个TpCache插件
支持Memcache, Memcached和Redis,功能算是比较完善的了。
开启缓存插件后高并发瓶颈从cpu性能变成了网络带宽(100Mbps占满)。nginx
下图是在loader.io压测下1700并发一分钟的结果
安利一下loader.io,这是一个sendgrid旗下的压力测试工具,免费版最高可使用美每秒850新连接。git
此时服务器cpu占用仍维持在80%左右,nginx两个worker process 各30% ,memcached 和php-fpm 均在10%如下
mysql为0%github
实际能够达到的并发数大概在1000~1100并发左右,这对于我的网站来讲,除非遭到ddcc,根本不可能有如此大的并发数。ajax
通常而言推荐保持和CPU核心数同样,好比2。
默认的配置是1,若是在多核服务器上这会致使CPU仅利用一核。
也能够配置为auto。算法
TFO 可使在session过时前再次发起tcp连接的时候不须要再次进行3次握手,直接传输数据,对于服务器放在国外的网站仍是颇有用的,tcp握手一般须要花费200ms以上的时间,这对于1s左右的加载时间仍是不可忽视的。
在Nginx配置的server段监听端口后添加tcpfastopen=3
如
listen 443 ssl tcpfastopen=3 ;
一样也有tcpfastopen 设置,开启方法你们google一下
推荐开启BBR tcp拥塞算法
对于Ubuntu 16.04, 能够执行
echo 'net.core.default_qdisc=fq' >> /etc/sysctl.conf echo 'net.ipv4.tcp_congestion_control=bbr' >> /etc/sysctl.conf
若是系统默认的文件打开数过小,能够扩大一些
好比Ubuntu默认1024,高并发时可能会出现文件打开数过多的错误。
使用如下命令
ulimit -n 50000
能够添加到启动脚本以实现每次开机自动调整nofile限制。
非异步加载的JavaScript会阻塞DOM load事件,由于js能够修改dom tree 故浏览器在js执行时不会进行渲染。
可是其实不少js都是不操做dom树的,好比用户统计所用的js和页面交互的js。咱们可使用 async 和defer 使得这些js的加载不阻塞浏览器渲染
css压缩是用gulp-minify 实现的,在主题发布时已经完成。
PJAX = pushState + AJAX
事实上就是ajax异步传输页面内容后用pushState更新浏览器历史记录,统计数据等。
这样使得咱们不须要从新渲染页脚,侧栏等页面共有的部分。
实现方法能够参考New Material主题。
盲目地全页面pjax反却是拔苗助长的。
非首屏图片懒加载,也就是直到图片进入视野中时才加载图面,这样在加载首屏时就能够节省不少时间。
实现方法也能够参考New Material主题。
能够看到,在这样的网络延迟下,DOM树加载完毕仅在html下载完成后一百多毫秒,ttfb也是接近网络延迟,服务器处理时间仅有二十几毫秒。此次的性能优化仍是颇有效果的。
水平有限,若有错误之处欢迎指正。