从零开始一个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. 进制转换excel版

  2. 远程登录与文件传输指令——ssh与scp

    远程登录指令 ssh ssh 是一个用于登录远程主机并在远程主机上执行命令的程序.ssh 设计的本意在于在一个不确定的网络环境下为两个互不信任的主机提供加密通信功能.在 Linux 桌面版本上,一般内 ...

  3. CSS加载性能优化

    将首屏页面要用到的CSS文件,放在页面头部加载,其他模块的CSS可以使用异步加载:loadCSS 和 Preload. 关于preload,推进2篇文章给大家看下: 1.通过rel="pre ...

  4. mysql-存储过程(转载)

    本来想自己写存储过程的,但是看到别人写的很全面,就直接转载过来了. 转自(http://www.cnblogs.com/exmyth/p/3303470.html) 14.1.1 创建存储过程 MyS ...

  5. jq复制到剪切板插件clipboard.min.js(兼容IE9)

    /*! * clipboard.js v1.5.5 * https://zenorocha.github.io/clipboard.js * * Licensed MIT 漏 Zeno Rocha * ...

  6. python with原型

    @Python 的 with 语句详解   这篇文章主要介绍了Python 的 with 语句,本文详细讲解了with语句.with语句的历史.with语句的使用例子等,需要的朋友可以参考下   一. ...

  7. 激活pycharm

    1. 修改hosts文件: 添加下面一行到hosts文件,目的是屏蔽掉Pycharm对激活码的验证**0.0.0.0 account.jetbrains.com ** windwos系统hosts文件 ...

  8. [CQOI2017]小Q的表格

    题目 神仙题,神仙题 这是一道很适合盯着发呆的题目 看到这个规律 \[ f(a,b)=f(b,a) \] \[ b\times f(a,a+b)=(a+b)\times f(a,b) \] 这也没什么 ...

  9. first-child伪类选择器

    原文链接地址:https://www.cnblogs.com/wangmeijian/p/4562304.html :first-child 选择器用于选取属于其父元素的首个子元素的指定选择器.——w ...

  10. Spring Boot与Mybatis 借助Fastjson快速完成数据解析入库

    通过Spring Boot可以快速搭建一个项目结构,在此基础上本文就通过一个简单的例子,说明如何结合Mybatis 和 Fastjson,快速的完成一个数据的入库基本操作. 添加相关的依赖 <d ...