性能测试面试题(一)

2020-08-11  本文已影响0人  成功在于实践

1.性能测试的应用领域有哪些?

能力验证:通过实际的测试结果证明自己系统的预期能力

瓶颈分析:通过一系列的测试手段发现系统存在的性能瓶颈(并发,负载,压力,失效恢复)

性能调优:通过一系列的技术手段优化系统性能,包括响应时间,吞吐量,资源利用率

容量规划:为了符合未来的规划预期(用户数,市场占有率),对资源做相应的调整。

2.交付一个性能测试项目,请阐述你的性能测试流程

    1:分析需求

    2:制定测试计划和方案(人力资源,时间资源,测试机器资源)

    3:设计性能测试场景和用例(并发,负载,压力,稳定性测试)

    ===搭建环境===

    4:准备用户数据(如何确定用户并发数)

        (1)线上的注册用户数的10%做测试环境的在线用户

        (2)根据高峰时间段和业务量,计算平均并发和峰值并发

    5:设计性能测试脚本(jmter或者lr)

        (1)线程,请求,关联,断言,参数化,报告

        (2)不同的线程组设计不同的测试类型

    6:运行,监控测试数据

        jmeter监听器,jtl数据,grafana+jmeter,非gui

    7:分析性能瓶颈

        吞吐量瓶颈,响应时间瓶颈,资源利用率瓶颈

    8:性能调优

        (1)吞吐量调优:中间件,jvm,网卡带宽

        (2)硬件调优:cpu,磁盘,IO,TCP连接,swap内存

    9:出具性能测试报告和总结

3. jmeter如何设计性能测试场景?

并发测试:基础线程组(强调单位时间的并发,不存在绝对并发)

基准测试:反复对比结果,验证调优结果是否通过(tps是否提升,响应时间是否下降)

负载测试:持续不断地增加负载,发现性能瓶颈(阶梯加压线程组,Concurrency Thread Group)

    并发用户模式的负载:不断增加并发用户数,发现瓶颈

    吞吐量模式的负载:不断增加每秒请求数(rps)对服务端施压,发现tps瓶颈

压力测试:tps瓶颈点上持续负载

    稳定性压力测试:tps保持高压稳定。一般取最大tps的80%持续运行

    破坏性压力测试:目的是只需要服务端出现异常
    
失效恢复测试:出现异常之后,系统可以很快的恢复

容量规划测试:50万,高峰时间段2小时

4.解释常用的性能指标的名称与具体含义

吞吐量

 hps:点击率

 rps:每秒请求数

 qps:每秒查询接口数

 tps:单位时间完成的请求(事物)数
 
响应时间:页面渲染时间,tcp连接时间,sql查询时间,服务端处理时间

错误率:没有正常返回200的都是错误

cpu利用率

IO平均时间

内存利用率

。。。。。

5.什么是集合点?设置集合点有什么意义?jmeter中如何设置集合点?

让用户尽可能在同一时间点发起请求

6.集合点的等待时间怎么设置?

等待时间=0,线程数达不到集合人数就会一直等待

 等待时间>0,线程数在等待时间范围内集合发起

7.什么是压力?有哪些压力模式?

服务端接收请求叫压力

 并发用户模式,加人数

 吞吐量模式,加请求

8.你在性能测试中遇到哪些性能问题?

响应时间过长

 tps过低

 tps毛刺过多

 tps经常出现断崖式下跌

 进程无缘无故失踪

 内存溢出

 cpu利用率过高

9.针对大并发压力测试,主要是从哪几个方面去考虑点?

 考虑并发用户数的设计

  考虑测试场景

  考虑服务端的资源

  考虑网络环境(内网还是外网)

  机器是否足够,是否需要分布式压测

10.举例说明jmeter的定时器用法?

固定定时器:模拟用户思考时间

rps定时器:控制每秒请求数

tps定时器:控制每秒吞吐量

11.jmeter中如何监控linux资源?

serveragent插件在服务器安装启动

保证防火墙对4444端口开放,否则会连接拒绝

本机启动监控

12.什么是性能测试?

功能测试,安全测试,接口测试,性能测试都是测试目的

性能测试的目的是测试系统性能

压力测试,负载测试,并发测试都是方法

通过方法去实现目的

13.怎么做参数化?

csv配置元件,循环读取参数

csv函数 只对线程生效,多线程读取

14.jmeter负载测试中怎么保持session会话?

对session唯一性有要求的接口

(1):脚本保存session,cookie管理器并发读取session。吞吐量相对较低

(2)正则提取保存为全局属性,cookie管理器并发读取session。吞吐量正常

15.什么是关联,如何动态关联?有哪几种关联的方法?

上下文关联,正则表达式关联,json关联,xpath关联

16.什么是Ramp up?你如何设置?

线程启动的时间

请求的单位时间

17.如何识别性能瓶颈?

tps下降?

响应时间上升?

负载越来越高,响应时间越来越长,tps没有变化?

随着负载升高,tps却不变,意味着单线程的tps是越来越低的。。。

总的tps/线程数=性能瓶颈点

Transaction Throughput vs Threads

18.简述堆区的空间分配和gc原理

年轻代

    eden和2个s区

    2个s区轮转回收垃圾

老年代

1:超出年轻代年龄阀值的对象

2:对象大小超出年轻代对象阀值

fullgc

1:老年代满了

2:年轻代进入老年代的对象超出了老年代剩余空间大小

老年代都是大对象,所以fullgc时间很长,大约是年轻代时间的十倍。

gc的时候,所有线程暂停

19.什么是内存溢出

堆内存溢出

栈内存溢出

线程栈。线程启动多少由栈空间决定

20.简述cpu的工作原理

通过cpu线程去调度运行进程/线程,一个cpu线程同一时间只能调度一个运行线程

运行线程数超出了cpu线程,会启动时间片分配机制

21.什么是上下文切换?哪些场景会存在上下文切换?

进程间的切换,交接内存/io

线程切换

    线程在进程内共享资源。线程的cpu时间片用完了就会放弃cpu,进入队列等待

内核切换,系统调用。

    用户空间向内核空间发起调度请求,切换到内核空间给予api,再次切换到用户空间调度api。一次系统调用产生两次切换

22.简述平均负载和利用率

平均负载:单位时间内正在调度cpu的线程+队列中的线程

cpu平均调度时间。

如果cpu分配了100个时间片,有50个花在了切换上,那么利用率只有50%

23.什么是swap空间?oomkiller了解吗?怎么开启swap空间

磁盘空间中开辟的虚拟物理内存。si换出,so换入

swap空间用完了,系统会杀死占用内存最高的进程

swapoff -a 关闭swap

swapon -a 开启swap

swap空间比例:cat /proc/sys/vm/swappiness 物理内存使用比例超出swappiness,就会启用swap

设置临时比例:sudo sysctl vm.swappiness=10

24.进程的优先级如何设置?

调整nice值,改变优先级pr

nice -19 ---- 19

pr越高,进程优先级越低,cpu时间片越少;反之优先级越高,时间片越多

25.吞吐量大幅度波动有哪些原因?

内存不足

tomcat连接数不够

网卡队列不够

线程过多

26.哪些现象说明了IO瓶颈?

await:io等待时间,队列时间+io处理时间

svctm:平均io的时间

await-svctm:得到的是io队列时间,差值越大,表示io处理效率越低

%util:io的使用百分比,越高表示磁盘越繁忙

27:了解哪些资源监控命令?

top

lscpu

mpstat

vmstat

pidstat

iostat

netstat

28.如何用命令行生成测试报告?jtl文件怎么分析?

 jmeter  -n -t  XX.jmx -l XX.jtl  -e -o httpreport

29.简要描述如何分布式执行脚本

  slave配置

  master配置

30.设计一个持续集成框架(描述清晰,能画出来)

    docker+jenkins+gitlab+ant+jmeter+nginx+php

性能测试中Linux命令

主动上下文切换:cswch/s 当某一任务处于阻塞,比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换 将主动让出自己的CPU资源

被动上下文切换:nvcswch/s CPU分配给某一任务的时间片耗尽,因此将强迫该进程让出CPU的执行权。比如大量进程争抢 CPU

strace -tt -f -p 21156 查看系统调用信息

strace -o strace.log -tt -p 【pid】

dstat -y 查看系统中断和上下文切换

pidstat -w 统计进程的上下文切换

pidstat -wt 统计threads的上下文切换

pidstat -p 7826 -w 1 10 显示进程的上下文切换

sar -w 1 统计proc和上下文切换

grep ctxt /proc/$pid/status 统计上下文切换数

watch -d cat /proc/interrupts 统计进程中断的方式

apt install sysbench sysstat 安装sysbench,模拟多线程切换

sysbench --threads=10 --max-time=300 threads run 10 个线程运行 5 分钟的基准测试,模拟多线程切换

ps aux | sort -k3nr |head -n 10 按照按照消耗CPU前10排序的进程

ps aux | sort -k4nr |head -n 10 按照按照消耗内存前10排序的进程

pstree -p | wc -l 查询当前整个系统已用的线程或进程数

pstree -p pid | wc -l 统计进程的线程数

ps -o nlwp pid 查看进程下的线程数

1:netstat -nat|grep ESTABLISHED|wc -l 查看系统的总连接数

2:netstat -anp|grep pid|wc -l 统计进程的总连接数

注:1和2组合使用
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 查看连接状态

watch -d -n 1 'cat /proc/softirqs' 查看中断种类。NET_TX 或 NET _RX 如果变化很快的话就是网络中断引起的,

否则是由系统其他原因造成的中断

ps -A -o stat,ppid,pid,cmd |grep -e '^[Zz]' 定位僵尸进程

kill -HUP 僵尸进程父ID 杀死僵尸进程

ps -eLo pid,stat | grep 3598 | grep running | wc -l 根据进程状态筛选线程

time dd if=/dev/zero of=test bs=1M count=4096 测试IO读写速度

sync;time -p bash -c "(dd if=/dev/zero of=test bs=1M count=200)" 当前目录下创建一个test的文件,写入200个1M的数据。测试写瓶颈

hdparm -tT --direct /dev/sda 测试读瓶颈

iozone -a -n 512k -g 4m -i 0 -i 1 -i 5 -f /mnt/iozone -Rb ./iozone.xls

https://www.jianshu.com/p/8fadfaa5abe6 io测试


wget [http://www.iozone.org/src/current/iozone3_482.tar](https://links.jianshu.com/go?to=http%3A%2F%2Fwww.iozone.org%2Fsrc%2Fcurrent%2Fiozone3_482.tar)

tar -xvf iozone3_429.tar

cd iozone3_429/src/current

apt-get install gcc

make

make linux-ia64

iostat -x -k -d 1

iotop -botq -p 【pid】 输出进程的io信息

iotop -d 2 -n 5 间隔2秒,输出5次 监控时间段内的IO

iotop -o 显示产生IO的进程

%iowait:不能反应磁盘瓶颈 实际反应的是cpu的io等待时间:%iowait = (cpu idle time)/(all cpu time)

rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并

wrqm/s: 每秒对该设备的写请求被合并次数

r/s: 每秒完成的读次数

w/s: 每秒完成的写次数

rkB/s: 每秒读数据量(kB 为单位)

wkB/s: 每秒写数据量(kB 为单位)

avgrq-sz:平均每次 IO 操作的数据量(扇区数为单位)

avgqu-sz: 是平均请求队列的长度。队列长度越短越好

await: 平均每次 IO 请求等待时间(包括等待时间和处理时间,毫秒为单位)。一般地系统IO响应时间应该低于5ms

svctm: 平均每次 IO 请求的处理时间(毫秒为单位)

%util: 1 秒中有百分之多少的时间用于 I/O 操作。该参数表示了设备的繁忙程度

CPU会拿出一部分时间来等待IO(iowait),从磁盘的角度看,如果磁盘的利用率已经满了(util%),这种情况下,CPU使用率可能不高,但是系统整体QPS已经上不去了,如果继续加大流量,会导致单次IO耗时的继续增加(IO请求都堵在队列里),从而影响系统整体的性能。

高iowait,并不代表磁盘的瓶颈。唯一能说明磁盘是系统瓶颈的方法是很高的svctm,一般来说超过20ms,就代表了不太正常的磁盘性能。只要大于20ms,就必须考虑是否磁盘读写的次数太多,导致磁盘性能降低。

svctm 一般要小于 await。svctm的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会导致 svctm 的增加。await 的大小一般取决于svctm 以及 I/O 队列的长度。如果 svctm 接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明I/O队列太长,应用的响应时间变慢,如果响应时间超过了用户可以容许的范围,需要考虑更换更快的磁盘;调整内核elevator 算法;优化应用;升级CPU
经验总结:

1:提高IO效率原则: 顺序写,随机读

2:重点监控 rkB/s 和 和 wkB/s

3:%util接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈

4:await与svctm相差很大的时候,要注意磁盘的IO性能。差值越小,说明队列时间越短,反之则队列时间越长。说明系统出了问题。

规避IO负载过高:

1. 如果服务器用来做日志分析,注意随机读和顺序写,避免定期的压缩、解压大日志。

2. 如果是前端应用服务器,要避免程序频繁打本地日志、或者异常日志

3. 如果是存储服务(mysql、nosql),尽量将服务部署在单独的节点上,做读写分离降低压力

超市排队去哪个柜台付款?

1:首先看排的队人数,5个人比20人要快

2:看前面人购买的东西多少,如果前面的人购买了一个月的物品,可以考虑换个队伍排

3:看收银员的速度,如果碰上了新手,那等待时间会很久

I/O 对比超市排队:
r/s+w/s 类似于排队的人员总数

平均队列长度(avgqu-sz)相当于单位时间里平均排队的人数

平均服务时间(svctm)相当于收银员的收款速度

平均等待时间(await)相当于平均每人的等待时间

平均I/O数据(avgrq-sz)相当于平均每人所买的东西多少

I/O 操作率 (%util)相当于收款台前有人排队的时间比例
上一篇下一篇

猜你喜欢

热点阅读