squashfs双重缓存问题

squashfs双重缓存问题

假设文件中有一个大的 squashfs 图像。因此它被安装为环回设备。现在据我了解,4.4 及更高版本的内核已经消除了环回设备上的双重缓存。但不幸的是,不是来自squashfs。

当您从挂载的 squashfs 中读取某些内容时,Linux 会读取并缓存映像中的压缩部分。您访问的解压缩数据也会被缓存,因此再次读取数据会非常快,并且不需要再次解压缩。

第二个缓存非常好,因为它提供快速访问。第一个缓存几乎是多余的并且完全无用。它会污染 RAM 使用情况,并会丢弃其他缓存条目(或强制应用程序交换)实际上有用。这基本上就是双重缓存问题。

只要文件已经被缓存、解压缩,就没有必要保留该文件的缓存版本压缩数据

如果内核稍后确实必须删除这些缓存,它将首先删除压缩数据缓存(最近较少使用),然后删除解压缩数据。您只有在阅读之后才会意识到这一点,因为它必须从驱动器中重新读取再次解压。但是在驱动器上缓存压缩数据是没有意义的!

所以,总结一下:

  • 缓存解压缩的数据,以便快速访问
  • 根本不保留“压缩的”squashfs 数据(在文件上)

我尝试使用该选项安装它sync,但它没有执行任何操作。

有一种解决方法更像是一种拼凑。基本上,以下命令会删除squashfs压缩数据上的缓存(好),而不是解压缩数据上的缓存(好):

dd if=root.squashfs iflag=nocache count=0

我不接触挂载点,因为这会丢失解压缩的数据(这会很糟糕)。相反,我触摸循环设备的底层文件,因为这是我不想缓存的文件(因为它毫无意义)。

问题在于,必须一遍又一遍地轮询该命令,因为任何应用程序都可以随时进行读取。因此,“kludge”正在将上述命令设置为每秒左右执行一次。

显然,这是不优雅的,而且是彻头彻尾的黑客行为。但至少它准确地表明了我所追求的。它只是删除该文件本身的文件缓存(而不是解压缩的文件)。想象一下该命令每毫秒运行一次,这正是我想要的,但没有像这样的轮询。还有更好的方法吗?

相关内容