我读了一篇论文,它使用了术语冷缓存和热缓存。我用谷歌搜索了这个术语,但没有找到有用的东西(这里只有一个线程)。
这些术语是什么意思?
我读了一篇论文,它使用了术语冷缓存和热缓存。我用谷歌搜索了这个术语,但没有找到有用的东西(这里只有一个线程)。
这些术语是什么意思?
TL; DR与汽车的冷发动机和热发动机有一个类比。冷缓存 - 没有任何值,也无法为您提供任何加速,因为它是空的。暖缓存有一些价值,可以为您提供加速。
缓存是一种结构,它保存一些值(inode、内存页、磁盘块等)以加快查找速度。
缓存通过将某种短引用存储在快速搜索数据结构(哈希表、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(缓存未命中),则表示“好的”,并通过 inode 表读取、解析和读取文件本身进行完整的读取循环。但是在解析部分之后,您将保存 inode 编号并在缓存中解析起始磁盘块。这一直在继续——你尝试读取另一个文件,你查看缓存,你得到缓存未命中(你的缓存是冷的),你从磁盘读取,你在缓存中添加一行。
所以冷缓存不会给你任何加速,因为你仍在从磁盘读取。在某些情况下,冷缓存会使您的系统变慢,因为您正在做额外的工作(在表中查找的额外步骤)来预热缓存。
一段时间后,您的缓存中会有一些值,并且有一段时间您尝试读取文件时,您会在缓存和 BAM 中查找!你找到了inode(缓存命中)!现在你有了启动磁盘块,所以你跳过读取超级块并开始读取文件本身!您刚刚节省了 10 毫秒!
该缓存称为热缓存- 具有一些缓存命中值的缓存。
背景:
Cache
是一个小而快memory
,这有助于避免CPU
访问main memory
(更大和更慢)以节省时间(cache
读取~100 x
比读取更快main memory
)。但这仅在您的程序需要的数据已经cached
(从main memory
into读取cache
)并且有效的情况下才有帮助。此外,cache
随着时间的推移填充数据。因此,cache
可以是:
1. 为空,或者
2. 可以包含不相关的数据,或者
3. 可以包含相关的数据。
现在,对于你的问题:
冷缓存:当cache
为空或有无关数据时,需要根据您的程序数据要求CPU
进行较慢的读取。main memory
热缓存:当cache
包含相关数据,并且程序的所有读取都来自cache
自身。
所以,热缓存是可取的,冷缓存不是。
非常好的回复@avd。
冷缓存只是一个空白缓存或带有陈旧数据的缓存。
另一方面,热缓存维护系统所需的有用数据。它可以帮助您实现更快的处理;它主要用于近乎实时的请求处理。有些系统/流程在开始满足用户请求之前需要手边的某些信息;例如交易平台,它需要市场数据/风险信息/安全信息等才能处理用户请求。如果对于每个请求,进程都必须查询数据库/服务以获取此关键信息,这将非常耗时。所以缓存它是个好主意;这通过 Hot Cache 是可行的。此缓存应定期维护(更新/删除等);否则,在此期间,您的缓存可能会因不必要的数据而增大,您可能会注意到性能下降。
要创建热缓存,一种方法是缓存的惰性填充,我的意思是,当你收到请求时,你填充缓存;在这种情况下,初始请求会很慢,但后续请求会更快。另一种方法是在进程启动时(或在用户请求开始进入之前)加载数据并维护缓存直到进程存在。
在多程序环境中,如果任务保留了之前执行的大部分工作集,则缓存称为暖缓存
没有先前执行历史的缓存称为冷缓存
Web前端开发中也有类似的概念,现在几乎所有好的js前端框架都做WarmCaching。
冷缓存:前端应用程序第一次调用后端服务器。
热缓存:前端第一次获取数据后,将其保存在本地缓存中。因此,下次它尝试调用后端时,它会从本地缓存中获取项目。
参考:在前端缓存数据