Chinaunix首页 | 论坛 | 博客
  • 博客访问: 214047
  • 博文数量: 39
  • 博客积分: 1949
  • 博客等级: 上尉
  • 技术积分: 347
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-24 16:24
文章分类

全部博文(39)

文章存档

2013年(1)

2012年(12)

2011年(24)

2010年(2)

分类:

2011-09-01 21:44:38

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。

阅读(1828) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~