面向网络流量的缓存替换算法比较与分析
这篇文章是用MarkDown文本编辑器写的,第一次尝试这种写法,刚开始写还很变扭。之所以用它,因为这段时间看论文,写博客的时候需要输入数学公式,原先使用的文本编辑器不能很好的表示出来,每次都是我先用word输入好,转换为ptf再截图贴上来的,很繁琐。当然这个我用着还是有些不顺手,写博客过程中遇到些问题到现在还没解决,比如我创个表格,如何使之居中的问题。好了,接下来是正文。
令缓存查询时间为,缓存缺失时间包括转发表查询时间和缓存更新时间,分别为和为,其他处理时间为,缓存命中率为,则报文平均处理时间为:。
为了提高为提高报文转发性能,除了减少缓存查询时间和缓存更新时间,更多的研究集中于提高缓存命中率,一方面以规则缓存代替报文首部缓存,以提高缓存空间利用率,另一方面采用适合网络流量特征的缓存替换方法。
常用的缓存替换方法有两种,类LRU算法和类LFU算法。类LRU算法的核心假设是"如果流被访问的次数越多,那么将来被访问的几率也更高",即流的访问具有较高的频度(frequency)。
本文主要比较了六种不同的算法,分别如下:
- LRU算法:淘汰上一次访问时间最早的流,替换为。LRU算法的问题在于,流量较小的流会挤占流量大的流的缓存空间。
- SLRU算法:将缓存划分为2个LRU队列,第一个LRU队列作为观察窗口,窗口内出现2次以上的流进入第二个LRU队列。第二个LRU队列中被替换的流作为新的流插入第一个LRU队列。与LRU算法相比,SLRU算法减少了只包含1个报文的流对其他流的缓存空间的挤占。SLRU算法的问题在于,观察窗口大小固定, 而流量特征会随时间变化。
- LIRS算法:LIRS算法定义了IRR(Inter-ReferenceRecency)的概念:同一条流连续2次访问期间,访问过的不重复的流的数量。该算法将流按照IRR大小分为低IRR和高IRR,按照固定比例共用缓存空间。使用FIFO队列缓存高IRR流,使用栈作为观察窗口记录流的IIR相对大小,低IRR的流一定存储于缓存中。新访问的流替换掉FIFO队尾的高IRR流。当FIFO队列中的高IRR流第二次访问时,替换掉IRR最高的低IRR流,后者插入FIFO队首。SLRU算法中的观察窗口(第一个LRU队列)长度固定,当流密集访问时,无法将流缓存至第二个LRU队列。LIRS算法的观察窗口(栈)可以随流量访问规律的变化而动态增减,不会错过低IRR的流。
- 完美LFU算法:记录所有流的访问次数,从{}中替换访问次数最少的流。其问题在于,记录所有流的访问信息需要较大的存储空间,同时也很耗时。
- In-Cache算法:只记录缓存内的流的访问次数,用fN+1替换{}中访问次数最少的流。LFU算法的问题在于,随着流量特征变化,旧的大象 流不再出现,却会一直占用缓存空间。
- 随机替换算法:从{}中随机选择一条流,用替换。
- 理想的缓存替换算法:从{}中替换下次出现最远的流,设为。在下次到达前,其他流都会先被访问。下次出现最远的流,也是IRR最大的流。
算法 | 时间复杂度 | 空间复杂度 |
---|---|---|
LRU | O(1) | O(N) |
SLRU | O(1) | O(N) |
LIRS | O(1) | O(cN) |
In-Cache LFU | O(1) | O(N) |
完美LFU | O(1) | O(N) |
随机替换 | O(1) | O(N) |
文章通过仿真环境和实际系统对各个算法进行了分析,结果表明,当缓存空间有限时,应优先考虑缓存命中率较高的类LRU算法。在多核环境下,若缓存空间充足,应优先考虑多核扩展性良好的随机替换算法。鉴于缓存替换算法对报文处理应用性能提升起到的关键作用,今后将在比较已有算法性能的基础上,研究性能更优的面向网络流量的缓存替换算法。由于我看这篇文章的目的是了解缓存的基本算法,所以看了前半部分和结论我的目的已经达到,所以理论分析是实验过程我没有细看,大家感兴趣可以看看。
参考:[1]曹作伟,陈晓,倪宏.面向网络流量的缓存替换算法比较与分析[J].计算机与现代化,2019(08):50-56.