`
bollaxu
  • 浏览: 220378 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Squid mainInitialize()函数分析

阅读更多

 

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);
}
 

 

分享到:
评论

相关推荐

    squid代码分析!

    Squid函数流程图(Squid函数流程.vsd)可能详细描绘了这一过程。 4. **对象管理**:Squid中的每个HTTP对象都有一个完整的生命周期,包括创建、存储、更新和删除。对象管理涉及内存分配、磁盘存储和内存映射等技术。...

    squid资源讲解以及分析

    ### Squid资源讲解及分析 #### 一、概述 Squid是一款广泛使用的开源代理服务器软件,主要用于缓存网络内容并提高访问速度。通过代理功能,Squid能够减轻网络带宽的压力,同时还能增强安全性。本文将详细介绍Squid...

    网络代理缓存Squid存储系统分析.pdf

    ### 网络代理缓存Squid存储系统分析 #### 概述 本文主要针对“网络代理缓存Squid存储系统分析.pdf”这一资料进行了深入解析,着重介绍了Squid存储系统的实现机制,包括Squid的软件结构、工作机制、存储系统的设计...

    SQUID 原理分析,安装配置

    SQUID是一个开源的代理缓存服务器,常用于加速网络访问速度,降低网络带宽消耗,提高网络性能。本文将详细介绍SQUID的基本原理、安装配置步骤及其在Linux环境下的应用。 **SQUID原理** SQUID的核心功能是作为HTTP...

    squid的cache功能的学习

    #### 六、实战案例分析 假设有一个企业网络环境,内部有大量的员工经常访问相同的外部网站和资源。在这种场景下,部署 Squid Cache 能够带来显著的好处: - **减少外部带宽消耗**:由于 Squid 会缓存经常访问的...

    linux squid 管理界面

    4. **日志管理**:查看和分析Squid的日志文件,监控网络流量和用户活动。这有助于识别潜在的问题,如高流量源或恶意活动。 5. **性能监控**:实时查看Squid的运行状态,包括缓存命中率、内存使用情况、网络带宽使用...

    Linux搭建Squid透明代理及squid+icap环境

    Squid是一款广泛应用的开源代理缓存服务器,它可以帮助提高网络访问速度,减轻服务器负载。透明代理则是指用户在使用网络时,无感知地通过代理服务器进行访问。而Squid与ICAP(Internet Content Adaptation Protocol...

    squid代理中出现的错误

    本文将针对常见的“Squid 启动错误”进行深入分析,并提供具体的解决方案。 #### 常见错误类型及原因分析 ##### 1. DNS 名称查找测试失败 (FATAL:ipcache_init:DNS namelookup tests failed.) **错误描述**: ...

    Squid中文权威指南 最好的Squid指南

    Squid的日志记录详细且可定制,包括访问日志、错误日志等,有助于分析用户行为、诊断问题和优化配置。如果遇到问题,Squid提供的命令行工具如`squidclient`和`squidstat`可以帮助检查服务器状态和诊断问题。 总的来...

    Linux下Squid安装步骤

    9.Squid 命中率分析Squid的命中率是衡量其性能的重要指标,可以通过以下命令查看: ```bash squid -k parse -sV | grep 'Cache Hitrate' ``` 10.Squid 排错如果遇到问题,查看Squid的日志文件(默认为`/var/log/...

    squid-3.5.28.tar.gz

    5. **日志分析**:Squid产生的日志文件可以用于分析用户访问行为,帮助优化网络资源分配。 五、Squid维护与优化 1. 定期清理缓存:保持存储空间的合理利用,避免因缓存过多导致服务器性能下降。 2. 监控与调试:...

    Squid cache(简称为Squid)代理缓存服务器

    7. **日志记录**:Squid能够详细记录所有通过它的网络活动,这对于监控网络流量、分析用户行为以及进行故障排查非常有用。 8. **可扩展性**:Squid可以通过插件和模块进行扩展,适应各种需求,例如添加对FTP、SSL、...

    Linux+下Squid安装步骤

    1.Net-snmp 获取与安装 2.Net-snmp 的配置 3.Net-snmp 常用命令 Squid 1.检查linux是否存在squid老版本 2.Squid 获取与安装 3.Squid 配置 4.Squid 测试 ...9.Squid命中率分析 10.Squid 排错

    squid3配置参考手册

    了解如何阅读和分析Squid3的日志文件,对于解决性能问题和安全事件至关重要。Squid3提供了丰富的日志级别和格式,可以根据需要调整。 总结,Squid3配置是一个涉及多个方面的任务,涵盖了网络架构、性能优化、安全...

    squid缓存服务器的研究

    ### Squid 缓存服务器研究 #### 一、Squid 概述 Squid 是一款广泛应用于互联网数据缓存的开源软件。其主要功能是接收来自客户端的请求,并根据请求内容,从远程服务器获取数据后缓存至本地。当下次再次请求相同的...

    Squid the definition guide

    6. **日志记录与分析**:Squid 提供详细的访问日志,便于网络管理者进行流量分析和故障排查。 ** Squid 的工作原理** Squid 通常运行在客户端和 Internet 之间,当用户请求一个 Web 页面时,请求首先被发送到 ...

    linux下squid的安装,配置,卸载及SNMP的安装配置

    在Linux环境中,Squid是一个常用的代理服务器和缓存服务器,它可以提高网络访问速度并实现内容过滤。在本文中,我们将详细介绍如何在Linux系统中安装、配置、卸载Squid,以及安装和配置SNMP(简单网络管理协议)。 ...

    squid文件上传大小配置

    ### Squid 文件上传大小配置详解 #### 一、引言 在互联网应用中,代理服务器是一种常见的技术手段,用于提供安全、高效的网络访问服务。Squid 作为一款开源的高性能代理缓存软件,在众多场景中得到了广泛的应用。...

    Squid代理服务器原理

    在企业网络环境中,Squid通常作为网络访问的中介,帮助客户端处理对互联网的请求。 Squid的工作原理主要包括以下几个关键点: 1. **缓存机制**:Squid的核心功能是缓存。当客户端(如浏览器)向Squid发送HTTP请求...

Global site tag (gtag.js) - Google Analytics