分类:
2011-09-01 21:44:38
原文地址:squid源码分析1—Cache_mem老化 作者:cbin_07
Cache_mem老化指的是当存储在内存中的storeEntry占用内存达到cache_mem设置值的时候,将老化内存中的一些storeEntry以用于存储新的storeEntry。这里的storeEntry占用内存指的是通过memAllocate(MEM_MEM_NODE)进行分配并挂接到mem_obj分量的动态内存。Cache_meme老化的在每次进行storeAppend()时进入,而老化的函数具体在storeGetMemSpace()中处理,详细流程如下所示:
1) 函数流程:
// 老化处理
storeGetMemSpace(len);
// 如果跟上次检查的时间相同则直接返回不做老化检查(时间的粒度为妙)
->if (squid_curtime == last_check)
return;
// 老化条件检查:如果目前正在使用的MEM_MEM_NODE类型的pages数加上这次接收数据所需要的pages小于用于store存储的最大页数,则直接返回不做老化
->if (memInUse(MEM_MEM_NODE) + pages_needed < store_pages_max)
return;
// 老化机制初始化,此处略过,详见老化机制
->walker = mem_policy->PurgeInit(mem_policy, 100000);
// 按照老化策略,从头至尾老化
->while ((e = walker->Next(walker)))
{
// 老化storeEntry
storePurgeMem(e);
// 修改storeEntry状态,并从mem中置换出去,修改hot-obj统计数目
->storeSetMemStatus(e, NOT_IN_MEMORY);
// 释放memObj
->destroy_MemObject(e);
// 释放存放数据的mem_node
->stmemFree(&mem->data_hdr);
// 销毁memobj结构中的其它分量以及memobj本身
->.........
->memFree(mem, MEM_MEMOBJECT);
// 如果这个obj没有swap到磁盘上并且,完成swap,则释放这个storeEntry
->if (e->swap_status != SWAPOUT_DONE)
storeRelease(e);
// 再检查是否已有内存页可用,有的话则结束老化
if (memInUse(MEM_MEM_NODE) + pages_needed < store_pages_max)
break;
}
//老化结束
walker->Done(walker);
2) 注意事项:
a) 老化检查的时间间隔是1妙,如果在这1秒内有多个Miss或者过期的请求过来则会导致系统中在用的MEM_MEM_NODE数目会大于store_pages_max。因此,在内存中的OBJ占用内存会在cache_mem为中心波动,经常回答与设置的值。偏离值会随着1妙内新建的storeEntry相关。
b) 在squid运行一段后OBJ占用的内存会达到cache_mem左右,此时如果有很多的Miss和过期过程,则会每妙进行1次老化处理。因此,在热度比较集中的情况下,如果设置大一点的cache_mem会有效的减少老化处理的次数。如果热度比较分散,则cache_mem值的大小不能有效的减少老化处理的次数。
c) 目前老化机制会老化到memInUse(MEM_MEM_NODE) + pages_needed < store_pages_max即不老化storeEntry。因此在测试老化机制初始化的耗时前提下,可以考虑一次老化一定比例的obj。