什么是良好的缓存命中/未命中比率?

4

我正在运行ocount来计算L2缓存读事件的数量,以下是我们得到的结果:

Event                               Count                    % time    
counted
l2_rqsts:all_demand_data_rd         14,418,959,276           80.01
l2_rqsts:demand_data_rd_hit         6,297,000,387            80.00
l2_rqsts:demand_data_rd_miss        6,104,577,343            80.00
l2_rqsts:l2_pf_hit                  667,709,870              80.01
l2_rqsts:l2_pf_miss                 1,641,991,158            79.99

然而,我们不知道这些结果是否应该被视为完全的缓存崩溃。

您认为L2缓存的良好命中/未命中比率是多少?

我认为这高度取决于CPU架构和应用程序要求,但是否有一个普遍可接受的值呢?


单独看,缓存命中/未命中并不能告诉你任何事情,除了可能的优化。 - Jason
那么,你如何知道缓存未命中是你的应用程序的瓶颈呢? - rvlander
缓存命中/未命中并不能告诉你有哪些类型的缓存未命中。还有不止一种(强制、容量、冲突等等...)。 - Jason
@rvlander - 为了进行高级瓶颈分析,您可以使用来自gprof到vtune的分析工具。基于性能计数器的TopDown方法也可能很有用(不确定它是否在oprofile中受支持)。 - Leeor
这非常取决于应用程序,例如我强烈建议为WordPress使用持久对象缓存(您可以使用memcached-redux插件)-我通常会获得95%以上的命中率。您显然还希望适当设置缓存大小,在memcached的缓存中查看有多少次驱逐。 - William Turrell
1个回答

4
这取决于应用程序。在极端情况下:
- 如果每个内存访问都是到同一位置,或者跨度并适合于感兴趣的缓存级别(例如对于典型的L2缓存,总大小为256KB),而且没有由于关联冲突而导致的任何驱逐,该应用程序的命中率可以接近100%。 - 如果内存访问发生在比缓存大得多的区域,并且是真正随机的,则您可能会得到远低于50%的命中率(我不确定如何通过分析方法得出确切数字,但我猜想它将取决于命中给定行的概率分布)。 - 您可以故意构造一种病态情况,其中您的应用程序交替访问两个不同的内存位置,这些位置碰巧与处理器处理关联性的方式相遇在同一缓存行上。 在这种情况下,命中率将接近0%。
我怀疑是否有任何分析模型来预测更现实的工作负载可能看到的值,但肯定已经对常见基准进行了一些配置文件运行。例如:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.152.3943&rep=rep1&type=pdf。这些人在SPECcpu2000的mcf工作负载上显示了每千条指令(MPKI)20到50个未命中率。以下是该工作负载的描述:https://www.spec.org/cpu2000/CINT2000/181.mcf/docs/181.mcf.html。它可能或可能不像您要优化的内存子系统。
回到您首先提出问题的原因:如果其他分析数据显示您更多地绑定在缓存或内存访问而不是算术,锁定等方面,则您可以选择一些启发式值,例如如果您低于80%或95%的命中率,则可能值得尝试优化缓存访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接