工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表2013年03月的文章

多线程大文件断点续传和流媒体的处理方法

在使用Squid做反向代理的CDN节点时.多线程大文件断点续传和流媒体的处理是怎么样啦.前些日子花了点时间研究了一下.

在Squid做反向代理时.其中有个range_offset_limit的参数,意思是预先读取.还有一个maximum_object_size的参数控制能缓存的大小.

当了解上面二个参数的意思,我们来讲讲实际中会怎么样.当maximum_object_size设置成100M,也就是最大能缓存的大小.另外range_offset_limit最大预先读取我们也先让他也为100M.当有个用户,比如使用迅雷下载squid中一个100M的文件时.照理他是缓存这个100M,然后其它的用户都是下载的缓存的.理想状态就是这样.

但是事实不是这样处理的,这个和用户和请求数有关,当用户开启了多线程,比如并发10个线程从这个节点下载.预先读取的参数会同时10个并发来缓存,那这样,每个10个进程,在第一次,一个100M的文件有可能下载到squid节点中100M*10(并发)=1000M,直到其中最快的一个并发都预先读取完了所有的要下载的那个文件.才会给文件缓存起来.这样之后的用户才会从缓存中得到文件.但这样下载的量非常大.很多没有必要的.这样也就是我们为什么就从Cacti中常常见到很奇怪的流量.

为了防备squid被多线程下载工具冲击,让squid用acl来禁止http header中带range请求.客户端的表现就是采用多线程下载的请求都会被squid拒绝,也就是多线程下载工具无法下载通过你的squid代理的站点上的东西了.

当然,也可以做业务拆分,让单个squid来缓冲这些大文件,和有可能出现多并发的文件.然后给内容最好主动推到CDN的节点上面.

另外,建议看看

http://www.php-oa.com/2009/03/01/squid_large_files_range_offset_limit_quick_abort_min.html
 

Squid中的X-Cache和X-Cache-Lookup的意义

在做的CDN的机器的http头中,我们常常见到X-Cache和X-Cache-Lookup的二个参数,那这二个参数分别是什么意思,有什么分别啦.

HTTP/1.0 200 OK
Expires: Mon, 23 Jun 2008 09:16:40 GMT
Cache-Control: max-age=60
Content-Type: text/html
Accept-Ranges: bytes
ETag: "985899363"
Last-Modified: Mon, 23 Jun 2008 08:17:40 GMT
Content-Length: 54218
Date: Mon, 23 Jun 2008 09:15:40 GMT
Server: Microsoft-IIS/7.0
Age: 20
X-Cache: HIT from cdcnc-253-238
X-Cache-Lookup: HIT from cdcnc-253-238:80
Via: 1.0 cdcnc-253-238 (squid/3.0.STABLE1-20080201)
Connection: close

见到了吗?很奇怪吧,HIT表示命中,怎么会有二个命中.
X-Cache:其实就个就是真实本机的HIT和MISS.

X-Cache-Lookup:这个就是向父,还有sibling模式的查询,比如ICP.之类命中的数据.

squid反向代理基本概述及性能事项

squid反向代理作web加速是大型网站的常用模式。
1. squid来自于1990的cache harvest项目。
这个项目一个分支形成squid,另一个形成netapp的netcache产品(netapp的netcache是固化在其硬件产品中的,整体价格很贵)

2.squid是硬盘缓存,其使用内存作缓存内容的索引
(一个索引在32位系统中大小是75bytes,在64位系统中是112bytes)。
可以把squid想象成数据库,硬盘上是数据,内存中是索引:查询内存索引,发现内存位置,发出去。

3.产品下载及说明(http://download.opensuse.org/repositories/server:/proxy/
a)Squid:不用说了,就是squid的主程序
b)SARG的全称是:Squid Analysis Report Generator,SARG作为一款Squid日志分析工具,它采用html格式,详细列出了每一位用户访问internet的站点信息,时间占用信息,排名,连接次数,访问量,访问量等。
如果做反向代理,sarg可以不安装。这个工具对正向代理更有价值。
c)SquidGuard:重定向器,可以重写用户的uri,类似apache的mod_rewrite。关于重定向器,我建议少用,可能会降低性能。


二、性能要素
squid反向代理作web加速器时需要关注的系统性能因素主要是:

1 硬件:

i.大内存(最重要,影响最大);快速大硬盘(第二要素,更多缓存,看网站实际数据量了,要快速的,
  最好是1万转以上的,如sas10K或西部数据的猛禽系列);CPU(较为次要,影响不大,特别是多核处理器基本没用)。

ii.建议匹配配置:每G磁盘空间需要32M内存。这样,512M内存的系统,能支持16G的磁盘缓存。你的情况当然会不同。
内存需求依赖于如下事实:缓存目标大小,CPU体系(32位或64位),同时在线的用户数量,和你使用的特殊功能。
估算:建立一个有足够磁盘空间,可存储 3-7天web流量数据的系统。如带宽1M,则需要约3600*1M的数据缓存(3.5G),
如果一天提供8小时有效访问,则需要缓存10-28G(看重复情况了)。
但Squid官方网站说法:squid使用内存表索引硬盘缓存内容,硬盘内容/内存索引=177,但要同时考虑到squid程序内存,cache_mem,硬盘缓冲cache等占用的内存。
因此,我的估算:2G内存的系统,使用1.5G内存作squid索引,对应硬盘150G。

iii.关于硬盘说明:requests per second = 1000/seek time/硬盘数,一块硬盘是比较准确的,多块硬盘就不好说了。一定要用random-seek time小的盘,而随机寻道时间短意味着转速要快,越快其随机寻道时间越短!

iv.关于Swap:
毫不犹豫地关闭swap,squid是个大进程,使用swap只能使性能下降

2 适合的操作系统:
能够支持posix线程实现异步io的操作系统,如:linux2.6内核的系统

3 适合的文件系统:
reisfer文件系统,处理大量小文件(一般的网页缓存都是小文件),性能最佳

4 每个squid对应专门应用,写明httpd_accel_host避免dns查询,dns查询很消耗时间

5 配置尽量使用IP,不用域名,加快访问速度(如多台缓存服务器/后台服务器等)


三、磁盘IO瓶颈与优化

squid的磁盘IO瓶颈与优化:

A.现象:不使用cache时,平均响应时间明显更好,那么可以确认磁盘I/O是该水平吞吐量的瓶颈

B.硬件:不用raid(并不能带来明显性能提升,而且大大增加系统的风险),最好是独立文件系统+独立硬盘

C.在/etc/fstab中使用使用挂载参数:noatime(不记录文件访问时间),async(异步IO)

D.使用超过你需要的更大磁盘,并且仅仅使用空间的一半,空间越多写性能越好;不行就减少cachedir的大小

E.文件系统方式

1)UFS(squid默认的文件系统方式)性能较好,实时读写。

2)aufs使用异步多线程方式管理缓存读写,在多CPU系统上优势更明显,一个cachedir默认16个线程,需要posix线程系统,稳定性不如ufs,使用Aufs命令:
cache_dir aufs /cache0 4096 16 256
运行tail -f store.log看是否有文件写入磁盘,监控之。
注意:aufs要使用大量文件描述符,注意系统设置(用ulimit命令查看修改,对于suse10一般不用修改系统文件句柄数,仅需要修改进程文件句柄数量)

3)Diskd 使用消息队列实现异步io,还要修改内核参数,不如aufs稳定
4)Coss 用一个大文件存储全部cache,小型squid系统,试验性的
5)null 用于测试squid性能使用,必须指定cache_dir /tmp null

总结:
如果并发不高( 6),使用ufs就ok;
高并发,可以使用aufs(aufs在Linux和Solaris上运行良好)。
而且,同一服务器不要使用不同的缓存机制,cache的大小最好相同。

F.使用reisfer文件系统

dns 知识点扩展

1,bind 保存区域文件都是用文本文档来保存的,当数据量大的时候很容易造成操作错误。当数据量大的时候可以考虑数据库的模式。bind+mysql 数据库,有两种方式Bind DLZ 和 Mysql-bind

http://hi.baidu.com/wzypunk/item/45ca82fc25f76051c9f3374e  使用Mysql-bind实现mysql管理bind配置

http://www.vpsa.net/?post=59 bind-dlz+mysql搭建智能dns

(发现最近没时间了,就不捣鼓实验了,)

2,named.conf 配置文件详解

Named.conf是bind9的最先读取的一个文件,named支持如下语句:
Acl
Controls
Include
Key
Logging
Lwres
Options
Server
Trusted-keys
View
Zone

其中主要的是acl,controls,include,logging,key,options,view,zone其他的很少用到我们就来详细的对这些进行解释一下
—————-

Acl用来对bind的访问进行限制,是一个全局的设置,前面配置的acl在整个bind中都适用,和路由器里面的access-list有同工之处,语法是
acl acl-name {
address_match_list
};
其中的address match list是一个地址列表,如”192.168.0.0/24;”,记住最后一定得有分号,有多个的话中间用分号格开,如192.168.0.0/32;192.168.1.0/24;
bind内置了4个acl分别是:
any(不是all)        对应所有的,也就是0.0.0.0/0.
none        对应为空.
localhost        对应本地机器.
localnets        对应本地网络.
—————-

Controls主要用于对bind进行控制,如:
key “rndc-key” {
algorithm hmac-md5;
secret “VkMaNHXfOiPQqcMVYJRyjQ==”;
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { “rndc-key”; };
};
设置rndc控制的端口以及端口,keys用来设置控制的密钥.
—————-

include是一个非常有用的选项,作用是包含一个文件进来,如果需要写程序来读写bind的配置文件,这个将会用到,因为bind的配置文件很不规则,但是用了include后,就可以变的很规则,就和数据库一样了J,功用和c语言里面的include一样.
—————-

Options是用于设置bind的一些选项,我们将重点介绍,BING9支持的选项如下:
options {
blackhole { <address_match_element>;; … };
coresize <size>;;
datasize <size>;;
deallocate-on-exit <boolean>;; // obsolete
directory <quoted_string>;;
dump-file <quoted_string>;;
fake-iquery <boolean>;; // obsolete
files <size>;;
has-old-clients <boolean>;; // obsolete
heartbeat-interval <integer>;;
host-statistics <boolean>;; // not implemented
interface-interval <integer>;;
listen-on [ port <integer>; ] { <address_match_element>;; … };
listen-on-v6 [ port <integer>; ] { <address_match_element>;; … };
match-mapped-addresses <boolean>;;
memstatistics-file <quoted_string>;; // not implemented
multiple-cnames <boolean>;; // obsolete
named-xfer <quoted_string>;; // obsolete
pid-file <quoted_string>;;
port <integer>;;
random-device <quoted_string>;;
recursive-clients <integer>;;
rrset-order { [ class <string>; ] [ type <string>; ] [ name
<quoted_string>; ] <string>; <string>;; … }; // not implemented
serial-queries <integer>;; // obsolete
serial-query-rate <integer>;;
stacksize <size>;;
statistics-file <quoted_string>;;
statistics-interval <integer>;; // not yet implemented
tcp-clients <integer>;;
tkey-dhkey <quoted_string>; <integer>;;
tkey-gssapi-credential <quoted_string>;;
tkey-domain <quoted_string>;;
transfers-per-ns <integer>;;
transfers-in <integer>;;
transfers-out <integer>;;
treat-cr-as-space <boolean>;; // obsolete
use-id-pool <boolean>;; // obsolete
use-ixfr <boolean>;;
version <quoted_string>;;
allow-recursion { <address_match_element>;; … };
allow-v6-synthesis { <address_match_element>;; … };
sortlist { <address_match_element>;; … };
topology { <address_match_element>;; … }; // not implemented
auth-nxdomain <boolean>;; // default changed
minimal-responses <boolean>;;
recursion <boolean>;;
provide-ixfr <boolean>;;
request-ixfr <boolean>;;
fetch-glue <boolean>;; // obsolete
rfc2308-type1 <boolean>;; // not yet implemented
additional-from-auth <boolean>;;
additional-from-cache <boolean>;;
query-source <querysource4>;;
query-source-v6 <querysource6>;;
cleaning-interval <integer>;;
min-roots <integer>;; // not implemented
lame-ttl <integer>;;
max-ncache-ttl <integer>;;
max-cache-ttl <integer>;;
transfer-format ( many-answers | one-answer );
max-cache-size <size_no_default>;;
check-names <string>; <string>;; // not implemented
cache-file <quoted_string>;;
allow-query { <address_match_element>;; … };
allow-transfer { <address_match_element>;; … };
allow-update-forwarding { <address_match_element>;; … };
allow-notify { <address_match_element>;; … };
notify <notifytype>;;
notify-source ( <ipv4_address>; | * ) [ port ( <integer>; | * ) ];
notify-source-v6 ( <ipv6_address>; | * ) [ port ( <integer>; | * ) ];
also-notify [ port <integer>; ] { ( <ipv4_address>; | <ipv6_address>;
) [ port <integer>; ]; … };
dialup <dialuptype>;;
forward ( first | only );
forwarders [ port <integer>; ] { ( <ipv4_address>; | <ipv6_address>; )
[ port <integer>; ]; … };
maintain-ixfr-base <boolean>;; // obsolete
max-ixfr-log-size <size>;; // obsolete
transfer-source ( <ipv4_address>; | * ) [ port ( <integer>; | * ) ];
transfer-source-v6 ( <ipv6_address>; | * ) [ port ( <integer>; | * ) ];
max-transfer-time-in <integer>;;
max-transfer-time-out <integer>;;
max-transfer-idle-in <integer>;;
max-transfer-idle-out <integer>;;
max-retry-time <integer>;;
min-retry-time <integer>;;
max-refresh-time <integer>;;
min-refresh-time <integer>;;
sig-validity-interval <integer>;;
zone-statistics <boolean>;;
};
obsolete是已经过时的选项,这里不用考虑, not yet implemented是尚未完成的选项,这里也不用考虑,下面详细介绍这里面的有用选项注意,前面打”*”的为选项)

blockhole 定义服务器不对查询进行反应的地址列表,也就是”黑名单”,比如说3721的ip段:218.244.44.0/24,当设置了黑名单后,对于这个段的请求查询,服务器将不会作出反应.

directory 设置bind的数据文件的存放位置:如 directory “/var/named”

dump-file 设置当执行rndc dumpdb命令后的导出文件存放绝对路径,如果没有指定的话,缺省文件为named_dump.db,放在directory指定的目录下面.

pid-file 设置bind的进程号pid文件.

interface-interval 设置bind检查网卡变化的周期.

forward 值有first和only两项, first则首先转发到”forwarders”中的服务器,然后自己查询,only则仅转发到 “转发服务器列表”中的服务器,不再自己查询

forwarders设置转发服务器地址列表,语法同acl中的语法.

listen-on 设置bind的绑定ip和端口,如listen-on 53 {192.168.0.1;};

max-cache-size 设置最大缓存的大小,如max-cache-size 5M

version 设置客户查询DNS版本好的返回信息,如果不想让客户探测到当前的版本好,就用这个好了,如version mydns1.0;
auth-nxdomain 是否做为权威服务器回答域不存在(Auth-nxdomain)
如果设置为’yes’,则允许服务器以权威性(authoritatively)的方式返回NXDOMAIN(该域不存在)的回答,否则就不会作权威性的回答,缺省值为”是”.
notify 在主服务器更新时是否通知辅助服务器(notify)
如果设置为”yes”,则在主服务器区域数据发生变化时,就会向在域的”域名服务器“中列出的服务器和“亦通知”中列出的服务器发送更新通知。这些服务器接受到更新通知后,就会向主服务器发送请求传输的消息,然后区域文件得以更新。

recursion 是否允许递规查询(recursion)
如果设置为”yes”,则允许服务器采用递归的方式进行查询,也就是当要查询的地址不在服务器的数据库列表中时,服务器将一级一级的查询,直到查到为止。(一般对局域网都打开)
设置为”no”,并不意味着服务器对于请求的递归查询不给予回答,而是对于请求的递归查询,不再向上级服务器请求,也不缓存,如果不对请求的递归查询回答,可以清空缓存,然后设置为“NO”.

allow-query 允许普通查询的地址列表(allow-query):
设置允许进行普通查询的ip地址列表,在域中的设置将覆盖全局设置,默认情况下是允许所有的地址进行普通查询.

allow-recursion允许递归查询的地址列表(allow-recursion):
设置允许进行递归查询的ip地址列表,缺省值是允许所有地址进行查询,需要注意的是当设置了不允许递归查询后,如果仍然能够查询部分外部的域名,那是因为dns的缓存在起作用,将缓存清除以后就可以了.

allow-transfer允许服务器进行区域传输的地址列表(Allow-transfer):
(注意的是视区和域中的设置将覆盖全局设置).

allow-notify 允许更新通知的地址列表(allow-notify)
当服务器作为辅助服务器的时候,设置这个可以对收到的更新通知进行判断,只是接收该列表的更新通知.默认情况下,只是接收来自主服务器的更新通知。对于其他服务器的更新通知,会忽略掉.

also-notify 更新时亦通知下列地址(also-notify):
设置发送更新通知的时候,不仅是域名服务器中列出的地址,亦通知此地址列表中的地址。

Records:281234