【发布时间】:2014-05-10 11:14:37
【问题描述】:
我阅读了一篇论文,其中使用了 cold cache 和 warm cache 这两个术语。我用谷歌搜索了这个术语,但没有找到有用的东西(只有一个线程here)。
这些术语是什么意思?
【问题讨论】:
标签: caching linux-kernel filesystems ext2
我阅读了一篇论文,其中使用了 cold cache 和 warm cache 这两个术语。我用谷歌搜索了这个术语,但没有找到有用的东西(只有一个线程here)。
这些术语是什么意思?
【问题讨论】:
标签: caching linux-kernel filesystems ext2
TL;DR 可以类比汽车的冷发动机和暖发动机。冷缓存 - 没有任何值,也无法为您提供任何加速,因为它是空的。暖缓存有一些价值,可以为您提供加速。
缓存是一种结构,它保存一些值(索引节点、内存页、磁盘块等)以加快查找速度。
缓存通过将某种短引用存储在快速搜索数据结构(哈希表、B+ 树)或更快的访问介质(RAM 内存与 HDD、SSD 与 HDD)中来工作。
为了能够进行这种快速搜索,您需要缓存来保存值。让我们看一个例子。
假设您有一个带有一些文件系统的 Linux 系统。要访问文件系统中的文件,您需要知道文件在磁盘上的起始位置。此信息存储在 inode 中。为简单起见,我们说 inode 表存储在磁盘上的某个位置(所谓的“超级块”部分)。
现在想象一下,您需要读取文件 /etc/fstab。为此,您需要从磁盘读取 inode 表(10 毫秒),然后解析它并获取文件的起始块,然后读取文件本身(10 毫秒)。总计 ~20ms
这操作太多了。因此,您要在 RAM 中以哈希表的形式添加缓存。 RAM 访问时间为 10ns - 快了 1000(!) 倍。该哈希表中的每一行包含 2 个值。
(inode number or filename) : (starting disk block)
但问题是一开始你的缓存是空的——这样的缓存被称为冷缓存。要利用缓存的好处,您需要用一些值填充它。它是如何发生的?当您在查找某个文件时,您会在 inode 缓存中查找。如果您在缓存中没有找到 inode(cache miss),那么您说“好的”并通过 inode 表读取、解析和读取文件本身进行完整的读取循环。但是在解析部分之后,您将保存 inode 编号并在缓存中解析起始磁盘块。这一直在继续——你尝试读取另一个文件,你在缓存中查找,你得到缓存未命中(你的缓存是冷的),你从磁盘读取,你在缓存中添加一行。
所以冷缓存不会给您任何加速,因为您仍在从磁盘读取。在某些情况下,冷缓存会使您的系统变慢,因为您正在做额外的工作(在表中查找的额外步骤)来预热缓存。
一段时间后,您的缓存中会有一些值,并且在您尝试读取文件时,您会在缓存和 BAM 中查找!您找到了 inode(缓存命中)!现在你有了启动磁盘块,所以你跳过读取超级块并开始读取文件本身!您刚刚节省了 10 毫秒!
该缓存被称为 warm cache - 使用一些值进行缓存,可以为您提供缓存命中。
【讨论】:
背景:
Cache 是一个小而快的memory,这有助于避免CPU 访问main memory(更大更慢)以节省时间(cache 读取速度比~100 x 读取速度快main memory )。但这仅在您的程序需要的数据是cached(从main memory 读取到cache)并且有效的情况下才有帮助。此外,cache 会随着时间的推移填充数据。所以,cache 可以是:
1.空,或
2. 可以包含不相关数据,或
3. 可以包含相关数据。
现在,回答您的问题:
冷缓存:当cache 为空或有无关数据时,CPU 需要从main memory 进行较慢的读取以满足您的程序数据要求。
热缓存:当cache 包含相关数据,并且您的程序的所有读取都来自cache 本身。
所以,热缓存是可取的,冷缓存不是。
【讨论】:
非常好的回复@avd。
Cold Cache 只是一个空白缓存或具有陈旧数据的缓存。
Hot Cache 另一方面,维护系统所需的有用数据。它可以帮助您实现更快的处理;它主要用于近乎实时的请求处理。有些系统/流程在开始满足用户请求之前需要手边的某些信息;例如交易平台,它需要市场数据/风险信息/安全信息等才能处理用户请求。如果对于每个请求,进程都必须查询数据库/服务以获取此关键信息,这将非常耗时。所以缓存它是个好主意;这通过 Hot Cache 是可行的。 此缓存应定期维护(更新/删除等);否则,在此期间,您的缓存可能会因不必要的数据而增大,您可能会注意到性能下降。
要创建热缓存,一种方法是缓存的惰性填充,我的意思是,当您收到请求时,您会填充缓存;在这种情况下,初始请求会很慢,但后续请求会更快。另一种方法是在进程启动时(或在用户请求开始之前)加载数据并保持缓存直到进程存在。
【讨论】:
Web前端开发中也有类似的概念,现在几乎所有好的js前端框架都做WarmCaching。
冷缓存:前端应用首次调用后端服务器。
暖缓存:前端第一次获取数据后,将其保存在本地缓存中。所以下次它尝试调用后端时,它会从本地缓存中获取项目。
【讨论】:
在多程序环境中,如果任务保留了之前执行的大部分工作集,则缓存称为暖缓存
没有先前执行历史的缓存称为冷缓存
【讨论】: