今天很无意的研究了一篇 92 年的 paper ,并且在它的 reference 里找到了另一篇感兴趣的文章,一篇 87 年的老古董。
“ The 5 minute rule for trading memory for disc accesses and the 10 byte rule for trading memory for CPU time ”, SIGMOD 87 ,就是这篇了。
作者绝对的大牛, Jim Gary ,就是前几年失踪的那位,拿过图灵奖的。
文章提出了两个法则: The Five Minute Rule 和 The Ten Byte Rule 。后面这个法则我没太仔细看,不过第一个法则很有意思。
Five Minute Rule: data referenced every five minutes should be memory resident. 意思就是说,如果一个数据每五分钟就会被访问一篇,那么它就应该被放在 memory 里面。
文章也给出了一个简单的论证。 87 年的一个硬盘,每秒能够 random 的访问数据 15 次,它的售价是 15K$ (好贵啊 … )。所以,如果有一个操作,每秒钟都要执行一次 disk 的访问,那么这个操作的 cost 应该是 1K$ 。注意, 1K$ 的价格指的是一个每秒都要执行一次的操作,而不是每秒每操作,我看原文的时候在这困扰了很久。同时, cpu 和其它方面的 cost 也要 1K$ 。所以,每秒钟都要执行一次 disk 的访问,这个操作整个 cost 是 2K$ 。
接着说说内存,那个年代,一个 1MB 的内存大概是 5K$ ,那么平均一个 KB 的价格是 5$ 。
现在,如果有一条 1KB 的记录,如果它每秒钟都会被访问,那么把它放在 disk 上就会花费 2K$ ,而如果把它放在 memory 上,只需要 5$ ,所以,这样的一条记录当然应该被放在内存中。按照这个思路,我们可以计算一下临界点。如果一个数据每 400 秒才会被访问一次,那么它在 disk 上的 cost 是 2K/400 = 5$ ,正好等于把它放在内存上的开销。因此,如果一个数据访问间隔小于 400 秒,那么它就应该放在 memory 上,反之,应该放在 disk 上。
而 400 秒大概就是 5 分钟了(其实已经 6 分钟多了)。
这个论证还是非常简单直观的。不过这里有一个“反常理”的地方。一般衡量 disk 的性价比,会用 capability 这个参数,比如每 GB 多少多少钱。但在这里,衡量 disk 用的是 IO 。其实仔细琢磨一下,会发现这样做是理所当然的。因为 paper 的目的是想发现什么时候数据应该放在 memory 或者是 disk ,而其中的关键就是达到最优化的 io 。
这篇 paper 大概就说到这了。更有意思的是,在 10 年后的 97 年和 20 年后的 07 年, Jim Gary 和后继者又写了两篇 paper 作为 update (写 paper 能写成连续剧,佩服佩服)。最新的 07 年这篇讨论的是 flash 出现以后对于系统设计的一些影响,有兴趣的可以深入的研究一下。
Reference:
http://delivery.acm.org/10.1145/40000/38755/p395-gray.pdf 87 年的
http://research.microsoft.com/en-us/um/people/gray/5_min_rule_SIGMOD.pdf 97 年的
http://staff.ustc.edu.cn/~jpq/paper/flash/2007-DaMon-The%20Five-Minute%20Rule%20Twenty%20Years%20Later,%20and%20How%20Flash%20Memory%20Changes%20the%20Rules.pdf 07 年的