美文网首页
性能测试面试题(一)

性能测试面试题(一)

作者: 成功在于实践 | 来源:发表于2020-08-11 00:08 被阅读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)相当于收款台前有人排队的时间比例
    

    相关文章

      网友评论

          本文标题:性能测试面试题(一)

          本文链接:https://www.haomeiwen.com/subject/ieasdktx.html