`

Cache Miss对Java程序的影响

阅读更多

在前一篇文章Java的大内存分页支持,曾经谈及Java矩阵乘法程序效率低下的两个原因,Cache Miss和TLB Miss。在那篇文章中,我们通过使用大内存分页,消除了TLB Miss对性能的影响,性能因而提高了60%以上(76秒 -> 45 秒)。但Cache Miss对性能的影响依旧存在。

 

CPU的一级数据缓存(L1 Data Cache)通常采用组相联的方式来缓存数据,数据缓存是以Cache Line为单位进行的,即缓存不命中时,相邻的一组数据将被载入Cache Line,而不仅仅是当前数据。Core 2架构处理器L1 Data Cache是8路组相联的缓存,每个Cache Line大小为64字节,总共是32K字节。所以,为减少Cache Miss的出现,每个程序指令读取的数据最好是相邻的。而在传统的矩阵乘法程序中,却恰恰违背了这一点。

 

 

for (int i = 0; i < 2048; i++)
	for (int j = 0; j < 2048; j++)
		for (int k = 0; k < 2048; k++)
			res[i][j] += mul1[i][k] * mul2[k][j];

 

每次乘法运算中,mul1二维数组所取的值都与上一次乘法中所取的值相距8KB(2048*4)之远。显然,几乎每次乘法运算中都将出现一次Cache Miss。通过改进算法,我们可以保证每次取值都相邻,从而大大减少Cache Miss的可能。

 

 

for (int i = 0; i < 2048; i++)
	for (int k = 0; k < 2048; k++)
		for (int j = 0; j < 2048; j++)
			res[i][j] += mul1[i][k] * mul2[k][j];

 

很简单,只需将循环中J和K的位置调换一下,就能够保证所有的数组(res, mul1, mul2)每次取值都与上一次相邻。最终,程序因为Cache Miss的大大减少而效率大增。改进后的程序,运行时间为13秒,性能比使用大内存页的情况还提高了两倍多(45秒 -> 13秒)。实际上,改进后的程序还带来另外一个影响,即由于读取的数据位置相邻,TLB Miss的频率也大为下降。经测试,同样的程序在大内存页(2M)和普通内存页(4K)的情况下,运行性能是一样的,均耗时13秒。

 

Cache Miss和TLB Miss的解决似乎都很简单,但要如何发现这些问题却不容易,许多Java性能监控工具通常也不能给出相关的分析。接下来的文章,将介绍如何发现这些微妙的Java性能问题。

 

 

 

分享到:
评论

相关推荐

    CacheSim-master_java_cache仿真_cache仿真程序_cache_

    Cache的工作流程主要包括:加载(Load)、命中(Hit)、未命中(Miss)和替换(Eviction)。当CPU请求的数据在Cache中存在时,称为命中;若不存在,则称为未命中。未命中时,需要从主内存中加载数据到Cache,并可能...

    buffer cache深度分析.zip

    Buffer Cache是数据库管理系统中至关重要的一个组件,尤其是在Java应用程序中,它对于提升系统性能起着决定性作用。Buffer Cache深度分析涉及到内存管理、缓存命中率优化、并发控制等多个方面,是理解Java数据库连接...

    cache性能分析

    【缓存(Cache)性能分析】是计算机科学中一个至关重要的领域,特别是在优化系统性能时。缓存是一种存储技术,用于在主存和处理器之间提供快速数据访问,以减少访问速度较慢的主存带来的延迟。本文将深入探讨缓存...

    Java实现简单LRU缓存机制的方法

    LRU缓存机制可以应用于各种需要缓存的场景,例如Web应用程序的缓存、数据库的缓存、文件系统的缓存等。LRU缓存机制可以减少缓存的miss率,提高系统的性能。 LRU缓存机制是一种常用的缓存淘汰策略,可以通过哈希表和...

    2011_google笔试题_完整版.doc

    而Cache miss可能导致程序暂停。答案是C。 10. 数据库知识:不是每个表都必须有主键,跨表查询可能很慢,数据库支持多用户并发写操作,但可能有锁机制。多维索引可以用KD树实现,答案是A。 编程算法题: 1. 实现...

    Oracle_AWR_报告分析实例讲解.docx

    这两种缓存中的miss成本通常比 **Buffer Cache** 中的miss成本更高,因此应适当调整 **Shared Pool** 的大小以确保常用数据能够被有效缓存。 - **Load Profile**: 展示数据库的负载概况,通常需要与基线数据进行...

    memcache.zip

    3. **缓存未命中(Cache Miss)**: 请求的数据不在缓存中,需要从源头获取并返回,同时可能将数据存入缓存。 4. **过期时间(Expiration Time)**: 数据在缓存中的存活时间,可设置为永久或特定时长。 ### Memcache...

    Oracle_AWR_报告分析实例讲解

    这两种cache的miss成本通常比buffer cache更高,因此共享池的配置需要确保最近使用过的数据能够被缓存起来。 4. **负载概况**: - **Redo Size**: 每秒或每事务产生的redo大小 - **Logical Reads**: 每秒或每事务...

Global site tag (gtag.js) - Google Analytics