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

nxdomain redirect 以及在bind 9.9中的实现

今天客户有个需求,就是将不存在的解析域名请求都解析到他们的一台设备上,其实这个就是类似与电信或者联通的域名纠错系统了。

其中SSAC有一篇文章,就是讲这个的,sac-032-en

这个根据网上的资料有几个实现思路

A、F5上配合filter进行实现

B、修改dns源码

C、bind原生支持

F5的实现方式

首先说一下F5上的实现:我们的产品前面确实有F5的负载均衡设备,但是在上面跑着很重要的服务,所以也没去实验,但根据网上的说法这个是可行的:利用rules,就是拆解dns的响应包,如果状态码是NXDOMAIN,则插入A记录或者其它东西;

DNS用于响应的报文由12字节长的首部和4个长度可变的字段组成。其中从第28位开始的4位的标志字段的子字段为rcode为返回码字段,通常的值为0(没有差错)和3(名字差错),名字差错从一个授权的名字服务器上返回,表示在查询中指定的域名不存在。因此把rcode字段返回的值变更为指定的字符串,就可以完成nxdomain redirect的要求

具体实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
rule dns_redirect {
 when RULE_INIT {
 set ::header_without_id [binary format S5 {0x8180 0x0001 0x0001 0x0000 0x0000}]
 set ::answerpart [binary format S6c4 {0xC00C 0x0001 0x0001 0x0000 0x0D1B 0x0004} {8 8 8 8}] #后面的这四个8 代表ip,8.8.8.8
 }
 when SERVER_DATA {
 binary scan [ string range [UDP::payload] 2 3 ] S sflags
 set rcode [expr $sflags & 0x000f]
 if {$rcode == 3 }{
 binary scan [string range [UDP::payload] 12 13 ] c foo
 set byte [expr $foo & 0xff]
 set offset 12
 set i 0
 while {$byte > 0 && $i < 10} {
 
# grab a part and put it in our text QNAME section
 set offset [expr $offset + $byte + 1]
 # grab the length of the next part, and make it an unsigned integer
 set byte [string range [UDP::payload] $offset [expr $offset + 1]]
 binary scan $byte c foo
 set byte [expr $foo & 0xff]
 incr i
 }
 incr offset
 binary scan [string range [UDP::payload] $offset [expr $offset + 2]] S qtype
 content
 if {$qtype == 0x0001} {
 UDP::payload replace 0 0 [binary format a2a*a*a* [string range [UDP::payload] 0 1] $::header_without_id [string range
 [UDP::payload] 12 [expr $offset+3]] $::answerpart]
 }
 }
 }
 }

总之,F5还是很灵活的,并且很多isp都在使用,上面的方案就是某isp的一个方案;

修改源代码的方案

接着说下修改源代码的这个方案,当然可以实现,但是开发成本挺高,暂时不考虑

bind-9.9.2 nxdomain redirect

下面就说下使用bind-9.9.2中最新的nxdomain redirect 功能

1、下载

wget ftp://ftp.isc.org/isc/bind9/9.9.2-P1/bind-9.9.2-P1.tar.gz

2、解压

tar zxf bind-9.9.2-P1.tar.gz

3、编译安装

cd bind-9.9.2-P1

./configure --prefix=/var/named --enable-threads --without-openssl --sysconfdir=/var/named/etc --with-libtool

make install

4、几个重要的配置文件

/var/named/etc/named.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@chenqing ~]# cat /var/named/etc/named.conf
options {
directory "/var/named";
 
// dump-file "/var/named/data/cache_dump.db";
 
// statistics-file "/var/named/data/named_stats.txt";
 
// memstatistics-file "/var/named/data/named_mem_stats.txt";
 
allow-query { any; };
 
recursion yes;
//forward first ;
//forwarders {127.0.0.1;};
dnssec-enable no;
 
dnssec-validation no;
 
dnssec-lookaside no;
 
/* Path to ISC DLV key */
 
bindkeys-file "/etc/named/bind.key";
};
 
logging {
 
channel default_debug {
 
file "data/named.run";
 
severity dynamic;
};
 
};
 
zone "." IN {
 
type hint;
 
file "named.ca";
 
};
zone "." {
 
type redirect;
 
file "redirect.db";
 
};

/var/named/named.ca

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
; <<>> DiG 9.5.0b2 <<>> +bufsize=1200 +norec NS . @a.root-servers.net
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34420
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 20
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;.              IN  NS
 
;; ANSWER SECTION:
.           518400  IN  NS  M.ROOT-SERVERS.NET.
.           518400  IN  NS  A.ROOT-SERVERS.NET.
.           518400  IN  NS  B.ROOT-SERVERS.NET.
.           518400  IN  NS  C.ROOT-SERVERS.NET.
.           518400  IN  NS  D.ROOT-SERVERS.NET.
.           518400  IN  NS  E.ROOT-SERVERS.NET.
.           518400  IN  NS  F.ROOT-SERVERS.NET.
.           518400  IN  NS  G.ROOT-SERVERS.NET.
.           518400  IN  NS  H.ROOT-SERVERS.NET.
.           518400  IN  NS  I.ROOT-SERVERS.NET.
.           518400  IN  NS  J.ROOT-SERVERS.NET.
.           518400  IN  NS  K.ROOT-SERVERS.NET.
.           518400  IN  NS  L.ROOT-SERVERS.NET.
 
;; ADDITIONAL SECTION:
A.ROOT-SERVERS.NET. 3600000 IN  A   198.41.0.4
A.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:503:ba3e::2:30
B.ROOT-SERVERS.NET. 3600000 IN  A   192.228.79.201
C.ROOT-SERVERS.NET. 3600000 IN  A   192.33.4.12
D.ROOT-SERVERS.NET. 3600000 IN  A   128.8.10.90
E.ROOT-SERVERS.NET. 3600000 IN  A   192.203.230.10
F.ROOT-SERVERS.NET. 3600000 IN  A   192.5.5.241
F.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:500:2f::f
G.ROOT-SERVERS.NET. 3600000 IN  A   192.112.36.4
H.ROOT-SERVERS.NET. 3600000 IN  A   128.63.2.53
H.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:500:1::803f:235
I.ROOT-SERVERS.NET. 3600000 IN  A   192.36.148.17
J.ROOT-SERVERS.NET. 3600000 IN  A   192.58.128.30
J.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:503:c27::2:30
K.ROOT-SERVERS.NET. 3600000 IN  A   193.0.14.129
K.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:7fd::1
L.ROOT-SERVERS.NET. 3600000 IN  A   199.7.83.42
M.ROOT-SERVERS.NET. 3600000 IN  A   202.12.27.33
M.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:dc3::35
 
;; Query time: 147 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Mon Feb 18 13:29:18 2008
;; MSG SIZE  rcvd: 615

/var/named/redirect.db

1
2
3
4
5
6
7
8
9
10
11
$TTL 300
 
@ IN SOA ns.example.net hostmaster.example.net 0 0 0 0 0
 
@ IN NS ns.example.net
 
; NS records do not need address records in this zone as it is not in the
 
; normal namespace.
 
*. IN A 8.8.8.8

5、启动 named

/var/named/sbin/named -c /var/named/etc/named.conf -u named

6、验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@chenqing ~]# dig  xxxxxx.chenqing.org
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.6 <<>> xxxxxx.chenqing.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37117
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;xxxxxx.chenqing.org.       IN  A
 
;; ANSWER SECTION:
xxxxxx.chenqing.org.    300 IN  A   8.8.8.8
 
;; Query time: 1301 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Mar 20 22:02:43 2013
;; MSG SIZE  rcvd: 53

[squid]看上去很美——国内CDN现状与美国对比

CDN的理想与现实
多年以前,当《Kingdom of Heaven》这部史诗电影发行的时候,中国的影迷使用电驴和BT来寻找种子,而那个时候,高清也才刚刚进入电影领域,我的同事不惜用自家的电脑花费一个星期的时间去下载高清的版本。而现在,中国的影迷在使用迅雷去下载《越狱》,而每一集越狱播出以后,在20小时之内,迅雷上面就可以下载到有中文字幕的完整版本,而影迷只要半个小时就可以下载完成,他们使用的是以“CDN”为基础的所谓P2SP服务。我们在这里不需要讨论盗版的问题,我们在这里想谈论的只是互联网和CDN的改变……
我们要谈论CDN么?
互联网的改变让CDN变得不那么神秘与高深
CDN是个古老的东西,在互联网发展之初就已经出现了。一群MIT的精英份子发现如果要让任何地方的人都可以很快的打开自己的网站的话,就需要象在世界各地盖教堂一样,把自己的网页发布到离信众最近的地方去。所以,他们用一种简单的缓存镜像的办法实现了这种发布。最早的入主这个教堂网络的是Yahoo!那是在1998年。就像天做良缘,Yahoo!使用了当时世界上最大的CDN网络,当然现在他还是最大的。啊,忘了解释:CDN是内容投递网络(Content Delivery Network)的简称。我们可以在Wiki上面轻易找到这个单词的解释,但并不是所有人都能轻易理解CDN和它的意义,因为它是一个架接在互联网与传统电信运营商之间的看不见的桥梁。
让我们继续回顾互联网与CDN在那耀眼的一瞬之后的日子,互联网经历了泡沫的破裂,新模式的创新,但CDN却好像渐渐的被人遗忘了。我们熟悉的portal,垂直portal,鼠标加水泥,B2B,C2C,B2C,P2P,Web2.0,搜索,竞价排名,Page Ranking, RSS,Wiki,Meshup,pod_casting,网络游戏,Social Network……那么多我们耳熟能详的名词,或者其实并不明白其中的真正意思,但在炫耀自己的互联网阅历的时候随口说出的几个里面,唯独没有CDN……直到短视频的出现。
YouTube出现在世人面前的时候,人们为互联网的又一次革命而叫好,而与此同时,人们看到了在YouTube后面的一个强大的CDN支持,是这个CDN网络把YouTube的无数视频展现在人们面前,在这个时候,人们发现CDN是不可或缺的,CDN在经历了那么长时间的默默无闻以后,突然一夜间闻达于诸侯,就象君士坦丁大帝把天主教定为国教一样,大家突然认识到了一个不为人熟知的领域。但我们看到的是什么呢?君士坦丁介绍给罗马的天主教是耶稣创立时的教义么?我们所看到的CDN是MIT创立时的CDN么?
人们开始搜索CDN,研究CDN,发现CDN是那么的简单,可以用一页PPT就把原理讲的清清楚楚,而网络硬件的厂商也会这样和互联网的客户说,我们可以提供完整的CDN解决方案,你不需要做什么,买我们的硬件,它已经能够解决你所有的CDN问题。
从此,CDN变成了一个流行词汇,尤其是在高盛领投LimeLight(全球第二大CDN公司) 1.2亿美金之后,突然之间,世界各地都出现了大大小小的CDN公司,无数的投资蜂拥而至,就像那时的罗马,人人都开始信仰天主教,也许是真的信仰,也许是为了圣餐,也许是为了研究,总之,“我们都爱CDN”。
也许有人问:我们谈论的是同一个CDN么,或者我们谈论的不是CDN?
当我们在说CDN的时候,所有的公司都是谈到两个偶像,就像谈耶稣和圣母一样,一个是Akamai(世界第一大CDN公司),一个就是LimeLight。所以,阵营就分开来了,要么介绍自己是师从Akamai,要不就说自己是LimeLight的真传弟子,尽管大部分这么说的人几乎没有见过Akamai和LimeLight的网络和服务,但并不影响大家对自己的夸耀和标榜。而CDN是什么却越来越没有人关注,哪怕是LimeLight和Akamai的区别也被人忽略了。我们每一个谈论CDN的人谈论的是同一个概念么?
CDN是有专利的,这一点与天主教的圣经不同,CDN的解释是可以通过查询这些文件发现的。CDN在利用DNS的转授权来引导最终访问者找到最理想的缓存或者镜像站点,它是基于域名的一种服务。在不同的实现方式下,最终的定位到哪个缓存和镜像站点的策略有很大的不同。Akamai使用的是传统的基于地理位置的定位策略,在世界各地的ISP里面,都会有自己的节点,而通过智能DNS的判断,可以为用户找到离自己地理位置“最近”的节点。而LimeLight则用的是完全不同的策略,LimeLight有自己的骨干网,给访问者的节点并不是地理位置“最近”的节点,而是路由层面“最近”的节点,这一点有点像我们访问网站不通过域名而直接通过IP访问一样,它会寻找对于访问者的ISP最近的路由是哪里,用那里的节点服务于这个访问。LimeLight的策略已经在很大程度上改变了CDN的工作方式,所以,当LimeLight准备上市的时候,谁都会认为他们已经绕过了Akamai的专利壁垒,但不幸的是,之后他们还是遇到了诉讼的麻烦,或许因为DNS转授权是无法改变的……
在这样的壁垒下面,任何做CDN的公司都好像要面对宗教法庭一样,要么被烧死,要么就皈依。所以,有好事者想我们如果使用其他的方式做CDN该有多好?我们既然可以把驴弄进贵州,为什么不能把P2P融进CDN?我记得一位Akamai的高管对我说过,那不是CDN,CDN是透明的……,所以,让我们忘了P2PCDN吧……。也许还没有人搞清楚P2P和CDN的关系,那么Cloud呢?也许是个好主意。但实际上客户已经在自己发展他们认为的CDN了,其中也包括所谓的P2P CDN。
那么CDN真的象我们想象的那么美好么?就像天国王朝里面的圣地?
当年的《天国王朝》,无数的十字军涌向耶路撒冷,那里是天国,是一个可以让灵魂升华与遍地黄金的地方,但生活在圣城的人们却发现事实与理想相去甚远……,现在人们涌向CDN,是因为它是一个看起来很美的行业,但实际上如何呢?
自从CDN成为一个业内的大众词汇,CDN服务就像卖白菜一样了,几乎没有人关心你的CDN和别人的CDN有什么差别,只是问多少钱1M,多少钱1G,好用么?回答的也是那么的合乎情理:你可以试试,不好不要钱。
另一方面,CDN客户的流失率从来没有下过10%,高的公司可以达到20%-30%,测试客户更是今天测,明天走。正是因为这样,客户基本上找不到满足要求的CDN公司,从而让很多人开始质疑CDN本身有问题,甚至突然觉得CDN应该是一个夕阳产业。
好在中国但凡叫得出名字的CDN公司,这几年的收入都是翻翻的,虽然利润少的可怜,而且那些利润也不是从CDN业务中获得的……
但我们同时发现在美国的Akamai却有着不同的表现,2007年6亿美金的销售额,1亿美金的纯利润,毛利更是超过40%,2008年至少有30%的成长。难道美国是CDN的天国,而中国就是被异教践踏的土地?还是我们并没有看到CDN真正的一面?就像柏拉图所描绘的山洞,我们看到只是火光照耀的影子?
事实上,互联网出现以来,只有CDN是没有海外公司进入中国市场的互联网业务,而正是这样的安排或者壁垒,让中国的CDN与海外的CDN有着巨大的差别。
差别?差距,还是用差别吧。
(美国的CDN与中国CDN的对比)
在美国,CDN领域里面会有这样一些分类:静态内容的加速,动态内容的加速,大文件下载加速;对不同的客户类型,还会有不同的系统与之对应,比如SSL加速,Long Tail加速,Streaming加速;而对不同行业客户也会有不同的加速系统,比如媒体类客户加速,电子商务类客户加速,软件与IT行业客户的加速等等。甚至于对不同的客户规模也会有不同的系统与之对应:大流量客户的加速,中小客户的加速,甚至个人客户的加速;CDN的系统是一个庞杂而专业性非常强的领域。在这些领域与系统中,所有的功能甚至网络都是不一样的,配置的系统也是不一样的。
但在中国,这些系统的差别大部分是在售前的嘴里和不知所云的白皮书里面。而网络都是一个,功能都是一个,实现方式也是一个,所以就会出现如果一家CDN公司做不了一个功能,几乎所有的CDN公司都做不到,因为大家都是用最“通用的方式构建自己的通用CDN”,从而使中国CDN成为一个从电信转卖带宽的代理商。
我们发现了几个有趣的小例子:
中国的网站很注意防盗链(虽然并不注意防盗版),但是居然没有哪家CDN公司可以提供一个让客户满意的防盗链的系统,虽然各家都在说自己提供防盗链。就象我的一个做远程教育的朋友和我说的一样,“测试了能够叫得出名字的所有的CDN公司,但却没有一家CDN公司可以做好防盗链。”但在Akamai,这是一个很久就标准化的服务了。
中国是一个游戏和软件下载的大国,互联网上的主要流量是下载,而直到最近,国内的CDN公司才开始可以提供基于HTTP下载成功数的统计功能,而且还不是全自动的,是需要客户配合设置才可以使用。同样,在Akamai,这也是基本服务项目。
再有一个例子与视频有关了,短视频网站使用的Flash视频,在用户端是和文件下载没有区别的,用户会尽可能快的去下载完视频文件,而通常播放一个视频只需要300K码流就可以流畅播放,这样会有两种情况导致资源的浪费,第一、用户看视频并没有看完,但下载已经下载完了;第二、用户如果是宽带接入的话,虽然只需要300K带宽,可实际上却使用了1M。对于最终用户来说,这两点几乎不会有什么实际影响,但对视频网站来说,这意味着浪费了宝贵的带宽资源,在同等条件下支付了更多的成本。这与上面谈到的HTTP下载成功数计费是一个道理。而在美国,CDN公司是可以控制每个HTTP链接的速度,比如在开始播放的前30秒,1分钟不进行限速,而超过这个时间,就可以把速度控制在需要的范围内,以节省带宽资源。
至于SLA(服务等级协议),就更加的有趣,通常在中国的SLA是不会作为依据的,而评估好坏的标准是“你自己上网看看就知道了么”,这是中国现在一家发展很快的CDN公司的老总的看法。奇怪的是,使用CDN之后,没有哪家客户有能力在去进行所有地区的测试,看一下自己的网站是否比原来快。在这样的情况下,有些做论坛的客户就会发动自己在各地的版主进行测试,收集意见,然后再告诉CDN公司,你们哪里哪里不好,能否调一下?我们的CDN服务商然后说,“噢,你先给我们解释你是怎么测试的?给我一个你们测试的IP,我看看是不是不是中国的IP啊,千万不要给我你自己机器的IP,要给我Local DNS的IP……,不知道Local DNS?怎么连这个都不知道呢?……那是……”(其实我个人觉得还应该问问版主是不是中国人,也许这样更容易发现问题),我只能说,这是多好的客户啊……,在美国的CDN服务商会感动的掉泪的。
在美国,用户会每天得到一份SLA报告,会标出在什么时间段SLA没有达到标准,如果用户需要,还会给用户具体哪个区域没有达到SLA标准,而所有的这些,都只需要用户登录到BOSS的portal上面。
类似的例子还有很多,比如流的点播加速,长尾市场,小图片的加速等等。这些服务功能的差别也许还不是最主要的,而成本的控制与自动化的运营却是CDN公司能否盈利的关键,Akamai部署一个客户只需要10分钟,而国内部署需要客户在填写复杂的表格后,耐心的等待1天时间;Akamai管理上万台服务器只需要4个人,任何时间10%的服务器宕机都无需处理,因为系统会自动保证服务的可靠运行并自主恢复,而国内最小的CDN公司运维人员也有几十个,并且疲于应付各种“突发”事件。
现在,也许我们应该提一个建议,开放中国的CDN市场,让大部分中国的网站都可以看到真正的CDN服务是什么样子。
到这里,其实我们忽略了一个重要的问题,需求!中国的客户使用CDN很多时候是希望以此解决南北互通的问题,而美国客户没有这个问题,他们使用CDN首要考虑的是off load和降低成本。在有人发现有其他更加经济实惠的方案之后,CDN在米国的日子好像也不好过了。
CDN被逐出了圣地?
BT的出现对媒体行业来说是打开了一个盒子(也许是潘多拉,也许是宝盒),盗版的发行比以往任何时候都要快,成本也更低;而同时,视频直播也达到了前所未有的低成本,我们也许还记得在P2P客户端上看欧洲杯,看NBA,看奥运,如果是换成CDN,任何公司都会无法负担。
在看看客户情况,伟大的Google是一个什么事情都要in source的公司,它从来不使用CDN,但它的服务遍及全球,Amazon的EC2,SaleForce的CRM系统,Second Life的虚拟世界,他们都没有在CDN上,但他们同样出色,而且看起来更有效率,成本更低。
现在,已经没有人会考虑使用CDN做大规模的直播服务了,充其量是作为一个备份手段;而自从YouTube离开LimeLight以后,CDN的光环也开始慢慢退去,VC和投机者开始又一股脑的质疑这个奇怪的生意,CDN有价值么?为什么盈利这么困难呢?就像勇猛的萨拉丁赶走了十字军一样,难道CDN会被P2P和不断升级的光纤所取代?还是象经过改革的宗教一样,即使历经文艺复兴与科技的反复冲击,而今依然影响着无数的人们。
CDN的宗教革命?
我们之所以把CDN比作宗教,是因为CDN到现在也有很多“流派”,LimeLight的大节点,大带宽的做法被许多IDC与运营商背景的公司所推崇,而传统的Akamai模式则是独立于运营商之外的CDN公司所首选的道路;而各种新奇理念的出现更是让CDN行业象是一个万花筒,从而也使其拥有更多的互联网气息。Amazon的Cloud Front,EC2;Level 3的ITM;Prime的CDN Aggregation,CDTM;Simple CDN的S3+等等,如此众多的演变,任何一种都是对传统CDN,甚至是对LimeLight模式的革命。感谢LimeLight与Akamai的成功,让很多优秀的工程师与天才的梦想家投入到CDN这个被Akamai一家统治多年的领域,并不断给我们与CDN客户以惊喜。但当我们把目光从美国看回中国的时候(上述所有的公司都是美国企业),我们要面对的是什么样的现实?
中国的CDN是CDN的佛教还是道教?还是象柏阳说得被中国这个大染缸去其精华留其糟粕的垃圾?
说道中国的CDN,我们可能要问:什么时候CDN开始没人关注SLA?什么时候CDN开始不提供标准的95/5计费?什么时候,全网配置的服务被悄悄替换成了“部分”节点配置?什么时候,CDN变成了一个黑匣子,客户无从了解自己的服务与问题,也无法控制自己的内容的发布与刷新(美国的CDN客户是可以直接自己设置3段TTL时间的)。这些我们无从而知,因为可能从我们开始认识中国CDN的时候就已经是这个样子了。
所以这些后来的中国的CDN厂商第一件要做的事情就是鼓吹自己的节点数量,而不管是否这些节点都为所有客户提供服务(客户甚至不知道有几个节点在为自己服务。PS:一般情况下,中国CDN公司为每个客户配置的节点不会超过20个)
所以,当海外的CDN公司在网站上介绍其服务的时候,中国客户通常很难找到他们全球有多少节点的信息,而中国CDN公司则乐此不疲的修改自己的节点地图,也不管地图画得就像一张地雷分布图。而销售人员更是信口开河的讲自己的公司有几百个节点,可笑的是,几乎所有的CDN公司都有“几百”个节点,全中国的IDC恐怕都不够这些CDN公司瓜分的了。
中国CDN已经把CDN本土化了,经常挂在嘴边的是外国公司不了解中国的网络,也许是吧,但到现在为止,没有一家本土CDN公司可以解决教育网的服务质量问题。而大部分的客户到CDN节点机房看到的情况是:“哦,怎么你们在使用和我们自己一样的系统?!”这是为什么呢?因为中国的CDN公司认为CDN是运营业务,就像中国移动,中国电信一样,最主要的是运营;
而象Akamai这样的美国CDN公司首先认为自己是技术公司,然后才是运营公司,Akamai的系统从底层到应用是自己开发的,所有的服务是自己开发的,所有的控制与监管是自己开发的,甚至在早期,连硬件都要自己开发。我记得一位VC界的著名人物这样评价在中国很出名的CDN企业:“他们没有技术”。这就是中国CDN与美国CDN公司的最大差距。那我们要问,难道十几年中国CDN的发展就白费了么?当然不是的,中国的CDN在花费了大量的时间在处理用户的客户化需求,可惜这些需求主要表现在计费领域,有的CDN公司居然有上百种计费方式。
而对于CDN的黑盒子问题(即用户看不到及时全面的数据),就像佛教的禅宗一样,一句“不可说”,客户也没有任何办法。而对于道教的无为则通常会用在对付客户的投诉上面。当然,这是不能责怪CDN的运营人员的,即使在CDN如火如荼的年代,能够说清楚CDN的具体情况与细节的人也还是少之又少。记得上面提到的发展很快的那家CDN公司的老总说到视频:“我们觉得视频是一个很简单的服务,根本没有难度”,但当客户测试他们视频服务,却选择了其他运营商之后,已经很少听到这种气壮山河的言论了。
中国的CDN虽然经历了很长的时间,但却没有真正的积累下来,而本土化,或者异化的CDN使本来就难于理解的CDN服务被断章取义的成为一个Cache和带宽的替代词汇。
而事实上,真正的CDN服务或者CDN的本来面目我们也许就从没有见到,就像中国的网站编程,在IE下看的好好的,但是换了浏览器就全乱了,这才发现原来没有按照W3C标准编写,而问题是很多的编程人员根本就没看过这些标准,所以也就不知道原来IE并不是严格遵照W3C解析与渲染的。
To be, or not to be: that is the question!
当莎士比亚的这句名言作为出现在这里的时候,我们应该考虑的是CDN的未来,还是中国CDN的未来?
让我们在更高的层面来看待如今的年代,越来越多的闪光点出现在这个领域,就像在Google出现之前,没有人关注搜索一样,CDN有可能成为第二个孕育奇迹的行业。CDN伴随着互联网的成长起起落落,现在的服务已经不仅仅局限在内容的分发,越来越多的CDN公司开始提供以复杂分布式存储为核心的存储网络服务,Amazon的S3是一个典型的代表,而Prime的FileGrid则是另一个值得关注的方向。Amazon在这个领域已经耕耘多年,虽然不是一个CDN公司,但实际上的服务内容已经涵盖了CDN服务,而其基于运计算的EC2服务更是现在可以使用的唯一的“云”了。有人说云计算就是CDN的未来,这也许还很远,Bill Gate的话也许更有道理:“云存储离我们更近一些”。无论是云计算还是云存储,对于CDN公司来说,都要比其他任何行业的公司都要靠近云端,而CDN的路线图也一定会是这样的发展,从内容网络到存储网络再到计算网络,而未来的CDN也会象使用电灯一样容易。
对于CDN的未来憧憬,另外的方向就是CDN云,尽管只是一个概念,但确实是一个很宏伟的想法,虽然现在可以看到的服务只有Prime的CDTM,或许这是CDN云的初级阶段──一个利用众多的CDN网络构建一个更高效成本控制更好与更智能的网络,但谁能够忽视这令人兴奋的进步与想象力?
在中国,各家CDN公司都开始大力开发自己的产品,也从没有象现在这样重视研发。而Akamai,CDNetwork已经开始进入中国;Prime也开始在中国展开一些试探。中国的客户已经开始体验到不同的服务,有的CDN公司提出的SLA至少看起来已经是一份有价值或者是可以度量的标准文件了。虽然路还是有些漫长,但相信中国的客户将会很快体验到世界水准的CDN服务,以及天才工程师们所创造的更多令人兴奋的网络产品。
中国乃至世界CDN领域的大变革正发生在我们身边,也许明天你就会看到一个不同的CDN来到你的眼前。

Mysql 慢查询和慢查询日志分析

众所周知,大访问量的情况下,可添加节点或改变架构可有效的缓解数据库压力,不过一切的原点,都是从单台mysql开始的。下面总结一些使用过或者研究过的经验,从配置以及调节索引的方面入手,对mysql进行一些优化。
第一步应该做的就是排查问题,找出瓶颈,所以,先从日志入手
开启慢查询日志
mysql>show variables like “%slow%”; 查看慢查询配置,没有则在my.cnf中添加,如下

log-slow-queries = /data/mysqldata/slowquery.log    #日志目录 long_query_time = 1                          #记录下查询时间查过1秒 log-queries-not-using-indexes     #表示记录下没有使用索引的查询

分析日志 – mysqldumpslow
分析日志,可用mysql提供的mysqldumpslow,使用很简单,参数可–help查看

# -s:排序方式。c , t , l , r 表示记录次数、时间、查询时间的多少、返回的记录数排序; #                             ac , at , al , ar 表示相应的倒叙; # -t:返回前面多少条的数据; # -g:包含什么,大小写不敏感的; mysqldumpslow -s r -t 10  /slowquery.log     #slow记录最多的10个语句 mysqldumpslow -s t -t 10 -g "left join"  /slowquery.log     #按照时间排序前10中含有"left join"的

推荐用分析日志工具 – mysqlsla

wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz tar zvxf mysqlsla-2.03.tar.gz cd mysqlsla-2.03 perl Makefile.PL make make install mysqlsla /data/mysqldata/slow.log # mysqlsla会自动判断日志类型,为了方便可以建立一个配置文件“~/.mysqlsla” # 在文件里写上:top=100,这样会打印出前100条结果。
【说明】 queries total: 总查询次数 unique:去重后的sql数量 sorted by : 输出报表的内容排序 最重大的慢sql统计信息, 包括 平均执行时间, 等待锁时间, 结果行的总数, 扫描的行总数. Count, sql的执行次数及占总的slow log数量的百分比. Time, 执行时间, 包括总时间, 平均时间, 最小, 最大时间, 时间占到总慢sql时间的百分比. 95% of Time, 去除最快和最慢的sql, 覆盖率占95%的sql的执行时间. Lock Time, 等待锁的时间. 95% of Lock , 95%的慢sql等待锁时间. Rows sent, 结果行统计数量, 包括平均, 最小, 最大数量. Rows examined, 扫描的行数量. Database, 属于哪个数据库 Users, 哪个用户,IP, 占到所有用户执行的sql百分比 Query abstract, 抽象后的sql语句 Query sample, sql语句

Linux下如何做整个硬盘的备份

在公司的几台相同的服务器上面要做同样的配置,和设置,我感觉每次做重复的操作还是比较麻烦的,就想用一个完全配置好的硬盘来做一个镜像,然后复制到其他的硬盘上面。我上网找了一些方法,感觉最省劲儿的还是使用dd命令。

这里我们的源硬盘为:/dev/sda 要备份到的目标盘为:/dev/sdb
我们需要有一张Livecd,因为如果你在源硬盘的系统上面做备份的话,你挂载的硬盘的proc和mnt分区会出现某些问题,为了安全期间,还是非常建议大家使用Livecd的。而且现在这种盘也非常多见,我就找了一张Ubuntu的6.06的盘来用。
1。首先修改bios中启动循序,使用live cd linux启动系统;
2.  进入系统后,为了跑的更快一些,我就切换到了终端模式下,使用这个命令需要root的权限,所以

$sudo dd if=/dev/hda of=/dev/hdc bs=1G count=250

Ubuntu的livecd的root密码为空,这里需要说明的是if表示源盘,of表示目标盘,bs是硬盘空间的容量的单位,你可以从byte,K,M,G中选择,我这里选择的是G,count表示的是你的容量有多大,我写的是250,表示硬盘容量为250G。然后直接回车就可以慢慢等了。

我这个250G的sata硬盘大概用了2小时40分钟,比你装系统的时间要长一些。但是你不用进行那些烦琐的配置了。

nginx报错”could not build the server_names_hash”

今天在给nginx添加几十个域名后,重启nginx的时候,报错”[emerg]: could not build the server_names_hash, you should increase either server_names_hash_max_size: 512 or server_names_hash_bucket_size: 128″

在nginx.conf配置文件的http{}把server_names_hash_bucket_size 128改为server_names_hash_bucket_size 512,按32的倍数往上加,再重启问题解决。

[root@localhost vhost]# /usr/local/nginx/sbin/nginx -t    [emerg]: could not build the server_names_hash, you should increase either server_names_hash_max_size: 512 or server_names_hash_bucket_size: 128 configuration file /usr/local/nginx/conf/nginx.conf test failed

[root@localhost vhost]# /usr/local/nginx/sbin/nginx -t    the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok configuration file /usr/local/nginx/conf/nginx.conf test is successful

最后查了下资料:

保存服务器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果 hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键值。因此,如果Nginx给出需要增大 hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.

什么是计算机线程?进程和线程两者有什么区别?

进程:

对应用程序来说,进程就像一个大容器。在应用程序被运行后,就相当于将应用程序装进容器里了,你可以往容器里加其他东西(如:应用程序在运行时所需的变量数据、需要引用的DLL文件等),当应用程序被运行两次时,容器里的东西并不会被倒掉,系统会找一个新的进程容器来容纳它。

  进程是由进程控制块、程序段、数据段三部分组成。一个进程可以包含若干线程(Thread),线程可以帮助应用程序同时做几件事(比如一个线程向磁盘写入文件,另一个则接收用户的按键操作并及时做出反应,互相不干扰),在程序被运行后中,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可以根据需要自行添加或删除相关的线程。
是可并发执行的程序。在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位,也是称活动、路径或任务,它有两方面性质:活动性、并发性。进程可以划分为运行、阻塞、就绪三种状态,并随一定条件而相互转化:就绪--运行,运行--阻塞,阻塞--就绪。

  进程为应用程序的运行实例,是应用程序的一次动态执行。看似高深,我们可以简单地理解为:它是操作系统当前运行的执行程序。在系统当前运行的执行程序里包括:系统管理计算机个体和完成各种操作所必需的程序;用户开启、执行的额外程序,当然也包括用户不知道,而自动运行的非法程序(它们就有可能是病毒程序)。
  危害较大的可执行病毒同样以“进程”形式出现在系统内部(一些病毒可能并不被进程列表显示,如“宏病毒”),那么及时查看并准确杀掉非法进程对于手工杀毒有起着关键性的作用。

进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是

死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种

功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;用户进程就是所有由你启动的进程。进程是操作系统进行资源分配的单位。

在Windows下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。
1.进程的引入:
多道程序在执行时,需要共享系统资源,从而导致各程序在执行过程中出现相互制约的关系,程序的执行表现出间断性的特征。这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,即我们无法从程序的字面上看出它何时执行,何时停顿,也无法看出它与其它执行程序的关系,因此,程序这个静态概念已不能如实反映程序并发执行过程的特征。为了深刻描述程序动态执行过程的性质,人们引入“进程(Process)”概念。
2.进程的概念:
进程的概念是60年代初首先由麻省理工学院的MULTICS系统和IBM公司的CTSS/360系统引入的。
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
操作系统引入进程的概念的原因:
从理论角度看,是对正在运行的程序过程的抽象;
从实现角度看,是一种数据结构,目的在于清晰地刻划动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。
3.进程的特征
动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块三部分组成。
4.进程与程序的关系
程序是指令的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。
进程更能真实地描述并发,而程序不能;进程是由程序和数据两部分组成的。
进程具有创建其他进程的功能,而程序没有。
同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程。也就是说同一程序可以对应多个进程。
在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单元都是进程。

Windows XP 常见的进程列表
[编辑本段]

1、最基本的系统进程
这些进程是系统运行的基本条件,有了这些进程,系统才能正常运行。

smss.exe Session Manager
csrss.exe 子系统服务器进程
winlogon.exe 管理用户登录
services.exe 包含很多系统服务
lsass.exe
管理IP安全策略以及启动ISAKMP/Oakley(IKE)和IP安全驱动程序。(系统服务)
产生会话密钥以及授予用于交互式客户/服务器验证的服务凭据(ticket)。(系统服务)
svchost.exe 包含很多系统服务
SPOOLSV.EXE 将文件加载到内存中以便迟后打印。(系统服务)
explorer.exe 资源管理器
internat.exe 托盘区的拼音图标

2、附加的系统进程
这些进程不是必要的,你可以根据需要通过服务管理器来增加或减少
mstask.exe 允许程序在指定时间运行。(系统服务)
regsvc.exe 允许远程注册表操作。(系统服务)
winmgmt.exe 提供系统管理信息(系统服务)。
inetinfo.exe
通过 Internet 信息服务的管理单元提供 FTP 连接和管理。(系统服务)
tlntsvr.exe
允许远程用户登录到系统并且使用命令行运行控制台程序。(系统服务)
允许通过Internet信息服务的管理单元管理 Web 和 FTP 服务。(系统服务)

tftpd.exe
实现TFTP Internet标准。该标准不要求用户名和密码。远程安装服务
的一部分。(系统服务)
termsrv.exe
提供多会话环境允许客户端设备访问虚拟的Windows 2000 Professional 桌面会话以及运行在服务器上的基于Windows的程序。(系统服务)
dns.exe 应答对域名系统(DNS)名称的查询和更新请求。(系统服务)

3、不常用服务
以下服务很少会用到,上面的服务都对安全有害,如果不是必要的应该关掉
tcpsvcs.exe 提供在PXE可远程启动客户计算机上远程安装 Windows 2000
Professional 的能力。(系统服务)
支持以下 TCP/IP 服务Character Generator,Daytime,Discard,Echo,以及Quote of the Day。(系统服务)
ismserv.exe
允许在Windows Advanced Server站点间发送和接收消息。(系统服务)
ups.exe
管理连接到计算机的不间断电源(UPS)。(系统服务)
wins.exe
为注册和解析NetBIOS型名称的TCP/IP客户提供NetBIOS名称服务。(系统服务)
llssrv.exe License Logging Service(system service)
ntfrs.exe 在多个服务器间维护文件目录内容的文件同步。(系统服务)
RsSub.exe 控制用来远程储存数据的媒体。(系统服务)
locator.exe 管理 RPC 名称服务数据库。(系统服务)
lserver.exe 注册客户端许可证。(系统服务)
dfssvc.exe 管理分布于局域网或广域网的逻辑卷。(系统服务)
clipsrv.exe
支持“剪贴簿查看器”,以便可以从远程剪贴簿查阅剪贴页面。(系统服务)
msdtc.exe
并列事务,是分布于两个以上的数据库,消息队列,文件系统,或其它事务保护资源管理器。(系统服务)
faxsvc.exe 帮助您发送和接收传真。(系统服务)
cisvc.exe Indexing Service(system service)
dmadmin.exe 磁盘管理请求的系统管理服务。(系统服务)
mnmsrvc.exe
允许有权限的用户使用NetMeeting远程访问Windows桌面。(系统服务)
netdde.exe
提供动态数据交换(DDE)的网络传输和安全特性。(系统服务)
smlogsvc.exe 配置性能日志和警报。(系统服务)
rsvp.exe
为依赖质量服务(QoS)的程序和控制应用程序提供网络信号和本地通信控制
安装功能。(系统服务)
RsEng.exe
协调用来储存不常用数据的服务和管理工具。(系统服务)
RsFsa.exe 管理远程储存的文件的操作。(系统服务)
grovel.exe
扫描零备份存储(SIS)卷上的重复文件,并且将重复文件指向一个数据存
储点,以节省磁盘空间。(系统服务)
SCardSvr.exe
对插入在计算机智能卡阅读器中的智能卡进行管理和访问控制。(系统服务)
snmp.exe
包含代理程序可以监视网络设备的活动并且向网络控制台工作站汇报。(系
统服务)
snmptrap.exe
接收由本地或远程SNMP代理程序产生的陷阱消息,然后将消息传递到运行在这台计算机上SNMP管理程序。(系统服务)
UtilMan.exe 从一个窗口中启动和配置辅助工具。(系统服务)
msiexec.exe
依据.MSI文件中包含的命令来安装、修复以及删除软件。(系统服务)

线程:
线程
开放分类: 编程、CPU、计算机软件

是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。
线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU
线程的周期
新建 就绪 运行 阻塞 死亡
线程调度与优先级
有线程进入了就绪状态,需要有线程调度程序来决定何时执行,根据优先级来调度.
线程组
每个线程都是一个线程组的一个成员,线程组把多个线程集成一个对象,通过线程组可以同时对其中的多个线程进行操作.在生成线程时必须将线程放在指定的线程组,也可以放在缺省的线程组中,缺省的就是生成该线程的线程所在的线程组.一旦一个线程加入了某个线程组,不能被移出这个组.
守护线程
是特殊的线程,一般用于在后台为其他线程提供服务


------------
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
参考资料:http://zhidao.baidu.com/question/6157299.html


------------------
说法一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行

说法二:进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

线程的划分尺度小于进程,使得多线程程序的并发性高。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

说法三:多线程共存于应用程序中是现代操作系统中的基本特征和重要标志。用过UNIX操作系统的读者知道进程,在UNIX操作系统中,每个应用程序的执行都在操作系统内核中登记一个进程标志,操作系统根据分配的标志对应用程序的执行进行调度和系统资源分配,但进程和线程有什么区别呢?

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

线程的划分尺度小于进程,使得多线程程序的并发性搞。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程(Process)是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例,进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统对应用程序进程的控制来实现的。

C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。这时,处在可执行状态中的应用程序称为进程。从用户角度来看,进程是应用程序的一个执行过程。从操作系统核心角度来看,进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体。多任务环境下应用程序进程的主要特点包括:

●进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间;

●进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型;

●从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。

在Unix操作系统启动过程中,系统自动创建swapper、init等系统进程,用于管理内存资源以及对用户进程进行调度等。在Unix环境下无论是由操作系统创建的进程还要由应用程序执行创建的进程,均拥有唯一的进程标识(PID)。

说法四:应用程序在执行过程中存在一个内存空间的初始入口点地址、一个程序执行过程中的代码执行序列以及用于标识进程结束的内存出口点地址,在进程执行过程中的每一时间点均有唯一的处理器指令与内存单元地址相对应。

Java语言中定义的线程(Thread)同样包括一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。但是进程与线程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流。

Unix操作系统和Microsoft Windows操作系统支持多用户、多进程的并发执行,而Java语言支持应用程序进程内部的多个执行线程的并发执行。多线程的意义在于一个应用程序的多个逻辑单元可以并发地执行。但是多线程并不意味着多个用户进程在执行,操作系统也不把每个线程作为独立的进程来分配独立的系统资源。进程可以创建其子进程,子进程与父进程拥有不同的可执行代码和数据内存空间。而在用于代表应用程序的进程中多个线程共享数据内存空间,但保持每个线程拥有独立的执行堆栈和程序执行上下文(Context)。

基于上述区别,线程也可以称为轻型进程 (Light Weight Process,LWP)。不同线程间允许任务协作和数据交换,使得在计算机系统资源消耗等方面非常廉价。

线程需要操作系统的支持,不是所有类型的计算机都支持多线程应用程序。Java程序设计语言将线程支持与语言运行环境结合在一起,提供了多任务并发执行的能力。这就好比一个人在处理家务的过程中,将衣服放到洗衣机中自动洗涤后将大米放在电饭锅里,然后开始做菜。等菜做好了,饭熟了同时衣服也洗好了。

需要注意的是:在应用程序中使用多线程不会增加 CPU 的数据处理能力。只有在多CPU 的计算机或者在网络计算体系结构下,将Java程序划分为多个并发执行线程后,同时启动多个线程运行,使不同的线程运行在基于不同处理器的Java虚拟机中,才能提高应用程序的执行效率。

计算机必知必会:进程process与线程thread

进程和线程这对概念的理解也是很难的,至今网络上可查的资料对其的理解出入都挺大,在不同的操作系统中,如linux和windows中,其概念和实现都是有出入的。因此,我在这里结合我自己的理解谈下这两个概念,讲的都是一般性的概念,并且主要是基以WINDOWS的。

一般将进程定义为一个正在运行的程序的实例。我们在任务管理器重所看到的每一项,就可以理解为一个进程,每个进程都有一个地址空间,这个地址空间里有可执行文件的代码和数据,以及线程堆栈等。一个程序至少有一个进程。进程可以创建子进程,创建的子进程可以和父进程一起工作,也可以独立运行。

而线程是隶属于进程的,也就是说,线程是不能单独存在的,线程存在于进程中。每个进程至少有一个主线程,进程里的线程就负责执行进程里的代码,这也叫做进程的“惰性”。线程所使用的资源是它所属的进程的资源。线程也有自己的资源,主要组成部分就是一些必要的计数器和线程栈,占用的资源很少。我们可以理解为进程就是个容器,而线程才是真正干活的。线程可以在内核空间实现,也可以在用户空间实现。

这里特别提一下linux,在linux中,每一个进程都必须有一个父进程(如果没有父进程,则把PID=1的根进程作为其父进程)。进程退出了,就成了僵尸进程,等待父进程的退出信号,如果父进程没有给他发信号,得给他找一个父进程,或者等待内核自动销毁。Linux内核只提供了轻量进程的支持,限制了更高效的线程模型的实现,但Linux着重优化了进程的调度开销,使得linux进程切换开销较小。所以linux系统没有真正意义上的线程机制。linux中,Linux线程是通过进程来实现,进程和线程是同一个层次的。(我这里提到的是基于linux 2.6 内核的,在最新的LINUX中,对线程的实现做了优化,但是还是基于进程的。有些linux实现了新的线程机制,但主流还是和我描述的一样)

进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这也是进程和线程的重要区别。

比如,windows中的explorer就是资源管理器进程,我们每打开一个窗口,这个进程就会创建一个线程。有上面的描述,我们可以知道,进程有独立的地址空间,多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。

在第一节中,我提到过,“并发!=多线程“,是的。如Unix操作系统和Windows操作系统支持多用户、多进程的并发执行,而Java这样的语言支持应用程序进程内部的多个执行线程的并发执行。我们知道,php在语法上是没有多线程这个概念的,那java/NET的多线程是怎么实现的。实际上,java只是通过native方法调用操作系统API来创建多线程而已。另外,我们经常说某个网站并发是多少多少,nginx是高并发服务器了。这里的并发和我前面的并发概念是不同的。要想做到高并发,除了多线程等的实现,还需要各种好的IO机制,不然线程再多也没用,资源利用跟不上来。高并发又跟同步、异步等IO复用机制有了牵连。

下面列举一下进程和线程中的一些概念。

进程:创建,销毁,创建子进程(fork),优先级。
线程:创建,挂起,恢复,销毁,切换,协作,睡眠,唤醒,等待,同步,锁,优先级。
从上面的描述,基本可以理清进程和线程的关系了。最后总结下:

linux没有内核上的多线程实现,但是不能说linux没有多线程。WINDOWS有内核的多线程实现。
进程开销大,线程开销小,但是linux的进程和线程开销差异不明显。
并行的实现离不开多线程。
再留个悬念,多线程的实现和运行还会涉及到同步异步,原子性等概念。这些概念是相互交叉的,这里先不做深入。

tcpdump

tcpdump -i eth0 -l -s 0 -w - dst port 80 | strings|egrep -i "^GET|^Host|^x-forwarded-for"