在 I/O 跟踪文件中查找缓存未命中率、命中率
Finding Cache Miss, Hit ratios in an I/O trace file
我有一个 I/O 跟踪文件,其中包含以下字段 ('asu'、'block_address'、'size'、'opcode'、'time_stamp') .
数据看起来像这样。 (超过 500 万行)
0,20941264,8192,W,0.551706
0,20939840,8192,W,0.554041
0,20939808,8192,W,0.556202
1,3436288,15872,W,1.250720
1,3435888,512,W,1.609859
1,3435889,512,W,1.634761
0,7695360,4096,R,2.346628
1,10274472,4096,R,2.436645
2,30862016,4096,W,2 448003
2,30845544,4096,W,2.449733
1,10356592,4096,W,2.449733
我想在我的项目中添加一个缓存层,并想计算未命中和命中。
我正在使用 @functools.lru_cache(maxsize = None)
查找 block_address 的缓存命中和未命中。
在 tutorial 之后,我尝试计算 miss/hits。 blk_trace
是 block_address 的跟踪数组。
@functools.lru_cache(maxsize = None)
def blk_iter():
blk_len = len(blk_trace)
for i in range(0,blk_len):
print(blk_trace[i])
查看缓存信息 blk_iter.cache_info()
,我得到 CacheInfo(hits=0, misses=1, maxsize=None, currsize=1)
。这是不对的。
我对 python 和缓存概念还很陌生。我不知道我做错了什么。
如何找到块地址的 miss/hits?
缓存用于函数 blk_iter
-- 您只调用了一次 blk_iter
,因此您的缓存大小为 1,并且有 1 个未命中。
考虑以下带有lru_cache
的函数
@lru_cache(maxsize=None)
def myfunc(x):
print('Cache miss: ', x)
return x + 1
当使用 x
的特定值调用时,函数将 运行 并且结果将存储在缓存中。如果使用相同的参数再次调用,该函数将不会 运行 并且将返回缓存的值。
>>> for i in range(3):
... print(myfunc(i))
...
Cache miss: 0
1
Cache miss: 1
2
Cache miss: 2
3
>>> myfunc(0) # this will be a cache hit
1
>>> myfunc(3) # this will be another miss
Cache miss: 3
4
>>> myfunc.cache_info()
CacheInfo(hits=1, misses=4, maxsize=None, currsize=4)
在您的示例中,即使缓存设置正确,您仍然会出现所有未命中且没有命中的情况 for i in range(0,blk_len):
每次迭代都会使用新参数进行调用,因此缓存永远不会命中。
我有一个 I/O 跟踪文件,其中包含以下字段 ('asu'、'block_address'、'size'、'opcode'、'time_stamp') . 数据看起来像这样。 (超过 500 万行)
0,20941264,8192,W,0.551706
0,20939840,8192,W,0.554041
0,20939808,8192,W,0.556202
1,3436288,15872,W,1.250720
1,3435888,512,W,1.609859
1,3435889,512,W,1.634761
0,7695360,4096,R,2.346628
1,10274472,4096,R,2.436645
2,30862016,4096,W,2 448003
2,30845544,4096,W,2.449733
1,10356592,4096,W,2.449733
我想在我的项目中添加一个缓存层,并想计算未命中和命中。
我正在使用 @functools.lru_cache(maxsize = None)
查找 block_address 的缓存命中和未命中。
在 tutorial 之后,我尝试计算 miss/hits。 blk_trace
是 block_address 的跟踪数组。
@functools.lru_cache(maxsize = None)
def blk_iter():
blk_len = len(blk_trace)
for i in range(0,blk_len):
print(blk_trace[i])
查看缓存信息 blk_iter.cache_info()
,我得到 CacheInfo(hits=0, misses=1, maxsize=None, currsize=1)
。这是不对的。
我对 python 和缓存概念还很陌生。我不知道我做错了什么。
如何找到块地址的 miss/hits?
缓存用于函数 blk_iter
-- 您只调用了一次 blk_iter
,因此您的缓存大小为 1,并且有 1 个未命中。
考虑以下带有lru_cache
@lru_cache(maxsize=None)
def myfunc(x):
print('Cache miss: ', x)
return x + 1
当使用 x
的特定值调用时,函数将 运行 并且结果将存储在缓存中。如果使用相同的参数再次调用,该函数将不会 运行 并且将返回缓存的值。
>>> for i in range(3):
... print(myfunc(i))
...
Cache miss: 0
1
Cache miss: 1
2
Cache miss: 2
3
>>> myfunc(0) # this will be a cache hit
1
>>> myfunc(3) # this will be another miss
Cache miss: 3
4
>>> myfunc.cache_info()
CacheInfo(hits=1, misses=4, maxsize=None, currsize=4)
在您的示例中,即使缓存设置正确,您仍然会出现所有未命中且没有命中的情况 for i in range(0,blk_len):
每次迭代都会使用新参数进行调用,因此缓存永远不会命中。