目标:考虑设计一个高并发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. 陈硕