设为首页 收藏本站
查看: 1119|回复: 0

[经验分享] Squid mainInitialize()函数分析

[复制链接]

尚未签到

发表于 2017-4-17 19:29:30 | 显示全部楼层 |阅读模式
  
static void mainInitialize(void)
{
//...
//do nothing ...
comm_select_postinit();
//configure_once代表是否曾经调用过mainInitialize()函数
//1表示之前调用过
if (!configured_once)
//do nothing ...
disk_init();/* disk_init must go before ipcache_init() */
//域名和IP地址的缓存初始化,用来缓存dns正反解得到的ip
//"ipcache_size"ip缓存的entry数量
//初始化IpcacheStats,一个统计数据的结构(如requests/replies/hits/misses等数据)
//初始化lru_list,是一个双向链表
//初始化static_addrs,_ipcache_addrs结构
//设置ipcache_high和ipcache_low
//创建一个哈希表ip_table,缓存ip
//cachemgrRegister注册获取ipcache统计数据的action
//分配内存池到MemPools的相应位置
ipcache_init()
//fqdn缓存初始化
//"fqdncache_size"域名全称缓存的entry数量
//初始化类似ipcache_init(),初始化FqdncacheStats,创建一个哈希表fqdn_table,并注册获取统计数据的action,分配内存池到MemPools的相应位置
fqdncache_init();
//解析host_file指令指定的文件,一般linux下是"/etc/hosts",并把ip和host放入对应的ip_table和fqdn_table
parseEtcHosts();
//使用外部(由cache_dns_program指定)或者内部的dns
//调用helperOpenServers()启动外部程序,并建立进程间通信通道
//cachemgrRegister注册获取dns统计数据的action
//...
//同上,启动redirect_program指令指定的外部程序,注册获取redirect统计数据的action
redirectInit();
//同上,storeurl_rewrite_program指令
storeurlInit();
//同上,location_rewrite_program指令
locationRewriteInit();
errorMapInit();
//"auth_param"指令
//代理认证初始化
authenticateInit(&Config.authConfig);
//"external_acl_type"指令
//外部acl辅助器
externalAclInit();
//"external_refresh_check"指令
//外部辅助器,来决定是否refresh stale response
refreshCheckInit();
//打开useragent_log指令指定的logfile
useragentOpenLog();
//打开"referer_log"指令指定的logfile
refererOpenLog();
//初始化http header中各个域的相关数据结构
//设置ListHeadersMask,ReplyHeadersMask,RequestHeadersMask的位
//初始化HttpHeaderStats,并注册一个获取HttpHeaderStats信息的action
//must go before any header processing (e.g. the one in errorInitialize)
httpHeaderInitModule();
//This function finds the error messages formats, and stores them in error_text[];
errorInitialize();
//打开"access_log","cache_access_log"指令指定的logfile
accessLogInit();
//...
//第一次调用mainInitialize()
if(!configured_once) {
//调用cachemgrRegister()注册回调函数,如cachemgrShutdown,cachemgrReconfigure
//cachemgrRegister()把action及它的回调函数加入到ActionTable里面
cachemgrInit();
//统计数据初始化
//注册获取各种统计数据的action
statInit();
//store_table哈希列表,cache摘要,swap dir等初始化,
storeInit();
//读取mine文件,把里面的类型存入mime table
mimeInit(Config.mimeTablePathname);
//持久化连接table初始化
//client_pconn_hist,server_pconn_hist初始化
//给pconn_data_pool,pconn_fds_pool分配内存
pconnInit();
//初始化refreshCounts中每个协议(HTTP, ICP, HTCP, on store, Cache Digests)
//初始化DefaultRefresh (_refresh_t结构)
refreshInit();
//调用clientOpenListenSockets()创建并监听socket,socket的地址由"http_port"指定
//把socket的fd注册到事件监听(如epoll),并注册请求处理函数
//调用icpConnectionsOpen()打开ICP socket(incoming和outgoing, 都是udp),并添加到事件监听和处理函数
serverConnectionsOpen();
//ICP
neighbors_init();
//添加一些信号的处理函数
//...
//检查MemPools[]的所有entry是否已经初始化
//...
//添加事件
//...
configured_once = 1;
}
}
 
  


void storeInit(void)
{
//初始化一个大小为16个unsigned char的数组null_key
storeKeyInit();
//计算store bucket的个数store_hash_buckets
storeInitHashValues();
//创建store_table,bucket个数是store_hash_buckets
store_table = hash_create(storeKeyHashCmp, store_hash_buckets, storeKeyHashHash);
//Create removal policy instance
mem_policy = createRemovalPolicy(Config.memPolicy);
//Cache摘要(Cache Digest)
//Cache摘要基于由Pei Cao首先发布的一项技术,叫做摘要缓存。基本思路是用一个Bloom filter来表现cache内容。邻居cache下载其他每个cache的Bloom filter(也即摘要)。然后,通过查询摘要来决定某个URI是否在邻居的cache里。
//相对于ICP,cache摘要以空间交换时间。ICP查询浪费时间(延时),cache摘要浪费空间(内存,磁盘)。在squid中,邻居的摘要完全存放在内存里。在一个典型的摘要里,每百万目标需要大约625KB的内存。
//digest_generation on #开启.本参数指令控制squid是否产生自己的cache摘要
//创建cache摘要store_digest并注册获取cache摘要的action
storeDigestInit();
//打开cache_store_log指定的logfile
storeLogOpen();
stackInit(&LateReleaseStack);
//添加一个event到tasks队列
eventAdd("storeLateRelease", storeLateRelease, NULL, 1.0, 1);
//调用SwapDir结构的init()函数来初始化swap fs的bitmap。如aufs就是storeAufsDirInit()
storeDirInit();
storeRebuildStart();
//注册actions
cachemgrRegister("storedir", "Store Directory Stats", storeDirStats, 0, 1);
cachemgrRegister("store_check_cachable_stats", "storeCheckCachable() Stats", storeCheckCachableStats, 0, 1);
cachemgrRegister("store_io", "Store IO Interface Stats", storeIOStats, 0, 1);
}
   

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-365530-1-1.html 上篇帖子: squid介绍及其简单配置【转】 下篇帖子: squid,lighttpd防盗链设置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表