Jmeter压测笔记

什么是 JMeter

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。

Apache jmeter 可以用于对静态的和动态的资源(文件,Servlet,Perl脚本,java 对象,数据库和查询,FTP服务器等等)的性能进行测试。它可以用于对服务器、网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你可以使用它做性能的图形分析或在大并发负载测试你的服务器/脚本/对象。

中文界面设置

  • 修改bin/jmeter.properties文件,将language设置为zh_CN
    1
    2
    #Preferred GUI language. Comment out to use the JVM default locale's language.
    language=zh_CN

利用jmeter代理服务器进行脚本录制

  1. 测试计划中添加线程组

    • 线程数:就是模仿用户并发的数量,Ramp-up:运行线程的总时间,单位是秒,循环次数:就是每个线程循环多少次。
    • 我现在的线程数是200,就是相当于有200个用户,运行线程的总时间是10秒。也就是说在这10秒中之内200个用户同时访问,一秒钟有20个用户同时访问,每个用户循环一次,也就是访问一次。
  2. 测试计划中添加非测试元件http代理服务器

  3. 端口(代理服务器监听端口):可另外设置端口,默认8888

    • 目标控制器:测试计划 > 线程组
    • 分组:每个组放入一个新的控制器
    • 勾选:记录HTTP信息头
  4. http代理服务器:

    • 添加过滤条件:(?i).*\.(bmp|css|js|gif|ico|jpe?g|png|swf|woff|woff2|svg|ttf)
  5. 打开浏览器,网络设置,将局域网设置中的代理服务器设为localhost,端口设置为8888

  6. 代理服务器配置后之后,点击HTTP代理服务器启动按钮,代理服务器就会开始记录所接受的http请求

  7. 在浏览器地址栏输入需要测试的地址并进行相关操作,完成第一组录制

  8. 得到第一组录制的结果后,将任意一个请求的HTTP信息头管理器移至测试计划线程组使其成为全局HTTP信息头管理器

  9. HTTP代理服务器中取消勾选:记录HTTP信息头,重启HTTP代理服务器

  10. 删除录制的第一组信息,重新进行录制

  11. 脚本录制完毕,处理一下HTTP信息头管理器,添加或修改需要的信息头后即可开始进行压测

远程测试

  • 部署从节点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    apiVersion: v1
    kind: Service
    metadata:
    name: jmeter
    spec:
    clusterIP: None
    ports:
    - port: 1099
    name: server
    selector:
    app: jmeter
    ---
    apiVersion: apps/v1beta1
    kind: StatefulSet
    metadata:
    name: jmeter
    labels:
    app: jmeter
    spec:
    serviceName: jmeter
    replicas: 5
    selector:
    matchLabels:
    app: jmeter
    template:
    metadata:
    labels:
    app: jmeter
    spec:
    affinity:
    podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
    matchExpressions:
    - key: app
    operator: In
    values:
    - jmeter
    topologyKey: "kubernetes.io/hostname"
    containers:
    - name: jmeter
    image: justb4/jmeter:5.1.1
    ports:
    - name: server
    containerPort: 1099
    - name: rmi
    containerPort: 20000
    env:
    - name: RMI_HOST
    valueFrom:
    fieldRef:
    fieldPath: status.podIP
    command:
    - jmeter-server
    args:
    - -Dserver.rmi.ssl.disable=true
    - -Djava.rmi.server.hostname=$(RMI_HOST)
  • 运行控制端

    1
    kubectl run jmeter-master --image=justb4/jmeter:5.1.1 -it --restart=Never --command -- bash
  • 另开窗口,将保存的脚本复制到jmeter-master pod中

    1
    kubectl cp self.jmx jmeter-master:/
  • 在控制端,执行压测

    1
    2
    3
    4
    5
    jmeter -Dserver.rmi.ssl.disable=true \
    -n \
    -t /self.jmx \
    -l /result.jtl \
    -R jmeter-0.jmeter.jmeter.svc,jmeter-1.jmeter.jmeter.svc,jmeter-2.jmeter.jmeter.svc,jmeter-3.jmeter.jmeter.svc,jmeter-4.jmeter.jmeter.svc
  • 另开窗口,保存压测结果

    1
    kubectl cp jmeter-master:/result.jtl .
  • 将压测报告导成html

    1
    jmeter -g result.jtl -o result
setzero wechat