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。
- squid源码分析1—Cache_mem老化
- 设置Squid Cache_mem大小
- squid源码分析1 ----EventLoop
- squid源码分析4—coss存储机制分析
- squid源码分析2—refresh_pattern机制分析
- squid源码分析3—purge流程分析
- squid源码分析4—coss存储机制分析
- squid的main函数源码分析
- Squid的main函数源码分析
- Squid性能杀手——fwdFail分析
- squid源码方面的资料太少,想写一系列squid源码分析方面的文章,支持的进!
- squid 源码学习2
- squid源码安装
- Squid 日志分析代码
- Squid mainInitialize()函数分析
- squid配置选项分析
- Squid--hash代码分析
- Squid服务日志分析
- J2EE中DAO模式解析(一)
- 关于squid请求源服务器的响应中带Vary头
- IE
- linux下更改文件的权限
- .Net环境下的缓存技术介绍
- squid源码分析1—Cache_mem老化
- 推荐线程运行和停止的方式
- nginx 源码学习笔记(八)——基本容器——array数组
- Android学习第13课—常用控件(三)
- 重写c语言中的几个字符串函数
- 重装系统通过数据恢复软件找回来的数据库文件提示不是有效的SQL SERVER文件的修复案例
- ASIHTTPRequest下载遇到过的问题。。
- oracle客户端字符编码设置
- poj 3349 原来用C++STL写的,怎么也过不了,后面还是自己写Node