将Typecho内存化,突破I/O限制

Dec 14, 2019

前言

之前Buffalo的机器被删机退款了,正好hostloc上有大佬帮忙验证azure学生订阅,我开了一台香港的vps并把博客迁移过来了。azure网速飞快,不过I/O被限制在160Mbps,要建站的话可以用[内存虚拟磁盘]^(tmpfs),让文件读写在内存中进行,大幅提升I/O?

介绍

实际上/dev/shm这个目录就是tmpfs,系统默认就会设置,大小为内存的一半。如果需要更改大小的话可以执行 mount -o remount,size=512M tmpfs /dev/shm。Azure的B1s VM内存1G,/dev/shm大小512M,对一般的PHP程序是绰绰有余了。(PS:对typecho来说,即便算上主题插件那些,大概也就10M不到) 以下步骤在root下执行

将php和mysql的socket放到tmpfs中

这一步一般不用设置,因为系统默认的php和mysql的socket文件都在/run目录下,用df -h命令可以看到这个目录的文件系统就是tmpfs。不放心可以运行sudo find / -name *.sock确认一下。 此外,nginx与php通信应该通过socket。不考虑负载均衡的话,socket相比tcp有更高的性能。 相关配置:

location ~ [^/]\.php(/|$) {
    fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
}

将整个typecho放入tmpfs

网页源码一般放在/var/www里,也可能是/home/wwwroot或者/usr/local/nginx/html,视具体情况而定。下面把它改成/dev/shm 运行cp -r /var/www/typecho /dev/shm复制网站源码 修改nginx配置,把root /var/www/typecho改成root /dev/shm/typecho

把临时文件都放到tmpfs里

mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp
mount --bind /dev/shm/tmp /tmp

这里用mount --bind命令把/tmp和/dev/shm/tmp绑定起来

最关键的一步

由于tmpfs是将数据存储在易失性内存中,所以势必要做一些措施以初始化与防止数据丢失。 先修改/etc/rc.local,让开机的时候自动执行上述操作,不然重启之后/dev/shm目录为空,网站就404了。

echo '''mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp
mount --bind /dev/shm/tmp /tmp
cp -r /var/www/typecho /dev/shm/''' >> /etc/rc.local

创建定时任务每小时增量备份一次网站数据 执行crontab -e,写入一条

0 * * * * cp -u -r /dev/shm/typecho /var/www

优化效果

先来一张在/dev/shm下进行测速的图,感受一下tmpfs的极致速度 superbench.png 博客迁移到Hugo了,探针看API的吧:X Prober探针跑分 xprober.jpg

Typecho

计算极限

Debian/Ubuntu 编译安装 mosh