我有一个文件夹,里面有几十万个小文件,总共约 14 GB 的数据。这是我的 ecryptfs 加密主目录中的一个文件夹。
执行“du -sh 文件夹”需要 9 分钟以上。执行 cp -ral 到非加密位置需要 1 小时 15 分钟。这段时间内的 CPU 负载主要受 IO 限制(80% wa 在顶部)
执行“du -sh cryptofolder”仅需 15 秒,而 cp -ral 到同一位置仅需 80 秒。'encryptedfolder' 是 /home/.ecryptfs/myname/.Private 中包含加密文件的文件夹。
我很困惑为什么会出现这种性能下降。此文件夹每晚通过 rsync 备份,现在需要两个多小时。在切换到 ecryptfs 之前,我使用 truecrypt,备份在 12 分钟内完成。
为什么 ecryptfs 在这种情况下如此缓慢?du -sh 和 cp -ral 操作不涉及文件内容的任何解密,只是查找正确的文件名。有什么方法可以加快速度吗?
PS:此程序运行于 Ubuntu 11.04
答案1
这里有几个因素。
获取目录中所有文件名的列表需要解码、解析和解密较低的文件名。
du 中的 stat() 调用会引起查找,这需要分配 eCryptfs inode、读取部分下层文件元数据、检查以确保它是 eCryptfs 文件,然后解析未加密文件的大小以设置 eCryptfs inode 的 i_size 字段。请记住,从下层文件系统读取元数据涉及将页面读入下层文件系统的页面缓存。
由于 eCryptfs 的设计,它在处理大量文件时会产生一些令人遗憾的开销。尽管设计如此,我确信仍需要进行一些改进/增强,但优化这部分代码以前并不是我的重点。
答案2
答案很简单,不是。性能下降不是因为 encryptfs 速度慢,而是因为需要分配大量 inode 并执行磁盘维护,以便将与文件相关的所有元数据逐一放到磁盘上。
如果文件夹每晚备份一次,您可能会发现首先“tar”整个目录、压缩生成的文件然后加密(不要加密然后压缩,因为压缩对加密文件不起作用)会更有用。这样,您将获得一个明显更小的备份,并且创建和移动速度会更快。