最近入手了个斐讯N1盒子,打算用来当智能网关,负责转储、同步等自动化操作。但是斐讯N1的USB接口是2.0的,挂进samba直接进行大量小文件写操作的时候,速度和性能简直惨不忍睹,iowait直接干爆了cpu,经常卡到中断。因此迫切需要做一层缓存,来简化io操作,对usb读写进行优化。
Linux本身是带了一些缓存加速工具的,比如BCache等,它们的原理都是SSD与HHD混合存储加速,但是在N1上别说SSD了,连HHD都上不了。而且BCache这类必须先格式化原存储,然后合成出一个新挂载点才能使用,属实不适合N1这种场景。
别急,骚操作是可以有的,咱可以用rclone呀
灵活机动,无需格式化,甚至还能直接上云……不过这里仅介绍对本地文件系统的缓存加速
正文开始
其实,rclone是全平台的,这个方法哪都能用。
需要先将usb或硬盘都挂载好。如果需要使用内存进行缓存,还要将内存盘挂载好
内存盘挂载命令为
mount -t tmpfs -o size=20m tmpfs /mnt/xxx
20m表示内存盘大小,可设为xxm,xxg等。末尾是路径,需要先创建好文件夹(mkdir)且为空
取消挂载:
umount /mnt/xxx
注意,使用内存盘会导致断电时没来得及转储的文件丢失。如果你和我一样是N1的话,使用emmc就足够了
然后,安装rclone。不建议使用yum或apt安装,因为很可能会装到旧版
curl https://rclone.org/install.sh | sudo bash
apt install fusermount # Ubuntu / Debian
yum install fusermount # Centos
然后,将本地存储加入存储节点
rclone config
然后跟随提示操作:
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> demo
Type of storage to configure.
Choose a number from below, or type in your own value
…
XX / Local Disk
\ "local"
…
Storage> xx
** See help for local backend at: https://rclone.org/local/ **
Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n> n
Remote config
--------------------
[demo]
type = local
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:
Name Type
==== ====
demo local
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q
然后一个名为demo的本地文件储存点就好了
使用什么进行缓存受缓存点影响,把缓存点放在挂载的内存盘就是用内存进行缓存。
挂载命令:
rclone mount demo:/mnt/usb/share /xxx --vfs-cache-mode writes --vfs-cache-max-age 20s --vfs-cache-max-size 1G --cache-dir /xxx --daemon
参数 | 说明 |
demo:/mnt/usb/share | 需要进行缓存的HHD/USB目录 demo为之前创建储存点时设置的名称 |
/xxx | 挂载点,需要为空文件夹 注意,挂载后无法使用chmod控制权限,需要使用rclone的参数额外配置 如: --allow-other 、--dir-perms xxx 、--file-perms xxx |
--vfs-cache-mode writes | 对写操作进行缓存,可改为更高的full 或更低的minimal 等以控制对什么进行缓存,详见rclone文档 |
--vfs-cache-max-age 20s | 缓存时间。指写入完毕或读取完毕(缓存什么见上一个参数)且移动完毕后保留多久。xxhxxmxxs |
--vfs-cache-max-size 1G | 最大缓存大小,xxgxxm 以此类推 |
--cache-dir /xxx | 缓存点,默认为~/.cache ,缓存点放哪就是用什么加速 |
--daemon | 挂进后台 |
写入大量大小为3000-5000kb的文件进行测试
使用前(紫色是iowait):平均写入速度100kb/s (仅samba)
使用后:平均写入速度2mb/s
关于开机启动,可以使用crontab完成
crontab -e
写个脚本填进去,别忘了加运行权限
@reboot /xxx/xxx.sh
注意,读写操作必须确保在挂载之后,不然会无法持续稳定地自动运行。
rclone 命令中的两个/xxx是同一个路径吗?
不是,一个是挂载路径,一个是缓存文件路径,缓存放高速存储器达到加速效果
全文前后三个路径用到xxx, 哪两个是相同的? 建议区分一下, 小白容易一头雾水
打算对50G的U盘空间(/mnt/sdb1/ttnode)进行缓存, 64m内存盘路径/mnt/locrad, rclone本地挂载点demo, 路径/mnt/rcde, 下面的命令是否正确请指正:
rclone mount demo:/mnt/sdb1/ttnode /mnt/rcde –vfs-cache-mode writes –vfs-cache-max-age 20s –vfs-cache-max-size 50G –cache-dir /mnt/locrad –daemon
来晚了,,没毛病,老铁,但是这样同时读写文件总大小超过64m就没用了