多语言展示
当前在线:1729今日阅读:97今日分享:45

squid源码分析

对squid源码做一个具体的解析,共同学习。
方法/步骤
1

1、 初始化a) 一般分为memDataInit和cachemgrRegister两个过程    i. Mem过程即将对应的结构进行初始化进入内存池群,并由不同类型唯一对应内存池所在群中唯一编号,如MEM_EVENT,详见enum mem_type;    ii. Reg过程即表示的是所有操作(leakInit、memInit、cbdataInit…)都表示一次action,将由action_table统一管理;

2

1、 磁盘缓存    a) 储存策略:目标在磁盘上的存储在内存中建立了相应的索引,也就是说确定cache-dir-size的时候,需考虑到内存的容忍值    b) 缓存位置选择:least-load(默认)和round-robin算法,均以负载作为衡量标准。前者选择当前工作负载最小的cache目录,后者直接选择负载小于100%的目录。其均与max-size和read-only选项有关     c) 缓存置换:LRU最少近来使用算法(默认)、GDSF贪婪对偶大小次数、LFUDA动态衰老最少经常使用算法、FIFO、LFU、histLRUpick    d) 缓存删除:         i. 个别对象:squid接收客户请求方式,用于删除cache对象(PURGE方式)         ii. 一组对象:一方面,squid线性搜索所有缓存对象,耗费CPU;另外,squid在内存中对URI保持单向哈希的MD5算法,即不能从MD5值得到URI,也就是说不能确定是否某个给定的MD5哈希是由包含特定URI差生而来的         iii. 所有对象:关闭squid(squid –k www.gzlij.com shutdown),重命名旧的cache目录,创建新的cache目录,再启动squid之后删除oldcache目录(最后执行)         iv. 更新模式refresh_pattern:用于人为间接控制磁盘缓存的生命周期    e) 磁盘diskd采用消息队列和内存共享机制实现进程间通信          i. 一个cache_dir对应于一个diskd进程,squid和diskd进程使用共享内存区域进行读写          ii. 排队消息过多,squid进入阻塞I/O模式,让更多的cpu时间处理diskd进程          iii. 排队操作达到一个极限,squid会停止要求diskd进程打开文件          iv. 最佳是配置消息极限大于排队操作极限

3

3、 集群:      a) 基本协议ICP和HTCP协议          i. ICP就类似于一串ICMP探测报文,可通过计算查询/响应往返时间(时间开销),计算出网络拥塞情况          ii. ICP是不可靠传输,只能基于地址的访问控制过滤掉不想要的ICP消息          iii. ICP消息数量(与带宽增长)同邻居cache数量呈正比,cache越多,就会产生越多的带宽消耗,可通过某种隔离机制来进行控制,否则一般推荐5-6个cache          iv. 在Squid实现中,ICP查询仅仅携带了URL信息,没有额外的请求头部,因此如果http请求包含有附加的头部,将不被传送给邻居cache进行查找,这样就会造成假命中          v. ICP查询采用GET请求,不能使用非GET请求方式,即只能使用就是不带参数请求          vi. Squid通过计算URI的MD5 hash值在内存中进行索引缓存,并利用超时机制保持最新缓存数据,因此squid会大量消耗内存      b) 缓存摘要:          i. Cache摘要使用Bloom Filter来保存所有peer cache的摘要,通过查询摘要即可决定某个URI是否在邻居的cache中          ii. Squid中摘要大小是每个cache目标5bits,邻居摘要完全放在内存中,每百万目标需要大约625KB内存          iii. Bloom filter不能完整呈现条目集合,极可能造成假命中《Web Caching》         c) 存储系统(内存和磁盘):               i. 参考文献《网络代理缓存squid存储系统分析》               ii. 替换策略:双链表实现(默认)的缓存置换算法LRU,可配置堆结构进行实现               iii. 置换时机:周期性扫描(以事件进行驱动)和storeGetMemSpace()检查内存空间不足时进行置换操作;前者会对整个目标文件系统目录进行替换,后者只针对storeEntry中的memObject内存块进行替换       d) 请求转发:              i. peerSelectfoo()                 1. 查询never_direct和always_direct列表,确定是否直接发送到origin server或者请求选择第一个peer cache              ii. peerGetSomeNeighbor()                 1. squid维护了一个下一跳列表,对于每一个cache摘要命中的邻居都降至于该列表中                 2. squid采用CARP机制维护一组parent cache,可针对不同URI做出不同请求                3. squid利用parent cache到origin server的RTT延迟来计算优先级,其中netdb度量保存了这些RTT值,用户可自定义parent cache的weight值来提高其优先级               4. squid遍历所有下一跳列表中的邻居,使用ICP/HTCP查询邻居是否有效ps:仅GET请求,即可层叠请求将被发送至peer,不可层叠将不被缓存           iii. peerGetSomeParent()               1. 默认自己定义的first parent               2. 离origin server最近的(netdb维护RTT)               3. Squid使用round-robin选项维护了parent cashe 的请求数量,选择最低的

推荐信息