You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于配置Linux文件系统缓存以自动优化SD卡大量小文件删除操作的技术问询

配置Linux文件系统缓存以自动优化SD卡大量小文件删除操作的技术问询

嘿,这个问题问到点子上了!我之前处理过不少SD卡批量小文件操作的场景,先给你拆解分析一下哈~

首先得给你的手动操作思路点个赞:用dd把整个SD卡拷到本地磁盘,挂载loop设备后再删文件最后写回去,这个方法完美避开了SD卡随机IO性能拉胯的痛点——毕竟大量小文件的删除本质是频繁的元数据修改和小文件随机操作,SD卡的随机读写速度本来就远不如本地磁盘,把操作转移到本地自然快很多。

回到你的核心疑问:Linux的文件系统缓存是块级的,能不能配置它自动帮我们做类似的事?

遗憾的是,默认的Linux页缓存(page cache)做不到自动把整个SD卡的文件系统镜像到本地磁盘处理再同步。因为页缓存是内存级的缓存,它只会把最近访问过的磁盘块暂存在内存里,减少重复IO,但它没办法主动把整个SD卡的内容“镜像”到本地磁盘,也不会自动把操作转移到本地完成后再同步回SD卡。

不过不用失望,有几个更灵活的方法可以达到类似的效果,不用每次手动跑dd

  • rsync同步到本地操作后回传
    这个方法比dd更省空间,只同步有内容的部分:

    1. 先把SD卡内容同步到本地临时目录:
      rsync -a /mnt/sdcard/ /tmp/sdcard_temp/
      
    2. 在本地/tmp/sdcard_temp/里批量删除小文件,速度会快得飞起
    3. 最后把修改后的内容同步回SD卡(--delete参数会同步删除操作):
      rsync -a --delete /tmp/sdcard_temp/ /mnt/sdcard/
      
  • overlayfs把SD卡挂载到本地缓存层操作
    这个方法相当于给SD卡套了个本地磁盘的“修改缓存”,所有操作先在本地完成,最后一次性同步:

    1. 创建所需的本地目录:
      mkdir /tmp/overlay_upper /tmp/overlay_work /tmp/overlay_mount
      
    2. 挂载overlayfs,把SD卡作为只读的底层,本地目录作为修改层:
      mount -t overlay overlay -o lowerdir=/mnt/sdcard,upperdir=/tmp/overlay_upper,workdir=/tmp/overlay_work /tmp/overlay_mount
      
    3. 直接在/tmp/overlay_mount/里删除大量小文件,所有操作都会写到本地的upperdir里,完全不卡SD卡
    4. 操作完成后,把修改同步回SD卡:
      rsync -a --delete /tmp/overlay_mount/ /mnt/sdcard/
      
    5. 最后卸载overlayfs清理临时目录即可:
      umount /tmp/overlay_mount
      rm -rf /tmp/overlay_upper /tmp/overlay_work /tmp/overlay_mount
      
  • 调整缓存参数优化SD卡IO(辅助方案)
    如果不想折腾同步,可以调整系统的脏页缓存参数,让系统积累更多修改后再一次性写到SD卡,减少随机IO次数:

    • 临时生效(重启后失效):
      sysctl vm.dirty_ratio=40
      sysctl vm.dirty_background_ratio=10
      
    • 永久生效的话,把这两行添加到/etc/sysctl.conf文件里,然后执行sysctl -p加载
      不过这个只是优化IO策略,没法解决SD卡随机IO本身的瓶颈,效果不如前面两种方法明显。

总结一下:Linux原生没有办法让文件系统缓存自动实现“SD卡镜像到本地操作再同步”的逻辑,但用rsync或者overlayfs可以轻松达到类似的效果,而且比手动dd更高效灵活~

备注:内容来源于stack exchange,提问作者hotmultimedia

火山引擎 最新活动