tiny_http_server
项目地址:https://github.com/hangxin001/tiny_http_server
磕磕叨叨
本次项目算是对知识的一次总结吧。一开始模块的规划还是清晰的,但后面就有点小乱了。果然想做到优雅的编程还是困难的。
默认目录为二进制文件下的./www
特性:
- Reactor模型
- 基于epoll的多路复用
- 支持Get,Post,Head三种请求方法,同时支持浏览缓存(IMS头)
- 可自动增长的缓冲区
- 基于priority_queue与shared_prt的应用层定时器
Class
- Epoll:封装epoll
- Thread Pool:轻量线程池
- Http Server:管理线程池,定时器,并分配任务
- Http Request:解析http请求报文
- Http Response:响应http请求
- Buffer:缓存区类(参考了muduo的buffer)
- Timer:基于优先队列的应用层定时器
压力测试
- siege c10k 通过
- 电脑测试到20k左右,压力测试软件并发上不去了。
硬件环境:
- I7 9400f
- RAM 16G
软件环境
- gentoo
- g++ 10.2
- LinuxKernel 5.8
Bug
Not Modified报文,TTFB时间无论什么情况都会固定在500ms。
原因:chrome计算TTFB时间方式的不同。首先服务器设定500ms是主动断开时间。同过抓包就能发现回应报文时间正常。但chrome收到服务端的Not Modified(304)报文后并没有结束TTFB的计时。直到tcp连接关闭,又因为服务端设置500ms后超时主动关闭连接,所以TTFB时间会固定在500ms。但是奇怪的是在非Not Modified报文下,chrome不会等待到tcp流的关闭,而是只要收到相应的数据就停止计时。