如何编写高性能的网络服务器

2009-05-13 07:11:08来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

Scalable Network Programming
Or: The Quest For A Good Web Server (That Survives Slashdot)
Scalable Network Programming
Felix von Leitner
felix-linuxkongress@fefe.de
qyb@eyou.net 翻译 2003-10-16
简述
如何编写高性能的网络服务器 ? 怎样编写能维持10000个连接的网络服务器  ?瓶颈在哪里 怎么避免它们呢 ?

Why care about high performance network code
大多数情况下Apache已经足够用了
但如果你经常上Slashdot,你会发现链接的站点经常无法访问,因为它们无法处理这么
大的负载Slashdot使用8台P3/600,1G内存,1万转的SCSI硬盘
www.heise.de
使用4台P3/650,1G内存(译者注:从下文看似乎这是德国的大网站)
ftp.fu-berlin.de是一台SGI Origin 200,包括2个R10k/225,1G内存,1万转
SCSI硬盘(译者注:似乎是原作者维护的一台FTP)
当然可以通过购买硬件获得更高的性能,但我们如何才能确认软件不是瓶颈呢 ?
Why is it important to handle many connections
我曾经受理过一起网络玩具店的求助,那是12月份的一个雨天,圣诞期间的销售量比平时要大得多据他们说web服务器受到了攻击,某种类型的分布式攻击产生了10万个web连接,结果导致了每台机器出现了2万个apache进程,性能急剧恶化此时不可能再销售任何商品我估计他们担心会因此破产
First, let's write a web client:
char buf[4096];//4 x 1024
int len;
int fd=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_in si;
si.sin_family=PF_INET;
inet_aton("127.0.0.1",&si.sin_addr);
si.sin_port=htons(80);
connect(fd,(struct sockaddr*)si,sizeof(si));
write(fd,"GET / HTTP/1.0\r\n\r\n");
len=read(fd,buf,sizeof(buf));
close(fd);
That's it
当然,上述代码还不够完善
1. 我没有#include任何头文件
2. 缺乏错误处理
3. 客户端仅仅读取4k数据
4. 并没有请求真实的URL
除了这几个地方,这段代码可说是一个相当精致的程序
OK, then let's write a web server!
int cfd,fd=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_in si;
si.sin_family=PF_INET;
inet_aton("127.0.0.1",&si.sin_addr);
si.sin_port=htons(80);
bind(fd,(struct sockaddr*)si,sizeof(si));
listen(fd);
while ((cfd=accept(fd,(struct sockaddr*)si,sizeof(si)) != -1) {
read_request(cfd); /* read(cfd,...) until "\r\n\r\n" */
write(cfd,"200 OK HTTP/1.0\r\n\r\n"
"That's it. You're welcome.",19+27);
close(fd);
}
This server sucks!!!
上述服务器代码除了还没有实现真正的协议以外,尚存在的一个问题就是只能处理一个
客户端请求.下面再修改一下:
while ((cfd=accept(fd,(struct sockaddr*)si,sizeof(si)) != -1) {
if (fork()>0) continue; /* handle connection in a child process */
read_request(cfd); /* read(cfd,...) until "\r\n\r\n" */
write(cfd,"200 OK HTTP/1.0\r\n\r\n"
"That's it. You're welcome.",19+27);
close(fd);
exit(0);
}
One process per connection – is that a good idea
对于每一个客户请求连接创建一个进程处理绝对有可伸缩性(scalability)的问题
实现一个良好的fork()是非常困难的.我们写一个程序来做基准测试:

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:FreeBSD 的kqueue

下一篇:并发编程..