服务端压测实践C++耗时压测

一、压测前的准备

1.在群里申请进行性能测试

2.搭建环境发压机器(faA faB)、被压机器(beiA beiB),开始测试

3.关闭服务,停掉所有相关进程

4.在群里通知大家环境释放可用

 

二、在被压测机器 (2台)beiA  beiB选择其中一台搭建后端测试环境  提测branch分支x和主线分支y

注意 如果有依赖的其他服务,记得一并搭建(数据脱敏,此处略去10000字)

在被压测机器搭建的2个环境x y分支的服务s1 s2,起不同的端口 8603 8604

启动服务

[user@hostname output]$ pwd
/path/s1/output

[user@hostname output]$ ./bin/xx &
[1] 5873

 

[user@hostname output]$ pwd
/path/s2/output
[user@hostname output]$ ./bin/xx &
[1] 22068

 

通过接口(ipport)测试服务是否启动成功

OK

 

三、压测工具xxx

1. 在发压机器也就是测试机器(faA faB机器)下载压测工具最新代码

放在[user@hostname: stress ]   /path/stress

解压缩tar包   tar xzvf output.tar.gz

 

2. 修改xxx配置文件.conf

[user@hostname conf ] vim /path/stress/output/conf/xx.conf

以下为压测参数配置示例 不为真正的配置

关键参数:

press_module : 1  ##post 请求设置为1

input_type : 14    ##post 请求设置为14

address : ip:port2, ip:port2,    ## 发压地址(被压测环境机器也就是beiA beiB的ipport ),支持多个环境用逗号分割

input_file : ./test_file    ##请求集地址,压力使用的输入源

其他参数:

is_loop : 0  ##是否循环发送

press_size : 10  ##压力大小

press_number : 0   ##支持指定发送请求个数

press_time : 0 ##支持控制发送时长

save_res : 1 ##是否保存后端返回的数据包

 

实际操作

press_module : 1  ##post 请求设置为1

input_type : 14    ##post 请求设置为14

address : ip:port2, ip:port2,    ## 发压地址(被压测环境机器也就是beiA beiB的ipport ),支持多个环境用逗号分割

input_file : /path/requestAlllog0909    ##请求集地址

 

is_loop : 1 ##是否循环发送

press_size : 20  ##压力大小。QPS

press_number : 0   ##支持指定发送请求个数

press_time : 3600 ##支持控制发送时长(单位秒s 半小时或者1小时)

save_res : 1 ##是否保存后端返回的数据包

 

3. 一定记得改

input_file : /path/requestAlllog0909    ##请求集地址 ,是转义之后的请求参数体集合,也就是压测工具需要的格式==

请求体日志文件格式为

{"method":"POST","uri":"/xx/xx","header":{"Content-Type": "application/json","Host":"xx(发压机器faA的服务器ip)","Conne       ction": "close","Content-Length":521},"content":"{xxxxxxxx脱敏参数"}"}

此次请求数据为570018个(各种请求组合参数)

 

4. 把根据pid来监控服务运行的内存变化的脚本a.sh放到压测机器beiA机器上

先查看后端服务s1 s2端口进程

[username@hostname ~]$ fuser -avn tcp 8603

[username@hostname ~]$ fuser -avn tcp 8604

 

[username@hostname ]$ fuser -avn tcp 8603
here: 8603

USER PID ACCESS COMMAND
8603/tcp work 16797 f.... recommend

 

[username@hostname ]$ fuser -avn tcp 8604
here: 8604

USER PID ACCESS COMMAND
8604/tcp work 12627 f.... recommend

 

5. 被压测服务beiA开2个窗口,分别执行

sh a.sh -p 16797 -d 1 > responseS1 &

sh a.sh -p 12627 -d 1 > responseS2 &

执行完毕查看下a进程 ps -ef|grep a.sh

或者

netstat -nap|grep 8603 

netstat -nap|grep 8604

 

四、发压请求日志构造

1. 登录发压机器faA机器上传你的uid,文件如uid0824,uid个数不要太大,控制在2000到3000 上次这么搞的,胡闹。。。漏测了。。。。。。。。。

正确的是:取线上3w用户的uid,让RD灌入redis(RD提供了400万,QA自己选取3万)。压测每个类型请求量在3w

线上uid捞取出后放在[user@hostname xx ] /xx/20200909_3w_uid

 

2. 使用方法:python xx.py $uid_file $param_type $ipport &

实际操作:

python xx.py 20200909_3w_uid 7 faA的ip:port   请求传参类型为7的

python xx.py 20200909_3w_uid 20 faA的ip:port   请求传参类型为20的

跑完之后在发压机器faA的/path/res下生成req_file 和 res_file

 

3. 每生成一个type类型的请求与返回后到   /path/res 拷贝下文件重命名,以(类型+流量id)的格式把请求日志分别保存下来,否则会覆盖

所有的请求体全了之后,最后整理到一个日志文件 作为发压请求

cat req_file_* > all_file_old

 

4. 生成压测工具要求的格式的,请求体脚本:faA:/path/gen_req.py,使用方法 python gen_req.py $file_req ,会输出一个uload_$file_req文件。

实际操作:需要把all_file_old 拷贝副本放到 /path下。再此路径执行 python gen_req.py all_file_old 生成 uload_all_file_old

 

五、准备发压

1. 记得在此之前压测配置文件地址一定修改正确!!!

发压机器faA [user@hostname: conf ] vim /path/stress/output/conf/xx.conf

input_file : /path/uload_alllog0909

2.在被压测机器beiA任意目录输入xxxxxx(脱敏)

3.记得压测前删除被压测机器beiA的后端服务业务代码的全部日志

/S1/output/log

4.以上OK之后在发压机器faA机器

/path/stress/output

./bin/xx &

启动服务,这样就可以从发压机器faA 往 被压测机器beiA发压了

5.如果有问题,先停止压测工具进程

ps -ef|grep xx|grep -v grep|awk '{print $2}'|xargs kill -9

再杀掉a.sh的进程

6. 压测过程查看进程,登录被压测机器beiA,查看会产生大量的进程

关注

c++的模块做压测的时候还需要关注cpu和内存的资源消耗,是否有内存泄漏等。如果测试有耗时问题,例如all_t,self_t增加耗时超过2ms,需要发起性能review

top -10

free -m

vmstat

 

top命令

pid 主线 分支代码服务进程   关注CPU


  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+    COMMAND
27615 work       20   0  11.3g   6.0g  8992 S   99.9    3.2         5565:11   ad-search
 7372 work        20   0  6228m 2.8g  26m  R   97.5   1.5         1:07.01     rac
17779 root        20   0  1959m  243m 8496 S  46.8    0.1        886:40.78 naming-agent
 5289 work       20    0  26.6g   20g     37m S  14.4    10.7       33:58.45   recommend
15821 work      20    0  26.6g   20g     36m S   7.5     10.7       32:38.65   recommend

 

六、压测结果分析

1. 耗时统计脚本 all_t self_t

可以统计所有日志的平均耗时的结果all_t,self_t等。生成的耗时结果文件放在log_statistics.all文件中

脱敏1000字

如遇 
Traceback (most recent call last):
File "statistics_rac_tag.py", line 144, in <module>
main(sys.argv)
File "statistics_rac_tag.py", line 142, in main
output_restime_statistics(output_file, argv[2])
File "statistics_rac_tag.py", line 90, in output_restime_statistics
per_query[i] = query_sumt_divide[i] / total_query
ZeroDivisionError: float division by zero

可能是正则有问题

 tmp_compile = re.compile(" " + tag + ":[0-9]+")

tmp_compile = re.compile(" " + tag + ": *[0-9]+")

tmp_compile = re.compile(" " + tag + ": [0-9]+")

因为日志可能是 all_t:86.543 self_t:3.154

all_t: 86.543 self_t: 3.154

所以正则需要换下

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1、本课程是一个干货课程,主要讲解如何封装服务器底层,使用Tcp/ip长连接,IDE使用vs2019 c++开发以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,不熟悉底层封装的人,半个小时就能完全掌握服务器框架上手写业务逻辑。2、本课程是一个底层服务器框架教程,主要是教会学员在windows或linux下如何封装一个高效的,避免踩坑的商业级框架,服务器底层使用初始化即开辟内存的技术,使用内存池,服务器运行期间内存不会溢出,非常稳定,同时服务器使用自定义哈希hashContainer,在处理新的连接,新的数据,新的封包,以及解包,发包,粘包的过程,哈希容器性能非常高效,增、删、查、改永远不会随着连接人数的上升而降低性能,增、删、查、改的复杂度永远都是恒定的O(1)。3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问题也非常方便,在windows下使用iocp,linux下使用epoll.4、讲解c++纯客户端,主要用于服务器之间通信,也就是说你想搭建多层结构的服务器,服务器与服务器之间使用socket通信。还可以使用c++客户端做压力测试,开辟多线程连接服务器,教程提供了压力测试,学员可以自己做压力测试服务器性能。5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器与客户端如何交互。6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化.7、服务器教程使用自定义通信协议,同时也支持protobuf,选择权在开发者自己手里,想用什么协议都可以,自由度高。8、服务器教程使用手动敲代码逐句讲解的方式开展教学课程。非喜勿喷,谢谢大家。9、服务器教程提供源码,大家可以在平台提供的地址下载或者联系我,服务器使用c++11部分标准,std::thread,条件变量,线程锁,智能指针等,需要学员具备一定c++知识,购买前请慎重考虑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方狱兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值