squid源码分析1—Cache_mem老化

来源:互联网 发布:m.2固态推荐 知乎 编辑:程序博客网 时间:2024/04/30 10:58

http://blog.chinaunix.net/uid-10249062-id-163266.html


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。


原创粉丝点击