c++ http服务器之Apache工具ab压力测试(nginx与brpc)

article/2025/8/29 19:54:14

系列服务器开发


文章目录

  • 系列服务器开发
  • 前言
  • 一、ab是什么?
  • 二、ab测试实例nginx
    • 1.nginx环境准备与安装
    • 2.ab测试nginx本身的性能
    • 3.ab测试基于brpc的http服务器性能
  • 三、ab实战之常见问题解决
  • 总结


前言


一、ab是什么?

ab全称为:apache bench,官方注释为:
Apache超文本传输协议(HTTP)的性能测试工具。其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求。apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。

其他几款轻量级的压测工具如siege http_load ab webbench.siege等都太吃内存(在相同的请求数与并发数下,ab相对而言耗资源较少)。

centos安装ab

安装:
centos安装:
yum install httpd-tools
linux安装:
apt-get install apache2-utils测试方法
./ab [options] [url]ab常用参数的介绍:
-n:总共的请求执行数,缺省是1-c:并发数,缺省是1-t:测试所进行的总时间,秒为单位,缺省50000s
-p:POST时的数据文件(本地存储json文件等)
-w: 以HTML表的格式输出结果
-T:payload数据格式'application/json':
ab -n 200 -c 10 "http://jd.com/":
ab -n 200 -c 100 http://localhost/index.html

在这里插入图片描述

ab测试返回结果字段解析

Server Software:        web服务器软件及版本
Server Hostname:        请求的地址
Server Port:            请求的端口Document Path:          请求的页面路径
Document Length:        页面大小Concurrency Level:      并发数
Time taken for tests:   测试总共花费的时间
Complete requests:      完成的请求数
Failed requests:        失败的请求数
Write errors:           写入错误
Total transferred:      总共传输字节数,包含http的头信息等
HTML transferred:       html字节数,实际的页面传递字节数
Requests per second:    每秒处理的请求数,服务器的吞吐量(重要)
Time per request:       平均数,用户平均请求等待时间
Time per request:       服务器平均处理时间
Transfer rate:          平均传输速率(每秒收到的速率)

二、ab测试实例nginx

1.nginx环境准备与安装

1、安装nginx
2、登陆http://192.168.31.91或者http://localhost/index.html, 页面如下表示安装成功
在这里插入图片描述
3、nginx conf内容如下
默认:
1 worker_processes
1024 worker_connections

[root@localhost conf]# cat nginx.conf#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';#access_log  logs/access.log  main;sendfile        on;#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;#gzip  on;server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {root   html;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

2.ab测试nginx本身的性能

服务器上本机测试:连接数200000 ,请求数1000
ab -n 200000 -c 1000 http://localhost/index.html
测试结果如下(后面不在贴所有信息):

[root@localhost conf]# ab -n 200000 -c 1000 http://localhost/index.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking localhost (be patient)
Completed 20000 requests
Completed 40000 requests
Completed 60000 requests
Completed 80000 requests
Completed 100000 requests
Completed 120000 requests
Completed 140000 requests
Completed 160000 requests
Completed 180000 requests
Completed 200000 requests
Finished 200000 requestsServer Software:        nginx/1.20.0
Server Hostname:        localhost
Server Port:            80Document Path:          /index.html
Document Length:        612 bytesConcurrency Level:      1000
Time taken for tests:   8.144 seconds
Complete requests:      200000
Failed requests:        128(Connect: 0, Receive: 0, Length: 64, Exceptions: 64)
Write errors:           0
Total transferred:      168945920 bytes
HTML transferred:       122360832 bytes
Requests per second:    24557.34 [#/sec] (mean)
Time per request:       40.721 [ms] (mean)
Time per request:       0.041 [ms] (mean, across all concurrent requests)
Transfer rate:          20258.11 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0   30 193.1      5    3013
Processing:     2    7   9.5      7     412
Waiting:        0    6   9.4      5     411
Total:          4   37 195.5     12    3415Percentage of the requests served within a certain time (ms)50%     1266%     1375%     1380%     1490%     1595%     1798%   101399%   1017100%   3415 (longest request)

nginx,默认worker_connections =1024,因此并发只能支持到1000左右
并发1000(Concurrency Level: 1000) 发送并完成200000请求(Complete requests: 200000) 失败的次数很少(Failed requests: 128),发送200000个请求总耗时20s(Time taken for tests: 8.144 seconds),那么qps大概为 24557

Concurrency Level:      1000
Time taken for tests:   8.144 seconds
Complete requests:      200000
Failed requests:        128(Connect: 0, Receive: 0, Length: 64, Exceptions: 64)
Write errors:           0
Requests per second:    24557.34 [#/sec] (mean)
Time per request:       40.721 [ms] (mean)
Time per request:       0.041 [ms] (mean, across all concurrent requests)

服务器上本机测试:连接数200000 ,请求数5000
ab -n 200000 -c 5000 http://localhost/index.html
测试结果如下:
nginx,默认worker_connections =1024,因此并发只能支持到1000左右
并发5000(Concurrency Level: 5000) 发送并完成200000请求(Complete requests: 200000) 失败的次数很少(Failed requests: 8128),发送200000个请求总耗时10s(Time taken for tests: 10.126 seconds),那么qps大概为 19751。
发现并发增大失败的请求增多(128->8128),且qps有所降低。

Concurrency Level:      5000
Time taken for tests:   10.126 seconds
Complete requests:      200000
Failed requests:        8128(Connect: 0, Receive: 0, Length: 4064, Exceptions: 4064)
Write errors:           0
Requests per second:    19751.38 [#/sec] (mean)
Time per request:       253.147 [ms] (mean)
Time per request:       0.051 [ms] (mean, across all concurrent requests)

通过ab对nginx的默认页面测试,tps可以支持到20000左右。并发目前由于并发设置的为1024.此时cpu已经满负荷,理论上nginx并发可以支持到10w个,设置更高.
关于Nginx的一些优化(突破十万并发)

3.ab测试基于brpc的http服务器性能

::vss::ResultCode StreamAdd(const ::vss::StreamAddReq* request,::vss::StreamAddRsp* response)
{::vss::ResultCode res = ::vss::ResultCode::success;//bthread_usleep(1000*1000);//sleep(1);++count;if(time(NULL) - timestart > 1){LOG(INFO)<< "every sec average: "<< count/1;count = 0;timestart = time(NULL);}    return res;
}

ab -n 1000000 -kc 1000 http://192.168.31.91:8001/app/vss/streamAdd
发现qps为10w左右,

Concurrency Level:      1000
Time taken for tests:   10.981 seconds
Complete requests:      1000000
Failed requests:        0
Write errors:           0
Keep-Alive requests:    1000000
Total transferred:      87000000 bytes
HTML transferred:       24000000 bytes
Requests per second:    91068.25 [#/sec] (mean)
Time per request:       10.981 [ms] (mean)
Time per request:       0.011 [ms] (mean, across all concurrent requests)
Transfer rate:          7737.24 [Kbytes/sec] received

在接口中加入1s的延时,且必须使用bthread_usleep,不会阻塞bthread。tps为800+

::vss::ResultCode StreamAdd(const ::vss::StreamAddReq* request,::vss::StreamAddRsp* response)
{::vss::ResultCode res = ::vss::ResultCode::success;bthread_usleep(1000*1000);//sleep(1);return res;
}

ab -n 10000 -kc 1000 http://192.168.31.91:8001/app/vss/streamAdd

Concurrency Level:      1000
Time taken for tests:   12.160 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Keep-Alive requests:    10000
Requests per second:    822.36 [#/sec] (mean)
Time per request:       1216.009 [ms] (mean)
Time per request:       1.216 [ms] (mean, across all concurrent requests)

在接口中加入2s的延时,且必须使用bthread_usleep,不会阻塞bthread。tps为400+

::vss::ResultCode StreamAdd(const ::vss::StreamAddReq* request,::vss::StreamAddRsp* response)
{::vss::ResultCode res = ::vss::ResultCode::success;bthread_usleep(2*1000*1000);//sleep(1);return res;
}

ab -n 10000 -kc 1000 http://192.168.31.91:8001/app/vss/streamAdd

Concurrency Level:      1000
Time taken for tests:   24.106 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Keep-Alive requests:    10000
Requests per second:    414.83 [#/sec] (mean)
Time per request:       2410.631 [ms] (mean)
Time per request:       2.411 [ms] (mean, across all concurrent requests)
Transfer rate:          35.24 [Kbytes/sec] received

在接口中加入1s的延时,且必须使用sleep,会阻塞bthread。tps为8+

::vss::ResultCode StreamAdd(const ::vss::StreamAddReq* request,::vss::StreamAddRsp* response)
{::vss::ResultCode res = ::vss::ResultCode::success;sleep(1);return res;
}
ab -n 100 -kc 10 http://192.168.31.91:8001/app/vss/streamAdd
```cpp
Concurrency Level:      10
Time taken for tests:   12.032 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Keep-Alive requests:    100
Requests per second:    8.31 [#/sec] (mean)
Time per request:       1203.191 [ms] (mean)
Time per request:       120.319 [ms] (mean, across all concurrent requests)
Transfer rate:          0.71 [Kbytes/sec] received

三、ab实战之常见问题解决

测试中出现too many open files,提供一种临时的解决版本,如需设置生效的话,请自行查询资料。
ulimit -n 可以发现系统默认是1024,可以将文件句柄增大。
ulimit -n 65535 可以将系统最大打开文件数临时修改为65535,退出登录失效。
在这里插入图片描述
测试中出现apr_socket_recv: Connection reset by peer 提供一种临时方案
解释:查看应用服务器和数据库均未报错,连接被重置,apr_socket_recv是OS内核的一个参数,高并发情况下,内核会认为系统受到了SYN flood***,会发送cookies(possible SYN flooding on port 80. Sending cookies),这样会减慢影响请求的速度,所以在应用服务器上设置下该参数为0 禁用系统保护就可进行大并发测试了。

进入/etc/sysctl.conf
net.ipv4.tcp_syncookies = 0 ##禁用系统保护
sysctl -p ##查看是否成功
在这里插入图片描述


总结

通过本文对ab的实战练习,应该对ab有了基本的了解,希望能够对你的工作有所帮助。


http://chatgpt.dhexx.cn/article/BT83Gjg8.shtml

相关文章

brpc源码学习(五)-IOBuf

目录 Block BlockRef IOBuf 主要api tls优化 IOPortal protobuf接口 首先放上官方介绍&#xff1a; brpc使用butil::IOBuf作为一些协议中的附件或http body的数据结构&#xff0c;它是一种非连续零拷贝缓冲&#xff0c;在其他项目中得到了验证并有出色的性能。IOBuf的接…

BRPC学习

一 源码地址&#xff1a;GitHub - apache/incubator-brpc: brpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. "brpc"…

brpc源码解析(四)—— Bthread机制

目录 一、概述二、启动入口函数三、内部启动函数四、worker工作入口五、总结 Bthread是brpc用到的一个线程库&#xff0c;也是brpc的核心之一&#xff0c;默认情况下&#xff0c;包括用户代码在内的绝大部分代码都是运行在bthread里的&#xff0c;bthread也是brpc实现高性能的基…

Springboot集成Brpc

本文代码可在总结处自取。 1、为什么要写这篇文章 最近自己做的业务在和C团队对接&#xff0c;双方需要指定接口与传输协议。原本是直接使用http协议传输json数据&#xff0c;对双方来说都比较简单可接受。但是json数据传输效率实在令人堪忧&#xff0c;导致我们不得不另寻其道…

brpc源码学习(六)- brpc server 端整体流程

brpc的使用比较容易上手&#xff0c;以官方demo为例&#xff0c;因为brpc的数据序列化依赖protobuf&#xff0c;所以首先需要定义个proto 然后继承EchoService并实现Echo方法 然后是整体流程 启动还是比较简单的&#xff0c;定义server&#xff0c;AddService&#xff0c;然后S…

brpc源码解析(一)—— rpc服务添加以及服务器启动主要过程

目录 1.往Server里添加Service&#xff08;业务代码&#xff09;2.设置服务器参数3.启动服务器 平时的工作用到了baidu-rpc搭建rpc服务&#xff0c;作为戈君大神的大作&#xff0c;在没有开源的时候&#xff0c;这个c 的rpc框架在厂内就已经好评颇多&#xff0c;无论是性能、文…

brpc初步学习

一.BRPC介绍 BRPC百度开源的一个rpc框架&#xff0c;它具有以下特性&#xff1a; 基于protobuf接口的RPC框架&#xff0c;也提供json等其他数据格式的支持囊括baidu内部所有RPC协议&#xff0c;支持多种第三方协议模块化设计&#xff0c;层次清晰&#xff0c;很容易添加自定义…

brpc介绍、编译与使用

brpc又称为baidu-rpc&#xff0c;是百度开发一款“远程过程调用”网络框架。目前该项目已在github上开源——https://github.com/brpc/brpc。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 据目前公开的资料&#xff0c;我们发现百度内部从2010年开始&#x…

NB-IOT与物联网

1. 物联网的技术格局 短距离(智能家居/穿戴等) --- zigbee, wifi, BLE 长距离 (LPWA 低功耗广域) --- LORA, NB-IOT 关于LORA大致了解了一下情况 . Lora 其实已经是一个很成熟的技术方案. 国外已经大范围使用,国内也有不少公司在基于LORA运营物联网系统. LORA的系统结构…

lora和nbiot的相同点,它们之间有何区别和联系?

在物联网无线数据传输中&#xff0c;有诸多方式可以选择&#xff0c;包括蓝牙、WIFI、FSK、ASK/OOK、Lora、Zigbee、NB-iot、Z-Wave.等&#xff0c; 其中lora 和NBIot 是自2016年来比较热门的两个无线通讯方式。 我们今天就和大家简单的聊聊Lora 和NBiot。 我是在2016年接触…

NB-IOT开发|nbiot开发教程《三》AT指令类模组驱动-STM32实现AT指令状态机

嵌入式开发中我们要时刻保持代码的高效与整洁看之前&#xff0c;先点赞 好习惯&#xff0c;要养成 一、前言 嵌入式开发中我们要时刻保持代码的高效与整洁。在第一节中“NB-IOT开发|nbiot开发教程《一》AT指令类模组驱动解析”我们说到AT指令模组最好的驱动-状态机。本节我们就…

基于华为云IOT平台实现多节点温度采集(STM32+NBIOT)

一、前言 当前的场景是,在高速公路上部署温度采集设备,在高速路地表安装温度检测传感器,检测当前路段的路面实际温度。一段高速路上有多个地点需要采集温度数据。 采集温度数据需要上传到云平台进行数据存储,并且通过可视化界面展示温度变化曲线,支持查询最近几天的温度信…

NB-IoT的优势是什么?

NB-IoT的优势 &#xff1a; • 强链接&#xff1a;在同一基站的情况下&#xff0c;NB-IoT可以比现有无线技术提供50-100倍的接入数。一个扇区能够支持10万个连接&#xff0c;支持低延时敏感度、超低的设备成本、低设备功耗和优化的网络架构。举例来说&#xff0c;受限于带宽&a…

MN316_OPEN(NBIOT)物联网模块环境搭建

因为项目的需要,这里要使用NBIOT,踩了一些坑,这里总结一下! 编译 官方给的SDK如下: 按照说明,在该目录下直接运行如下指令:".\build.bat dlvs_h0 demo"即可成功编译,但是我编译的时候不成功,报错如下: 最后发现是因为我的目录太深的原因造成的,把"MN316_Op…

stm32毕业设计 NBIOT远程通信系统

文章目录 1 简介2 NBIOT 简介2.1 NBIOT 的特点2.2 NBIOT 的优点2.3 NBIOT能做什么 NBIOT 模块使用4 实现效果5 STM32 驱动NBIOT模块6 最后 1 简介 Hi&#xff0c;大家好&#xff0c;NBIOT是近几年不比较火的远程通信模块&#xff0c;是物联网的重要技术&#xff0c;今天学长向…

NB-IoT技术实战开发 ----- NB-IoT介绍

一.1------初识NB-IoT 1、NB-IoT介绍2、 物联网技术发展2.1有线物联网2.2 无线网络网 3、为什么需要NB-IOT4、NB-IOT优势5、NB-IOT解决方案亮点和价值5.1 广覆盖5.2 低功耗5.3低成本5.4 大连接 6、NB-IOT的应用1.智能抄表2.智能停车3.宠物跟踪4.else 1、NB-IoT介绍 NB-----Na…

【物联网】LoRa vs NBIoT

LoRa &#xff08;Long Range&#xff09; VS NB-IoT&#xff08;Narrow Band Internet of Things&#xff09; LoRa和NB&#xff0d;IoT是什么 通常物联网设备分为三类&#xff1a; 无需移动性&#xff0c;大数据量&#xff0c;需较宽频段&#xff1b;移动性强&#xff0…

物联网协议之NBIOT

什么是NBIOT 在物联网行业目前常用的网络通信技术主要有以下这些&#xff1a; nbiot属于一种LTE网络&#xff0c;LTE网络是目前主流的通信网络&#xff0c;覆盖完整、技术成熟&#xff0c;未来大量物联网设备都需要在LTE网络中实现通讯功能。Cat.X这个值是用来衡量用户终端设…

浅谈NBIOT

一、什么是NBIOT&#xff1f; 1、概念 窄带物联网&#xff08;Narrow Band Internet of Things, NB-IoT&#xff09;&#xff0c;NB-IoT构建于蜂窝网络&#xff0c;只消耗大约180KHz的带宽&#xff0c;使用License频段&#xff0c;可采取带内、保护带或独立载波等三种部署方式…

【物联网毕设基础】NBIOT 窄带物联网

文章目录 1 简介2 NBIOT简介3NB的型号介绍3.1 BC95:3.2 BC35&#xff1a;3.3 BC28&#xff1a;3.4 BC26&#xff1a;3.5 BC20&#xff1a;3.6 BC30&#xff1a; 4 NB物联网卡5 OpenCPU6 BC260模块详解6.1 基本性能6.2 引脚介绍6.3 模块供电 7 其他注意点8 最后 1 简介 Hi&…