高并发WEB服务器设计

目标:考虑设计一个高并发WEB服务器框架,有哪些惯用的手法?希望在本篇文章给出一个标准答案。

关键词: 迭代模型,并发模型,I/O多路复用,线程池,协程

参考:Apache/MySQL,Nginx,

待补充:Redis的线程模型


只有将一个连接的交互流程划分地足够细,才能做到高并发,这是一项细节的技术。

WEB服务器步骤:

1. accept

2. read:又称为recv

3. decode:反序列化

4. compute:并不一定是计算,也可能是读写文件、读写数据库等I/O操作。

5. encode:序列化

6. write:又称为send


性能瓶颈:

1. read

2. compute


网络事件无非如下:

1. accept:新连接

2. read:连接可读

3. 连接可写

4. 连接断开


WEB服务器编程模型:

1. 迭代模型:串行;

2. 并发模型:Apache/MySQL模型;

3. 多路复用模型;

4. “多路复用+并发”模型:Nginx/Muduo模型;


惯用手法(简称“三板斧”):

1. 并发:开多个进程或线程,充分利用多核CPU的优势;

2. 多路复用:让内核告诉我们哪个连接可读了,减少阻塞在读socket上的时间,提高CPU的利用率;

3. 事件机制(即协程思想):这个名词来自于Nginx,可以认为是多路复用的升级版,就是把其他可能阻塞的事件也放进多路复用里,让进程(或线程)一直处在忙碌状态,更进一步地提高CPU的利用率。


各个模型的线程/进程模型:

1. 迭代模型:毫无疑问是单线程(进程);

2. 并发模型:多线程(进程),数量没有上限,来多少个连接就开多少线程,导致CPU忙于上下文切换;

3. 多路复用模型:单线程(进程),没有利用CPU多核的优点,浪费资源;

4. 并发+多路复用:固定数量的多线程,数量通常是根据CPU的核数进行推算,Nginx就是这样做的。

【参考文献】

1. Richard Stevens

2. 陈硕

猜你喜欢

转载自blog.csdn.net/iliveido_foxmail/article/details/80304615