从零开始一个http服务器(六)-多路复用和压力测试

代码地址 : https://github.com/flamedancer/cserver

git checkout step6

运行:

make clean && make && ./myserver.out

测试

浏览器打开 http://127.0.0.1:9734/action/show_date

多路复用和压力测试

  • 多路复用
  • 压力测试

多路复用

多路复用意义

到目前为止,服务器的基本业务功能我们是实现了。但好的服务器不止要能完成业务逻辑,没有好的执行效率和高的并发数,根本无法在生成环境中使用。现在我们开始考虑优化我们的服务器使之接近能应付生成环境的水平。

提高服务器性能有很多方法,我们先来考虑第一个改进,采用多路复用。

我们之前的程序,当server_sockfd accpet 一个 client_sockfd 后,程序read等待client_sockfd发来的数据,

然后再解析request。然而如果client_sockfd迟迟不发送数据,我们的程序就卡在read上,后面客户端发的请求全部无法响应了。"多路复用"可以简单理解为“谁有事执行谁”, 运用多路复用可以解决上面这个问题。当accpet 一个 client_sockfd后,将client_sockfd放在一个事件池中,直到事件池察觉这个client_sockfd可以read了,才对这个client_sockfd进行read操作。

步骤可以总结为

1. 创建事件池
2. 创建事件,将事件加入到事件池
3. 事件池监测所有事件,若有事件被触发,执行被触发事件的后续逻辑

多路复用封装

由于mac和linux所用的事件复用库不一样,mac下为kqueue,linux下为epoll,为了兼容性,我们封装了一个事件库poll.h。

主要结构体和函数为:

1 . 事件池结构体
struct PollEvent {
int epfd;
void * eventItems;
int maxEventCnt;
};

epfd 为事件池句柄

eventItems 当前被触发的事件数组

maxEventCnt 为最大可容纳被触发事件数

2 . 添加事件
void updateEvents(struct PollEvent* event, int fd, int eventFLags, int modify, void* udata);

event 事件池

fd 需要监听的句柄

eventFLags 需要监听fd的什么事件 我们初略的只定义读和写事件

#define Readtrigger 1
#define Writetrigger 2
#define Emptytrigger 0

modify 如果为 0 时 为fd添加eventFLags事件, 为1时 修改fd的事件为eventFLags

3. 监听事件池

当有事件被触发时返回被触发的事件数,被触发的事件放在event->eventItems里

int doPoll(struct PollEvent* event);

修改main函数

  1. 创建事件池
  2. 将sever_socket read 事件加入事件池
  3. 监听事件池
  4. 当事件池发现有触发的事件时,判断触发的事件类型:
    1. 若为 sever_socket read 事件,创建client_socket, 将client_socket read 事件加入事件池
    2. 若为 client_socket read 事件, 解析reques,生成 response,并将client_socket write 事件加入事件池
    3. 若为 client_socket write 事件, 将response写入client_socket,关闭client_socket(事件池会清理关闭了的fd)
  5. 继续第4步

压力测试

ab -c 5 -n 2000 http://127.0.0.1:9734/action/show_date

Concurrency Level:      5
Time taken for tests: 14.089 seconds
Complete requests: 2000
Failed requests: 0
Total transferred: 218000 bytes
HTML transferred: 58000 bytes
Requests per second: 141.95 [#/sec] (mean)
Time per request: 35.223 [ms] (mean)
Time per request: 7.045 [ms] (mean, across all concurrent requests)
Transfer rate: 15.11 [Kbytes/sec] received Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 10 35 14.6 38 83
Waiting: 10 35 14.6 38 83
Total: 10 35 14.6 39 83

我们用ab测试5并发总共2000个/show_date请求,可以看到 平均每个请求花费35毫秒。下一节我们将采用线程池技术来继续改进我们的执行效率。

从零开始一个http服务器(六)-多路复用和压力测试的更多相关文章

  1. 从零开始一个http服务器(五)-模拟cgi

    从零开始一个http服务器-模拟cgi(五) 代码地址 : https://github.com/flamedancer/cserver git checkout step5 运行: make cle ...

  2. 从零开始一个http服务器(三)-返回response 构造

    从零开始一个http服务器(三) 代码地址 : https://github.com/flamedancer/cserver git checkout step3 运行: gcc request.h ...

  3. 从零开始一个http服务器(二)-请求request解析

    从零开始一个http服务器 (二) 代码地址 : https://github.com/flamedancer/cserver git checkout step2 解析http request 观察 ...

  4. 从零开始一个http服务器(一)-开始

    从零开始一个http服务器 (一) 代码地址 : https://github.com/flamedancer/cserver git checkout step1 一个简单的socket serve ...

  5. 从零开始一个http服务器(四)-动态返回

    从零开始一个http服务器(四) 代码地址 : https://github.com/flamedancer/cserver git checkout step4 运行: make clean &am ...

  6. Pylot网站Web服务器性能和负载压力测试-适用Windows可绘制图表

    为了能够准确地评估网站服务器对网络流量的承受能力,我们一般会采取模拟网站用户访问,通过不断地增加并发数,延长访问时长,从而最终得出网站Web服务器的性能和负载能力.当然也可以通过Web压力测试,来完善 ...

  7. 一个基于.NET平台的自动化/压力测试系统设计简述

    AutoTest系统设计概述 AutoTest是一个基于.NET平台实现的自动化/压力测试的系统,可独立运行于windows平台下,支持分布式部署,不需要其他配置或编译器的支持.(本质是一个基于协议的 ...

  8. 九款Web服务器性能压力测试工具

    一.http_load 程序非常小,解压后也不到100Khttp_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会 ...

  9. Web服务器压力测试一例

    近期部门新上线一个服务,我们使用ab和locust分别测试 目前项目属于demo阶段,对访问量的支持不要求太高,我们暂且设定在500请求,20并发 工具介绍 ab ab全称为:Apache HTTP ...

随机推荐

  1. centos yum升级php

    centos yum升级php5.3.3到最5.6.3 不要轻易升级,否则后果很严重! 注意事项: 1 升级后之前的php扩展不会丢失 自动会安装对应最新php的扩展2 升级后需重启下apache 才 ...

  2. Python实例---抽屉后台框架分析

    1.1. 抽屉框架分析 --登陆注册分析 1.2. 前台获取form表单补充知识: <!DOCTYPE html> <html lang="en"> < ...

  3. lvs安装文档

    安装lvs应用模块 1.安装依赖包: [root@client lvs]# yum -y install ipvs* 2.验证本机ip_vs模块是否加载 [root@client lvs]# -.el ...

  4. python取当前时间前后一定间隔的时间点

    当前时间 datetime.datetime.now() 时间间隔 datetime.timedelta(参数=数值) #参数:weeks,days,hours,minutes,seconds,mic ...

  5. Pygame播放声音与音效

    简单学习自小甲鱼视频教学(笔记) 实现功能: 运行后自动播放背景音乐,单击左键播放音效①,单击右键播放音效②, 空格键控制暂停背景音乐与恢复背景音乐,并且实现播放图标的切换. 代码如下: import ...

  6. python,dict的setdefault方法

    @dict的setdefault方法 先看看文档中的解释 setdefault(...)    D.setdefault(k[,d]) -> D.get(k,d), also set D[k]= ...

  7. 超慢速移动动画使用CSS3实现流畅效果

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVpbGVpZm9yZXZlcg==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  8. P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…

    题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...

  9. Odoo启动配置文件

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9278687.html 1:--xmlrpc-port=<端口> 命令选项充许我们将服务器实例的侦听 ...

  10. No.4 - 3D 空间的卡片翻转动效

    参考 ①张鑫旭http://www.zhangxinxu.com/wordpress/2012/09/css3-3d-transform-perspective-animate-transition/ ...