刚试了squashfs配合overlayfs做root目录,感觉系统在机械硬盘上快不少,

其它类软件,非上述版软件
回复
科学之子
帖子: 2260
注册时间: 2013-05-26 6:58
系统: Debian 9
送出感谢: 842 次
接收感谢: 30 次

刚试了squashfs配合overlayfs做root目录,感觉系统在机械硬盘上快不少,

#1

帖子 科学之子 » 2018-09-07 15:40

刚试了squashfs配合overlayfs做root目录,感觉系统在机械硬盘上快不少
和常见用法不同的是,我这里用在内置硬盘,而不是USB硬盘之类的慢速移动设备上.

squashfs创建命令:

代码: 全选

sudo mksquashfs "./debian_stretch" "./debian_stretch.1m.squashfs" -comp lz4 -Xhc -b 1M -no-exports -noappend
initramfs挂载命令

代码: 全选

loopdev="$(losetup -f)"
echo 1024 > "/sys/block/$(basename ${loopdev})/queue/read_ahead_kb"
losetup --direct-io=on --read-only "${loopdev}" "${rootmnt}/debian_stretch.1m.squashfs"
echo 1024 > "/sys/block/$(basename ${loopdev})/queue/read_ahead_kb"
mount -r -t squashfs "${loopdev}" "${rootmnt}${ROOTDIR}/overlayfsdir/lower"
mount -t overlay -o "lowerdir=${rootmnt}${ROOTDIR}/overlayfsdir/lower,\
upperdir=${rootmnt}${ROOTDIR}/overlayfsdir/upper,\
workdir=${rootmnt}${ROOTDIR}/overlayfsdir/work" "overlay-root" "${rootmnt}"
需要注意initramfs默认自带的losetup不支持 --direct-io 选项,需要手动加上
hook脚本命令:

代码: 全选

rm "${DESTDIR}/sbin/losetup" 
rm "${DESTDIR}/bin/losetup" 
copy_exec "/sbin/losetup" "/sbin/losetup"
另见:https://manpages.debian.org/stretch/ini ... .8.en.html

不过GUI文件文件管理器没法挂载设备了,可能是squasshfs还没实现ACL的关系.
测试环境:
Linux-kernel 4.14.13
Debian Stretch
Fri Sep 7 15:46:40 CST 2018 补充{
需要注意这种用法(squashfs 的 block-size 设置成最大的1M)会显著增加page cache内存消耗,
推荐在initramfs阶段挂载squashfs前就开启zram
viewtopic.php?p=3209439#p3209439
}
科学之子
帖子: 2260
注册时间: 2013-05-26 6:58
系统: Debian 9
送出感谢: 842 次
接收感谢: 30 次

Re: 刚试了squashfs配合overlayfs做root目录,感觉系统在机械硬盘上快不少,

#2

帖子 科学之子 » 2018-09-18 20:43

补充一个简单的benchmark和简单的原理分析(猜测)

代码: 全选

nopti nospectre_v2 nospectre_v1 rw fastboot noresume root=/dev/disk/by-uuid/UUID rootdir=/fast-debian-stretch/test.gzip
19.14 13.34
nopti nospectre_v2 nospectre_v1 rw fastboot noresume root=/dev/disk/by-uuid/UUID rootdir=/fast-debian-stretch/test.gzip
18.81 12.64
nopti nospectre_v2 nospectre_v1 rw fastboot noresume root=/dev/disk/by-uuid/UUID rootdir=/fast-debian-stretch/test.gzip
19.06 12.79
nopti nospectre_v2 nospectre_v1 rw fastboot noresume root=/dev/disk/by-uuid/UUID rootdir=/fast-debian-stretch/test.lz4
17.85 13.77
nopti nospectre_v2 nospectre_v1 rw fastboot noresume root=/dev/disk/by-uuid/UUID rootdir=/fast-debian-stretch/test.lz4
17.50 12.79
nopti nospectre_v2 nospectre_v1 rw fastboot noresume root=/dev/disk/by-uuid/UUID rootdir=/fast-debian-stretch/test.lz4
17.83 13.24

lz4 is win!
创建命令:

代码: 全选

sudo mksquashfs /overlayfs ./test.lz4 -b 1M -comp lz4 -Xhc -no-exports -noappend
sudo mksquashfs /overlayfs ./test.gzip -b 1M -comp gzip -no-exports -noappend
sync
lz4在我的机器上表现最佳(只测试过lz4和gzip),xz 什么估计就更慢了)不知道在CPU更快和内存更大的机器上是否会出现相反效果(毕竟压缩率更高,如果解压很快的话就相当于预读很快很多).
"-b 1M"参数使用1M大小的数据块,因为机械硬盘特性就是顺序读取超快,一次性顺序读取128K(默认大小)和1M几乎没有什么差别,就算读取到的数据暂时用不到,也可能之后不久会用到,就算真的用不到,也会被内核的缓存算法淘汰,在我以前的测试中1M相比128K有微弱优势(从引导菜单开始计算,普通ext4需要约30秒进入桌面,LZ4HC 128K需要约20秒进入桌面,1M需要约18秒进入桌面,具体测试结果没保存,这段是凭记忆写的,仅供参考)
"-Xhc" 启用lz4hc,应该对解压速度没影响,而且能获得高的数据密度,更有利于放大加速效果
"-no-exports"个人不需要NFS,所以去掉NFS的相关支持,尽可能提高数据密度
"-noappend"不确定追加是否会影响加速效果和系统镜像完整性,所以不要追加.
上次由 科学之子 在 2018-10-23 0:44,总共编辑 1 次。
科学之子
帖子: 2260
注册时间: 2013-05-26 6:58
系统: Debian 9
送出感谢: 842 次
接收感谢: 30 次

Re: 刚试了squashfs配合overlayfs做root目录,感觉系统在机械硬盘上快不少,

#4

帖子 科学之子 » 2018-09-27 20:12

又试了试结合e4rat获取系统启动(boot)所需文件的列表,为系统启动所需文件单独建立一个squashfs.
在我的环境下直接把root目录压缩成单个squashfs时,开机用时约17秒
而为启动所需文件单独建立一个squashfs同时配合一个已剔除启动所需文件的squashfs,开机用时约15秒.
结合e4rat提升稍微有点,但跟有无squashfs相比,提升很微弱.

分享一些命令和脚本:
利用e4rat获取系统启动所需文件

代码: 全选

awk '{print $3}' ./boot/initrd-common/startup.log | grep -e '^/usr/' -e '^/lib' -e '^/bin/' -e '^/sbin/' -e '^/etc/' -e '^/my_system_program/' |sudo tee hot-list
通过启动所需文件的列表创建一个只包含启动需文件的root目录

代码: 全选

sudo tar -cf - -T ../hot-list |sudo tar -xf - --touch
根据列表顺序touch每个启动所需文件(不确定这么做是否有用):

代码: 全选

#!/bin/sh
for x in $(cat ./hot-list); do
touch -c -a "./hot-root${x}"
done
删除原始squashfs中的启动所需文件.

代码: 全选

#!/bin/sh
for x in $(cat ./hot-list); do
rm "./cold-root${x}"
done
回复

回到 “其它类软件”