我正在寻找使用SSD来加速我的系统的方法。在“Linux相当于ReadyBoost?”(以及为我触发的研究 )中,我了解了bcache、dm-缓存和EnhanceIO。这三种方法似乎都能够在SSD上缓存读取的数据。
但是,除非我遗漏了什么,否则这三个文件在第一次读取时似乎都会在缓存中存储一个文件/块/区段/任何东西。大的顺序读取可能是一个例外,但否则似乎每次读取缓存丢失都会导致缓存。我希望缓存能够缓存我经常使用的那些读取。我担心,搜索我所有maildir文件的主体,或者在某个大目录中使用递归grep,可能会将我经常阅读的大量内容排除在外。
是否有任何技术来缓存频繁读取的文件,而不是最近读取的文件?建立某种形式的活动集或类似的东西?我想自适应替换可能是描述我所追求的东西的术语。
缺乏这一点,我想知道是否有必要使用LVM作为底层,并在此基础上构建几个启用bcache的设备。其想法是,例如,邮件读取不会消除/usr和类似的缓存。每个挂载的文件系统都有自己固定大小的缓存,或者根本没有缓存。有没有人有在lvm之上使用bcache的经验?是否有理由反对这种做法?
任何其他建议也是受欢迎的。但是,请注意,我正在寻找一些可以在Linux上用于生产的东西。我觉得ZFS的L2ARC特性还不属于这个类别(目前为止),不过如果您相信相反的话,欢迎您提出这一点。LVM的原因是,我希望能够根据需要调整分配给这些文件系统的空间大小,这是使用静态分区的痛苦之处。因此,提出的解决办法也应提供这种灵活性。
编辑1:一些澄清。
我主要关心的是启动时间。我想看到所有的文件,这是用于每个引导容易访问的SSD。我也不想担心SSD保持同步,比如在软件包升级之后(在我的Gentoo测试中经常发生这种情况)。如果经常使用的数据(我在引导期间不使用)也会出现在缓存中,这是一个额外的好处。我目前的工作项目会是个不错的人选。但我想,我每天使用的文件中,90%将在按下电源按钮后的前5分钟内使用。这一目标的一个结果是,像ZFS L2ARC显然所做的那样,在引导后清除缓存的方法并不是可行的解决方案。
金发女郎的回答将焦点从缓存插入转移到缓存驱逐。但这并没有改变问题的本质。除非缓存跟踪某一项的使用频率或频率,否则可能会过早退出缓存。特别是因为我期望这些文件从引导到关闭一直驻留在RAM缓存中,所以每次引导时只从磁盘读取一次。我为bcache和day找到的缓存清除策略,即LRU和FIFO,都将优先于在同一工作日读取的其他文件排除那些启动时间文件。所以我很担心。
发布于 2015-03-10 10:33:32
据我所知,dm-cache可以满足您的要求。我找不到明确的来源,但在这里,作者解释他应该称之为dm-热点,因为它试图找到“热点”,即高活动区,只缓存那些。
在dmsetup status的输出中,您将找到两个变量,即read_promote_adjustment和write_promote_adjustment。cache-policies文件解释说
在内部,mq策略确定提升阈值。如果缓存中未包含的块的命中计数超过此阈值,则将其提升到缓存。
因此,通过调整read_promote_adjustment和write_promote_adjustment,您可以确定频繁读取/写入数据的确切含义,并且一旦读写次数超过此阈值,块将被“提升”到,即存储在缓存中。
请记住,此元数据(预缓存)通常保存在内存中,并且仅在缓存设备挂起时写入磁盘/SSD。
发布于 2013-12-29 17:10:36
但是,除非我遗漏了什么,否则这三个文件在第一次读取时似乎都会在缓存中存储一个文件/块/区段/任何东西。
另一种选择是,第一次读取时不要缓存任何内容,而是对所需的次数进行计数,然后使用一些任意的数字来决定什么时候“频繁使用”。
没有人会以这种方式实现系统,因为这意味着如果我们说这个数字是10次、20次或100次,那么一旦达到这个数字,很明显,系统无法缓存频繁访问的项目(第一个X次)。没那么有用!
我希望缓存能够缓存我经常使用的那些读取。
为了重新迭代前一点,什么是“经常”?实际上,它不可能是一个固定的数字,因为如果系统运行的时间足够长,许多东西就可能成为“常用的”。它可能是一个被缩放成“高分”的数字,但是在这种情况下,如果你有几个小项目被访问了不成比例的次数,这个比例就会变得非常不平衡。
简而言之:没有缓存机制将使用最小计数。它将缓存所有的东西,直到缓存满为止,然后它将根据一些优先级算法开始逐出一些东西。
由于“频率”是“经常”的一个因素,所以每一次读取都会缓存某些内容,即使这是第一次,而且缓存已满,因为如果我们考虑“该文件在过去X读取中读取的次数”(其中X= 1 ),则最后读取的文件将是“最常读取的文件”。
我担心,搜索我所有maildir文件的主体,或者在某个大目录中使用递归grep,可能会将我经常阅读的大量内容排除在外。
如果缓存一开始就已经满了,可能不会。每个读取将被缓存,但它也将被驱逐比以前缓存的东西,经常被访问。
我想适应性替代可能是一个描述我所追求的东西的术语。
请注意,在维基百科页面的“摘要”中,讨论的是对缓存中的事物进行排序的不同策略(vs.lru),而不是那些从来没有在缓存中的东西。这遵循了我前面描述的逻辑:所有东西都在缓存中,缓存机制的有效性取决于从缓存中删除东西的算法。而不是把他们放进去。
https://unix.stackexchange.com/questions/107026
复制相似问题