服务端压测实践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

所以正则需要换下

猜你喜欢

转载自blog.csdn.net/weixin_42498050/article/details/108504994
今日推荐