一、压测前的准备
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
所以正则需要换下