【优化】--Squid优化汇总

来源:互联网 发布:淘宝详情手机端加链接 编辑:程序博客网 时间:2024/06/05 11:35

###############################################################################

优化针对实际业务,并不针对硬件环境或者简单的配置文件!

优化的目标是增强性能、增强安全性、增强鲁棒性、充分利用硬件资源、降低成本。

优化的目的是在提高业务处理能力的基础上充分发挥硬件的性能,两者相辅相成。

优化的意义在于节省运营成本。

优化成功与否的关键是运营成本是否得到降低。

###############################################################################


./configure 脚本有大量的不同选项,它们以-开始。当你敲入./configure --help 时,能看到选项的完整列表。一些选项对所有configure脚本是通用的,还有一些是squid 专有的。下面是你可能用得到的标准选项:

--perfix=PREFIX

如前面描述的一样,这里设置安装目录。安装目录是所有可执行文件,日志,和配置文件的默认目录。在整本书中,$prefix 指你选择的安装目录。

--localstatedir=DIR

该选项允许你改变var 目录的安装位置。默认是$prefix/var,但也许你想改变它,以使squid 的磁盘缓存和日志文件被存储在别的地方。

--sysconfdir=DIR

该选项允许你改变etc 目录的位置。默认的是$prefix/etc。假如你想使用/usr 作为安装位置,你也许该配置--sysconfdir为/etc.

以下是squid 的专有./configure选项:

--enable-dlmalloc[=LIB]

在一些系统上,内建的内存分配机制(malloc)在使用squid 时表现不尽人意。使用--enable-dlmalloc 选项将squid 源代码包中的dlmalloc包编译和链接进来。假如你的系统中已安装dlmalloc,你能使用=LIB 参数指定库的路径。请见http://g.oswego.edu/dl/html/malloc.html更多关于dlmalloc 的信息。

--enable-gnuregex

在访问控制列表和其他配置指令里,squid 使用正则表达式作为匹配机制。GNU 的正则表达式库包含在squid 的源代码包里;它可以在没有内建正则表达式的操作系统中使用。./configure脚本侦察你系统中的正则表达式库,假如必要,它可以激活使用GNU正则表达式。如果因为某些理由,你想强制使用GNU正则表达式,你可以将这个选项加到./configure命令后。

--enable-carp

Cache数组路由协议(CARP)用来转发丢失的cache到父cache的数组或cluster。在10.9章有更多关于CARP的细节。

--enable-async-io[=N_THREADS]

同步I/O 是squid 技术之一,用以提升存储性能。aufs 模块使用大量的线程来执行磁盘I/O 操作。该代码仅仅工作在linux 和solaris 系统中。=N_THREADS 参数改变squid 使用的线程数量。aufs 和同步I/O 在8.4 章中被讨论。

请注意--enable-async-io 是打开其他三个./configure 选项的快捷方式,它等同于:

--with-aufs-threads=N_THREADS

--with-pthreads

--enable-storeio=ufs,aufs

--with-pthreads

该选项导致编译过程链接到你系统中的P 线程库。aufs 存储模块是squid 中唯一需要使用线程的部分。通常来说,如果你使用--enable-saync-io 选项,那么不必再单独指定该选项,因为它被自动激活了。

--enable-storeio=LIST

Squid 支持大量的不同存储模块。通过使用该选项,你告诉squid 编译时使用哪个模块。在squid-2.5 中,支持ufs,aufs,diskd,和null 模块。通过查询src/fs 中的目录,你能得到一个模

块列表。

LIST 是一个以逗号分隔的模块列表,例如:

%./configure --enable-storeio=afus,diskd,ufs

ufs 模块是默认的,看起来问题最少。不幸的是,它性能有限。其他模块可能在某些操作系统中不必编译。关于squid 存储模块的完整描述,请见第8章。

--with-aufs-threads=N_THREADS

指定aufs 存储机制使用的线程数量(见8.4章)。squid 默认根据缓存目录的数量,自动计算需要使用多少线程。

--enable-heap-replacement

该选项不再使用,但被保留用于向后兼容性。你该使用--enable-removal-policies 来代替。

--enable-removal-policies=LIST

排除策略是squid 需要腾出空间给新的cache目标时,用以排除旧目标的机制。squid-2.5支持3个排除策略:最少近期使用(LRU),贪婪对偶大小(GDS),最少经常使用(LFU)。

然而,因为一些理由,./configure 选项使指定的替代策略和需要执行它们的基本数据结构之间的差别模糊化。LRU是默认的,它以双链表数据结构执行。GDS和LFU使用堆栈的数据结构。

为了使用GDS 或LFU 策略,你指定:

%./configure --enable-removal-policies=heap

然后你在squid 的配置文件里选择使用GDS或LFU。假如你想重新使用LRU,那么指定:

%./configure --enable-removal-policies=heap,lru

--enable-icmp

squid 能利用ICMP消息来确定回环时间尺寸,非常象ping程序。你能使用该选项来激活这些功能。

--enable-delay-pools

延时池是squid 用于传输形状或带宽限制的技术。该池由大量的客户端IP 地址组成。当来自这些客户端的请求处于cache 丢失状态,他们的响应可能被人工延迟。关于延时池的更多细节请见附录C。

--enable-useragent-log

该选项激活来自客户请求的HTTP 用户代理头的日志。

--enable-referer-log

该选项激活来自客户请求的HTTP referer 日志。

--disable-wccp

Web cache 协调协议(WCCP)是CISCO 的专有协议,用于阻止或分发HTTP请求到一个或多个caches。WCCP默认被激活,假如你愿意,可以使用该选项来禁止该功能。

--enable-snmp

简单网络管理协议(SNMP)是监视网络设备和服务器的流行方法。该选项导致编译过程去编译所有的SNMP相关的代码,包括一个裁切版本的CMU SNMP库。

--enable-cachemgr-hostname[=hostname]

cachemgr 是一个CGI程序,你能使用它来管理查询squid。默认cachemgr的hostname值是空的,但你能使用该选项来指定一个默认值。例如:

% ./configure--enable-cachemgr-hostname=mycache.myorg.net

--enable-arp-acl

squid 在一些操作系统中支持ARP,或者以太地址访问控制列表。该代码使用非标准的函数接口,来执行ARP访问控制列表,所以它默认被禁止。假如你在linux或solaris上使用squid,你可能用的上这个功能。

--enable-htcp

HTCP 是超文本缓存协议--类似于ICP的内部缓存协议。

--enable-ssl

使用该选项赋予squid 终止SSL/TLS 连接的能力。注意这仅仅工作在web加速器中用以加速请求。

--with-openssl[=DIR]

假如必要,你使用该选项来告诉squid到哪里找到OpenSSL库或头文件。假如它们不在默认位置,在该选项后指定它们的父路径。例如:

%./configure --enable-ssl --with-ssl=/opt/foo/openssl

在这个例子中,你的编译器将在/opt/foo/openssl/include目录中找头文件, 在/opt/foo/openssl/lib中找库文件。

--enable-cache-digests

Cache 消化是ICP 的另一个替代,但有着截然不同的特性。

--enable-err-languages="lang1lang2 ..."

squid支持定制错误消息,错误消息可以用多种语言报告。该选项指定复制到安装目录($prefix/share/errors)的语言。假如你不使用该选项,所有可用语言被安装。想知道何种语言可用,请见源代码包里errors目录下的目录列表。如下显示如何激活多种语言:

%./configure --enable-err-languages="Dutch German French" ...

--enable-default-err-language=lang

该选项设置error_directory 指令的默认值。例如,假如你想使用荷兰语,你能这样指定:

%./configure --enable-default-err-language=Dutch

你也能在squid.conf 里指定error_directory 指令,在附录A 中有描述。假如你忽略该选项,英语是默认错误语言。

--with-coss-membuf-size=N

循环目录存储系统(coss)是squid 的试验性存储机制。该选项设置coss 缓存目录的内存缓冲大小。注意为了使用coss,你必须在--enable-storeio 选项里指定存储类型。

该参数以字节形式赋值,默认是1048576 字节或1M。你能指定2M 缓冲如下:

%./configure --with-coss-membuf-size=2097152

--enable-poll

unix 提供两个相似的函数用以在I/O事件里扫描开放文件描述符:select() 和poll()。./configure 脚本通常能非常好的计算出何时使用poll()来代替select().假如你想强制使用poll(),那么指定该选项。

--desable-poll

类似的,如果不使用poll(),那么指定该选项。

--disable-http-violations

squid 默认可以被配置成违背HTTP协议规范。你能使用该选项来删除违背HTTP协议的代码。

--enable-ipf-transparent

在第9章中,我将描述如何配置squid来拦截缓存。一些操作系统使用IP Filter包来协助拦截缓存。在这些环境下你应该使用该./configure 选项。如果你使用了该选项,但是编译器提示src/client_side.c文件出错,那是因为IP Filter包没有或没有正确的安装在你的系统中。

--enable-pf-transparent

你可能需要指定该选项,使用PF包过滤器在操作系统中拦截HTTP。PF是OpenBSD的标准包过滤器,也可能被发布到其他系统中。假如你使用该选项,但是编译器提示src/client_side.c 文件出错,那是因为PF 没有实际安装到你的系统中。

--enable-linux-netfilter

Netfilter 是linux 2.4 系列内核的包过滤器名字。假如你想在linux2.4或以后的版本中使用HTTP拦截功能,那么激活该选项。

--disable-ident-lookups

ident是一个简单的协议,允许服务器利用客户端的特殊TCP连接来发现用户名。假如你使用该选项,编译器将把执行这些查询的代码排除出去。即使你在编译时保留了这些代码,除非你在squid.conf文件里指定,squid不会执行ident查询。

--disable-internal-dns

squid 源代码包含两个不同的DNS解决方案,叫做“内部的”和“外部的”。内部查询是默认的,但某些人可能要使用外部技术。该选项禁止内部功能,转向使用旧的方式。

内部查询使用squid自己的DNS协议执行工具。也就是说,squid产生未完成的DNS查询并且将它们发送到一个解析器。假如超时,它重新发送请求,你能指定任意数量的解析器。该工具的有利处之一是,squid获得准确无误的DNS响应的TTLs。

外部查询利用C库的gethostbyname()和gethostbyaddr()函数。squid使用一个外部进程池来制造并行查询。使用外部DNS 解析的主要弊端是你需要更多的辅助进程,增加squid的负载。另一个麻烦是C 库函数不在响应里传输TTLs,这样squid使用postive_dns_ttl 指令提供的一个常量值。

--enable-truncate

truncate()系统调用是unlink()的替代品。unlink()完全删除cache 文件,truncate()将文件大小设为零。这样做释放了分配给该文件的磁盘空间,但留下适当的目录接口。该选项存在的理由是,某些人相信(或希望)truncate()比unlink()性能表现更好。然而,压力测试显示两者有很少的或根本没有区别。

--disable-hostname-checks

默认的,squid要求URL主机名在一定程度上遵守古老的RFC 1034 规范:

标签必须遵循下列ARPANET 主机名规则。它们必须以字母开始,以字母或数字结尾,仅仅包含字母,数字和下划线。

这里字母意味着ASCII字符,从A到Z。既然国际域名日益流行,你可能希望使用该选项来移除限制。

--enable-underscores

该选项控制squid针对主机名里下划线的行为。通用的标准是主机名里不包含下划线字符,尽管有些人不赞成这点。squid默认会对URL主机名里带下划线的请求产生一条错误消息。你能使用该选项,让squid信任它们,把它们当作合法的。然而,你的DNS解析器也许强迫使用非下划线请求,并且对带下划线的主机名解析失败。

--enable-auth[=LIST]

该选项控制在squid的二进制文件里支持哪种验证机制。你能选择下列机制的任意组合:

basic,digest,ntlm。假如你忽略该选项,squid仅仅支持basic 验证。假如你使用不带参数的--enable-auth选项,编译进程将增加对所有验证机制的支持。你可以使用以逗号分隔的验证机制列表:

% ./configure--enable-auth=digest,ntlm

--enable-auth-helpers=LIST

这个旧选项现在已舍弃了,但为了保持向后兼容性仍保留着。你可以使用--enable-basic-auth-helperes=LIST来代替。

--enable-basic-auth-helpers=LIST

使用该选项,你能将helpers/basic_auth 目录的一个或多个HTTP Basic验证辅助程序编译进来。请见12.2章找到它们的名字和描述。

--enable-ntlm-auth-helpers=LIST

使用该选项,你能将helpers/ntlm_auth 目录的一个或多个HTTP NTLM验证辅助程序编译进来。请见12.4章找到它们的名字和描述。

--enable-digest-auth-modules=LIST

使用该选项,你能将helpers/digest_auth 目录的一个或多个HTTP Digest验证辅助程序编译进来。请见12.3章找到它们的名字和描述。

--enable-external-acl-helpers=LIST

使用该选项,你能编译一个或多个扩展ACL辅助程序,这些在12.5章中讨论。例如:

%./configure --enable-external-acl-helpers=ip_user,ldap_group

--disable-unlinkd

unlinkd 是另一个squid的外部辅助进程。它的基本工作是对cache文件执行unlink()或truncate()系统调用。通过在外部进程里执行文件删除工作,能给squid带来明显的性能提升。使用该选项来禁止外部unlink进程功能。

--enable-stacktrace

某些系统支持在程序崩溃时,自动产生数据追踪。当你激活该功能后,如果squid崩溃,数据追踪信息被写到cache.log文件。这些信息对开发和程序bug调试有用。

--enable-x-accelerator-vary

该高级功能可能在squid被配置成加速器时使用。它建议squid在响应请求时,从后台原始服务器中寻找X-Accelerator-Vary头。

配置优化

1.     修改描述符参数值

文件描述符用来限制一个程序能同时打开的文件数目,默认是1024。也就是说,如果不修改文件描述符,那么一个程序只能同时打开1024个文件,而Squid会同时打开成千上万个文件,所以远远是不够的,为了保证最高的效率和响应速度,要更改文件描述符的大小.

 

两种情况:

a.用户每次访问squid,squid会按照需要打开文件,然后读取文件内容再返回给用户。

b.squid预先打开访问频率高的文件,用户访问squid,squid直接把内容返回给用户。相对来说,后面的方法可以对用户的请求进行更加快的反应。

首先修改以下两个文件。

/usr/include/bits/typesizes.h

/usr/include/linux/posix_types.h

vi打开上面的文件查找

#define __FD_SETSIZE 1024

1024改为65536,然后保存,这是Linux能接受的最大数值。

刚才编辑的这两个文件是C/C++程序里面的头文件,编译squid的时候会被自动引用。除了这两个文件以外,我们还需要对当前环境进行设置。也就是你用ssh登录到系统时的一些设定。每个登录进程都可以进行单独的设置,当关闭目前登录回话,环境变量的设置就失效了.

ULIMIT

ulimit用来设置当前环境的一些资源限制。这个命令是对环境进行设置,所以退出当前登录进程后命令将会失效。

我们输入下面的命令

[root@server soft]#ulimit -Hs 65536

[root@server soft]#ulimit -n 65536

也可以永久修改这些限制,开机自动生效,配置如下:

vi /etc/security/limits.conf,添加以下内容

*                soft   nofile          65536

*                hard   nofile          65536

H参数是硬性限制,s是堆栈上限,n是文件描述符上限。

 

注释:

ulimit 参数介绍:

-H 设置硬件资源限制.

-S 设置软件资源限制.

-a 显示当前所有的资源限制.

-c size:设置core文件的最大值.单位:blocks

-d size:设置数据段的最大值.单位:kbytes

-f size:设置创建文件的最大值.单位:blocks

-l size:设置在内存中锁定进程的最大值.单位:kbytes

-m size:设置可以使用的常驻内存的最大值.单位:kbytes

-n size:设置内核可以同时打开的文件描述符的最大值.单位:n

-p size:设置管道缓冲区的最大值.单位:kbytes

-s size:设置堆栈的最大值.单位:kbytes

-t size:设置CPU使用时间的最大上限.单位:seconds

-v size:设置虚拟内存的最大值.单位:kbytes

2. squid配置优化

配置/etc/squid/squid.conf

配置acl访问控制列表

对代理客户端进行限制,并给予相关的权限。

例如以下关于一个对于域名的访问控制,拒绝以下域名访问,acl的访问控制里边如下:

acl denysite dstdomain.google.com

acl denysite dstdomain.google.cn

acl denysite dstdomain.google.hk

acl denysite dstdomain.baidu.com

acl denysite dstdomain.5566.org

acl denysite dstdomain.hao123.com

acl denysite dstdomain.265.com

acl denysite dstdomain.2345.com

acl denysite dstdomain.1188.com

 

拒绝除了上面的域名的访问squid:(这样就可以控制一个公司内部的员工的访问一些特殊的网站)

http_access allow !denysite

 

重启服务:

service squid restart

 

配置客户端:

firefox中设置相关的代理上网配置(详见相关内容,这里使用的端口为默认端口3128)

 

squid缓存方面的设置

        step 1:磁盘分区,为squid准备相关的存储。

        配置squid.conf文件,为squid配置缓存:

        cache_dir aufs /usr/squid/cache1 1000016 256

        cache_dir aufs /usr/squid/cache2 1000016 256

        cache_dir aufs /usr/squid/cache3 1000016 256

        cache_dir aufs /usr/squid/cache4 1000016 256

squid的cache_mem的配置

# 与内存有关的设定有关∶内存为2G,这里我给它为600M,性能方面的话还是需要自己在应用的过程当中不断地调整。

cache_mem                       600 MB

# 与设置缓存容量有关(注∶下列的 90 与 95 是百分比 )

# 如果您的cache_dir 容量很大时,可以考虑将 4096 改成 32768 KB

# 这里如果使用代理的客户端下载相对比较频繁的时候需要调整缓存容量的百分比(为了防止下载突然把整个squid塞满)

cache_swap_low                  70

cache_swap_high                 85

maximum_object_size             32768 KB

# 与记忆体保存资料有关的设定

maximum_object_size_in_memory   8 KB

# 我们经由 dns 正反解以及 IP 的结果,记录在暂存区啊!

ipcache_size                    1024

ipcache_low                     90

ipcache_high                    95

fqdncache_size                  1024

 

设置透明代理,使用户不用设置代理服务来进行上网:

http_port 3128 transparent

 

优化指南

了解Squid加速原理

一般说来,网站用 squid 加速,目的有二

1: squid 本身具有缓存功能,可以将webserver输出的内容缓存起来,在缓存没有过期之前来的访问,都直接用缓存里面的内容,这样可以有效减少

webserver 机器上面的请求数量。这是squid 的主要功用。

2: 网络慢的用户会长时间占用webserver 的 TCP 连接,webserver

对每个连接占用的资源比较大,如果长时间不能释放出来服务其他请求,性能会有比较大的影响。前面放一个 squid, webserver就可以迅速处理完逻辑以后,把数据快速发送给squid, 然后去处理别的逻辑,而 squid 每个 TCP连接占用的资源很少,不用担心占用太多资源。这个用途也叫做连接管理,有一些网络设备也可以做这个事情,价格都很贵。

优化策略

A: 使用 Expires header来控制缓存

squid在缓存webserver内容的时候,需要后端webserver输出一些控制信息告诉他页面是不是可以被缓存,以及可以缓存多久。否则squid 是不会自作主张给你缓存内容的。一个页面到底能不能缓存,只有开发网站的人才知道,因此开发人员有责任在动态页面里面输出Expires 和 Cache-Control header。

简单举一个 php 的例子以说明这两个header的值是什么含义,其中$expiretime 的单位是秒。

header("Expires: " . gmt_date_format(time()+$expiretime));

header("Cache-Control: max-age=" ."$expiretime");

对于静态文件,有两种方式来让 squid 自动给静态文件缓存,一种是使用 apache 的 mod_expires,可以针对路径或者针对文件类型/扩展名来自动输出 cache 头。详细的请参考 mod_expires 的说明。另一种是用 squid 的refresh_pattern 来指定。

详细的还是请参考squid的配置文件。

一般来说,如果后端不是配置很麻烦,建议还是在后端做,前端的配置修改大多数都是违背http协议的,如果出现问题,也比较难排查。

 

B 根据 squid访问的模式,进行业务拆分

进行了 Expires Header 的处理以后,squid就真正可以起到加速的作用了,你可能也能感觉到,网站的访问速度明显加快。

但是不要满足于这点成绩,查看 squid 的 snmp 统计图,通常hit ratio 并不会太高,有 50% 就了不起了。这就是我们需要进一步优化的,我们的目标是让大部分 squid 都达到 9X%的命中率。

为什么 squid 命中这么低呢,这大概有两种原因。大多数的网站都是有一些页面不能够被缓存的,例如登录页面。这些页面请求也从squid 走,成为分母的一部分,直接就降低了命中率,我们首先可以做的事情是,把这些不能够缓存的页面请求,拆分到单独一个 squid上面,或者访问量不大的话,干脆把 apache 暴露出来。这样能够缓存的那个 squid 命中率马上上升一截。

有人可能会说,把不能缓存的页面分拆开去,就光为了让能缓存的那个数字好看,这不是掩耳盗铃么?其实这么做是有意义的,首先就是去掉了不能缓存页面的干扰,使得我们进一步优化squid 的依据更加准确。其次是不可缓存请求和可缓存请求之间的重要性通常是有差距的,分拆了以后,它们之间不容易互相抢占资源,不会因为下载图片的连接太多把squid 占满,影响更重要的登录请求。第三就是可缓存内容通常是图片等页面元素,浏览器在 load它们的时候,对每个站点的并发连接会有控制,如果分开成不同的IP,可以多一些请求同时执行。提高少许显示速度。

其实观察 sohu,sina 之类的页面,你会发现它们的页面也是分拆的,可以看到页面里面的图片都是指向images.sohu.com 之类的地址,虽然它们可能和其他页面一样后台都指向同一个 apache。

这样做完,缓存命中率大概能上升到 70%-80% 了,运气好的时候完全可以上 90%。

另一种导致 squid命中低的原因和这个比较类似,同样都是可缓存的内容,有的可能是软件下载站上面的大文件,有的是新闻站点上面的小图片,如果同一个 squid

对这样差别巨大的文件加速的话,会严重干扰 squid 的缓存策略,两者不能兼顾,要不就是大文件占据了 cache ,把小文件都挤出了cache, 要不就是小文件特别多,大文件无法进入 cache, 导致大文件经常 miss。这个比不能缓存的页面还要恶心,因此即使在服务器资源有限的情况下,也要优先拆分这两类型访问。一般来说,文件大小分界线定在 1M左右就可以了,如果是有软件下载这样特别大的文件,可以在 4M - 10M 左右再拆分一次。对于不同访问类型的 squid,其系统优化参数也会有所不同,这个我们后面还会讲到。

只要悉心按照访问模式来拆分业务,大部分起缓存作用的 squid 都可以达到很高的命中率,至少都可以到达 9X%。

 

C 根据不同的需求,调整参数优化缓存

完成 A 和 B 两步优化以后, squid 的命中率经常可以达到 9x%, 可以说我们已经给 squid创造了非常优秀的外部环境,下面我们就要从 squid 本身入手,通过调整它的缓存参数和缓存策略,甚至系统的参数,来让 squid发挥出更好的性能。

在 B 步骤中,我们把 squid 划分成了三种用途,缓存大文件,缓存小文件,不缓存文件,这其中最后一种用途情况下面 squid

不起到缓存效果,只用来做连接管理,因此我们把它放到后面的连接管理里面叙述,这里只讨论和缓存相关的 squid 参数。

squid 有内存缓存和磁盘缓存两级缓存, 通常来说, 只要是专门给 squid 用的机器, 内存缓存都建议开得比较大,大内存缓存总是有好处的嘛, 但是注意不要使得系统开始吃 swap ,像Linux这样一开始吃 swap 性能就下降比较严重的系统尤其要注意.这个程度需要自己试验确定.通常 1G 内存的Linux机器用来跑 squid ,内存缓存可以开到 512M.有些libc比较差的平台, 例如比较老的 freebsd 系统, 其 malloc 函数的质量不高,可能会造成比较多的内存碎片,导致squid 运行一段时间以后分配不出来内存挂掉. 这时候推荐在编译时候使用 dlmalloc package. 即使如此, 仍然要再缩小

squid 的内存缓存,以防不幸发生.

磁盘缓存的情况比较复杂, squid 有 ufs, aufs, coss, diskd, null 五种存储后端, 其中 ufs,aufs,diskd 都是在文件系统上面保存很多小文件, coss 是 squid自己实现了一个简单的文件系统,可以使用一个大文件或者一个磁盘设备来存储. null 则是给不想要磁盘缓存的情况准备的. coss看起来好像比较拽, 但是以前试验并不足够稳定,因此并不推荐使用. 剩下的三种存储方式,具体选择哪种需要根据操作系统的特性来进行.ufs 是最传统的存储方式, 我们知道, squid 是一个单进程的程序, 它使用 ufs 存储后端时, 直接在进程里面读写文件.这是一种很简单的方式, 缺点是当读写磁盘被阻塞的时候, squid 不能够处理请求, 会造成服务质量波动比较大. 因此出现了 aufs 和diskd 两种存储后端, 原理都是 squid 主服务循环不负责读写文件,而是通过消息队列或者tcp/pipe连接将数据传送给其他的线程(aufs)/进程(diskd), 然后其他线程/进程进行读写.

很显然,这两种存储方式有一定的通信开销, 因此不一定就比 ufs 好, 需要具体问题具体分析前面说到, ufs/aufs/diskd都是在文件系统上面存储很多小文件,因此文件系统本身的特性严重影响了squid缓存的性能,对于Linux ,强烈推荐用 reiserfs 等适合处理小文件的文件系统, bsd 则至少要打开 softupdate, 以及 dirhash等一切对很多小文件有好处的选项. 在比较新的系统上面, reiserfs 等文件系统的性能已经足够优越, 通常 ufs 就已经可以应付需要.对于一些老系统,使用 aufs 或者 diskd 是比较好的选择,如果系统的线程库比较好(如Linux,Solaris),那么使用aufs, 否则 diskd.也有一些例外情况, 比如多 cpu 的 Linux 2.6 系统, 线程库很优秀, 虽然 ufs 本身已经比较快了,但是 squid单进程无法利用另外的 cpu , 不如使用 aufs , 让另外的 cpu 也可以起到一些作用, aufs在编译的时候可以选择使用几个读写线程. 这个个人觉得稍微超过 cpu 个数就可以了.但是并没有实际测试过.磁盘缓存开多大? 这个问题没有固定答案. 需要经过试验来确定, 一般来说开大一些没有太大问题. 只要你的硬盘足够


参考列表

http://www.lupaworld.com/tutorial-view-aid-3070.html

http://www.sudu.cn/info/html/edu/20080407/264785.html

http://blog.163.com/zhang_jinnan/blog/static/46563832201031910050584/


原创粉丝点击