精华内容
下载资源
问答
  • 本来之前对jmeter是小白,只听过没用过,于是在网上搜了《jmeter集群》的搭建,搜了半天,基本上没有完整的文档说明,要按照搜的结果进行操作,最终是以失败结束。 为了让普通的jmeter使用者能快速搭建一个简单的...

    起因

    本来之前对jmeter是小白,只听过没用过,于是在网上搜了《jmeter集群》的搭建,搜了半天,基本上没有完整的文档说明,要按照搜的结果进行操作,最终是以失败结束。

    为了让普通的jmeter使用者能快速搭建一个简单的集群,特将操作的过程记录下,方便jmeter的使用者进行操作。

    说明
    笔者采用非SSL的方法进行集群搭建。

    目的

    压测某个服务的承压能力,及TPS值。
    经过对比,选择jmeter作为压测试工具,由于单台jmeter压受限于本地机器的CPU,内存,网络及其他原因,需要采用jmeter集群的方式来进行压测。

    部署

    jdk1.8, 这个需要自行下载及安装,需要配置系统环境变量等,可自行网上搜索。

    暂规划用3台压测机,一台控制机。

    ip说明系统
    1192.168.198.139控制机/执行机win 10
    2192.168.199.11执行机centos
    3192.168.199.29执行机centos

    从jmeter官网,下载5.1.1版本的Zip包到windows机上。
    地址:https://jmeter.apache.org/download_jmeter.cgi

    win 10上的jmeter安装

    将下载 apache-jmeter-5.1.1.zip解压到一个目录,一般是 apache-jmeter-5.1.1 是这个目录。

    修改配置文件
    进apache-jmeter-5.1.1/bin目录下,用编辑器打开 jmeter.properties,找到如下位置
    在这里插入图片描述
    在remote_host后面,添加相应的执行机的IP及端口,将server_port前的#号去掉。

    去掉SSL
    找到图上所示的行,改成如下图所示。
    在这里插入图片描述
    验证
    启动jmeter,双击jmeter.bat文件,出下如下图,则表示成功
    在这里插入图片描述
    在同个目录下,启动执行机,双击jmeter-server.bat文件,出现如下界面则表示成功:
    在这里插入图片描述

    centos的jmeter安装

    将下载的 apache-jmeter-5.1.1.tgz 上传到centos系统上的某个目录下,本文是上传到/usr目录下,解压文档,得到apache-jmeter-5.1.1 目录。

    修改配置文件
    进入apache-jmeter-5.1.1/bin目录下,用vim/vi 打开 jmeter.properties文件, 找到以下文字
    在这里插入图片描述
    将server_port=1099前面的#号去掉,结果如下图:
    在这里插入图片描述
    关闭SSL
    找到如下图在这里插入图片描述
    将server.rim.ssl.disable=false前面的 # 号去掉,并将false 改成 true,结果如下图:
    在这里插入图片描述
    然后执行 sh jmeter-server.sh 或者./jmeter-server命令,看到如下内容,证明启动成功:
    在这里插入图片描述
    2台centos机器都按上述步骤进行安装。

    验证集群

    从jmeter主控界面上,给每台执行发送压测命令,如果看到执行结果,则表示集群成功。
    本例以用户登录为例子进行压测,配置如下:
    在这里插入图片描述
    通过选择菜单对每个执行机进行验证
    加粗样式
    如果出现以下内容:
    在这里插入图片描述
    则表示成功。

    好了,jmeter的集群压测搭建完成,可以进行压测。

    更多技术交流,欢迎关注本人微信
    在这里插入图片描述

    展开全文
  • Jmeter集群压测实例

    2020-09-08 17:31:25
    在控制机和代理机上分别安装好jdk,解压jmeter安装包,配置好环境变量(此处省略安装步骤) 1.在代理机上,修改jmeter配置,开启代理机功能 在jmeter的bin目录下找到jmeter.properties文件 找到server.rmi.ssl....

    在控制机和代理机上分别安装好jdk,解压jmeter安装包,配置好环境变量(此处省略安装步骤)
    1.在代理机上,修改jmeter配置,开启代理机功能
    在jmeter的bin目录下找到jmeter.properties文件
    找到server.rmi.ssl.disable这行,去掉前面的#并将它的值改为true
    在这里插入图片描述

    找到remote_hosts这行,去掉前面的#,将它的值由127.0.0.1改为本机的局域网IP,后面加上端口号1099,端口号可修改为其他,只要没有被本机其他进程占用即可
    在这里插入图片描述
    双击bin目录下的jmeter-server.bat,启动代理机,正常展示如下说明ok啦
    在这里插入图片描述
    2.搭建控制机环境
    在jmeter的bin目录下找到jmeter.properties文件
    找到server.rmi.ssl.disable这行,去掉前面的#并将它的值改为true
    在这里插入图片描述

    找到remote_hosts这行,去掉前面的#,将它的值由127.0.0.1改为本机的局域网IP,后面加上端口号1099,端口号可修改为其他,只要没有被本机其他进程占用即可,此外还要将代理机的信息添加到remote_hosts里面来
    在这里插入图片描述
    双击bin目录下的jmeter-server.bat,启动

    3开启压测
    执行控制机bin目录下的jmeter.bat启动本机jmeter
    将需要执行的jmeter脚本和测试数据,主机和丛机两边都要存放,且脚本中测试数据的存放路径要一致,主机中测试数据地址要用绝对路径,从机绝对相对路径都可
    配置好后从主机运行–远程运行所有,或指定机器,就可以看到执行数据了
    在这里插入图片描述

    展开全文
  • 文章目录Kubernetes 下部署 Jmeter一、前提条件二、部署拓扑三、docker 镜像1、构建 docker 镜像2、部署清单四、Kubernetes部署1、部署组件2、部署清单2.1、主执行脚本2.2、jmeter_slaves2.3、jmeter_master2.4、...

    一、前提条件

    Kubernetes > 1.16

    二、部署拓扑

    图片

    可以从 master 节点启动测试,master 节点把对应的测试脚本发送到对应的 slaves 节点,slave 节点的 pod/nodes 主要作用即发压。

    部署文件清单:

    • jmeter_cluster_create.sh — 此脚本将要求一个唯一的 namespace,然后它将继续创建命名空间和所有组件(jmeter master,slaves,influxdb 和 grafana)。
    • 注意:在启动前,请在jmeter_slaves_deploy.yaml文件中设置要用于 slaves 服务器的副本数,通常副本数应与拥有的 worker nodes 相匹配。
    • jmeter_master_configmap.yaml — Jmeter master 的应用配置。
    • jmeter_master_deployment.yaml — Jmeter master 的部署清单。
    • jmeter_slaves_deploy.yaml — Jmeter slave 的部署清单。
    • jmeter_slave_svc.yaml — jmeter slave 的服务清单。使用 headless service,这使我们能够直接获取 jmeter slave 的 POD IP 地址,而我们不需要 DNS 或轮询。创建此文件是为了使 slave Pod IP 地址更容易直接发送到 jmeter master。
    • jmeter_influxdb_configmap.yaml — influxdb 部署的应用配置。如果要在默认的 influxdb 端口之外使用 graphite 存储方法,这会将 influxdb 配置为暴露端口 2003,以便支持 graphite 。因此,可以使用 influxdb 部署来支持jmeter 后置监听器方法(graphite 和 influxdb)。
    • jmeter_influxdb_deploy.yaml — Influxdb 的部署清单
    • jmeter_influxdb_svc.yaml — Influxdb 的服务清单。
    • jmeter_grafana_deploy.yaml — grafana 部署清单。
    • jmeter_grafana_svc.yaml — grafana 部署的服务清单,默认情况下使用 NodePort,如果公有云中运行它,则可以将其更改为 LoadBalancer(并且可以设置 CNAME 以使用 FQDN 缩短名称)。
    • dashboard.sh — 该脚本用于自动创建以下内容:
      • (1)influxdb pod 中的一个 influxdb 数据库(Jmeter)
      • (2)grafana 中的数据源(jmeterdb)
    • start_test.sh —此脚本用于自动运行 Jmeter 测试脚本,而无需手动登录 Jmeter 主 shell,它将询问 Jmeter 测试脚本的位置,然后将其复制到 Jmeter master pod 并启动自动对 Jmeter slave 进行测试。
    • jmeter_stop.sh - 停止测试
    • GrafanaJMeterTemplate.json — 预先构建的 Jmeter grafana 仪表板。
    • Dockerfile-base - 构建 Jmeter 基础镜像
    • Dockerfile-master - 构建 Jmeter master 镜像
    • Dockerfile-slave - 构建 Jmeter slave 镜像
    • Dockerimages.sh - 批量构建 docker 镜像

    三、docker 镜像

    1、构建 docker 镜像

    执行脚本,构建镜像:

    ./dockerimages.sh
    

    查看镜像:

    $ docker images
    

    将镜像推送到 Registry:

    $ sudo docker login --username=xxxx registry.cn-beijing.aliyuncs.com
    $ sudo docker tag [ImageId] registry.cn-beijing.aliyuncs.com/7d/jmeter-base:[镜像版本号]
    $ sudo docker push registry.cn-beijing.aliyuncs.com/7d/jmeter-base:[镜像版本号]
    

    2、部署清单

    Dockerfile-base (构建 Jmeter 基础镜像):

    FROM alpine:latest
    LABEL MAINTAINER 7DGroup
    
    ARG JMETER_VERSION=5.2.1
    
    #定义时区参数
    ENV TZ=Asia/Shanghai
    
    RUN apk update && \
        apk upgrade && \
        apk add --update openjdk8-jre wget tar bash && \
        mkdir /jmeter  && cd /jmeter/ && \
        wget https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/apache-jmeter-${JMETER_VERSION}.tgz && \
        tar -xzf apache-jmeter-$JMETER_VERSION.tgz  && rm apache-jmeter-$JMETER_VERSION.tgz  && \
        cd /jmeter/apache-jmeter-$JMETER_VERSION/ && \
        wget -q -O /tmp/JMeterPlugins-Standard-1.4.0.zip https://jmeter-plugins.org/downloads/file/JMeterPlugins-Standard-1.4.0.zip && unzip -n /tmp/JMeterPlugins-Standard-1.4.0.zip && rm /tmp/JMeterPlugins-Standard-1.4.0.zip && \
        wget -q -O /jmeter/apache-jmeter-$JMETER_VERSION/lib/ext/pepper-box-1.0.jar https://github.com/raladev/load/blob/master/JARs/pepper-box-1.0.jar?raw=true && \
        cd /jmeter/apache-jmeter-$JMETER_VERSION/ && \ 
        wget -q -O /tmp/bzm-parallel-0.7.zip https://jmeter-plugins.org/files/packages/bzm-parallel-0.7.zip && \unzip -n /tmp/bzm-parallel-0.7.zip && rm /tmp/bzm-parallel-0.7.zip && \
        ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo "$TZ" > /etc/timezone
    
    ENV JMETER_HOME /jmeter/apache-jmeter-$JMETER_VERSION/
    
    ENV PATH $JMETER_HOME/bin:$PATH
    #JMeter 主配置文件
    ADD jmeter.properties $JMETER_HOME/bin/jmeter.properties
    

    Dockerfile-master(构建 Jmeter master 镜像):

    FROM registry.cn-beijing.aliyuncs.com/7d/jmeter-base:latest
    MAINTAINER 7DGroup
    		
    EXPOSE 60000
    

    Dockerfile-slave(构建 Jmeter slave 镜像):

    Dockerfile-slave:
    FROM registry.cn-beijing.aliyuncs.com/7d/jmeter-base:latest
    MAINTAINER 7DGroup
    		
    EXPOSE 1099 50000
    		
    ENTRYPOINT $JMETER_HOME/bin/jmeter-server \
    -Dserver.rmi.localport=50000 \
    -Dserver_port=1099 \
    -Jserver.rmi.ssl.disable=true
    

    Dockerimages.sh(批量构建 docker 镜像):

    #!/bin/bash -e
    docker build --tag="registry.cn-beijing.aliyuncs.com/7d/jmeter-base:latest" -f Dockerfile-base .
    docker build --tag="registry.cn-beijing.aliyuncs.com/7d/jmeter-master:latest" -f Dockerfile-master .
    docker build --tag="registry.cn-beijing.aliyuncs.com/7d/jmeter-slave:latest" -f Dockerfile-slave .
    

    四、Kubernetes部署

    1、部署组件

    执行jmeter_cluster_create.sh,并输入一个唯一的 namespace

    ./jmeter_cluster_create.sh
    

    等待一会,查看pods安装情况:

    $ kubectl get pods -n 7dgroup
    NAME                               READY   STATUS    RESTARTS   AGE
    influxdb-jmeter-584cf69759-j5m85   1/1     Running   2          5m
    jmeter-grafana-6d5b75b7f6-57dxj    1/1     Running   1          5m
    jmeter-master-84bfd5d96d-kthzm     1/1     Running   0          5m
    jmeter-slaves-b5b75757-dxkxz       1/1     Running   0          5m
    jmeter-slaves-b5b75757-n58jw       1/1     Running   0          5m
    

    2、部署清单

    2.1、主执行脚本

    jmeter_cluster_create.sh(创建命名空间和所有组件(jmeter master,slaves,influxdb 和 grafana)):

    #!/usr/bin/env bash
    #Create multiple Jmeter namespaces on an existing kuberntes cluster
    #Started On January 23, 2018
    working_dir=`pwd`
    echo "checking if kubectl is present"
    if ! hash kubectl 2>/dev/null
    then
    echo "'kubectl' was not found in PATH"
    echo "Kindly ensure that you can acces an existing kubernetes cluster via kubectl"
    exit
    fi
    kubectl version --short
    echo "Current list of namespaces on the kubernetes cluster:"
    echo
    kubectl get namespaces | grep -v NAME | awk '{print $1}'
    echo
    echo "Enter the name of the new tenant unique name, this will be used to create the namespace"
    read tenant
    echo
    #Check If namespace exists
    kubectl get namespace $tenant > /dev/null 2>&1
    if [ $? -eq 0 ]
    then
    echo "Namespace $tenant already exists, please select a unique name"
    echo "Current list of namespaces on the kubernetes cluster"
    sleep 2
    kubectl get namespaces | grep -v NAME | awk '{print $1}'
    exit 1
    fi
    echo
    echo "Creating Namespace: $tenant"
    kubectl create namespace $tenant
    echo "Namspace $tenant has been created"
    echo
    echo "Creating Jmeter slave nodes"
    nodes=`kubectl get no | egrep -v "master|NAME" | wc -l`
    echo
    echo "Number of worker nodes on this cluster is " $nodes
    echo
    #echo "Creating $nodes Jmeter slave replicas and service"
    echo
    kubectl create -n $tenant -f $working_dir/jmeter_slaves_deploy.yaml
    kubectl create -n $tenant -f $working_dir/jmeter_slaves_svc.yaml
    echo "Creating Jmeter Master"
    kubectl create -n $tenant -f $working_dir/jmeter_master_configmap.yaml
    kubectl create -n $tenant -f $working_dir/jmeter_master_deploy.yaml
    
    echo "Creating Influxdb and the service"
    kubectl create -n $tenant -f $working_dir/jmeter_influxdb_configmap.yaml
    kubectl create -n $tenant -f $working_dir/jmeter_influxdb_deploy.yaml
    kubectl create -n $tenant -f $working_dir/jmeter_influxdb_svc.yaml
    echo "Creating Grafana Deployment"
    kubectl create -n $tenant -f $working_dir/jmeter_grafana_deploy.yaml
    kubectl create -n $tenant -f $working_dir/jmeter_grafana_svc.yaml
    echo "Printout Of the $tenant Objects"
    echo
    kubectl get -n $tenant all
    echo namespace = $tenant > $working_dir/tenant_export
    

    2.2、jmeter_slaves

    jmeter_slaves_deploy.yaml(Jmeter slave 的部署清单):

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: jmeter-slaves
      labels:
        jmeter_mode: slave
    spec:
      replicas: 2 
      selector:
        matchLabels:
          jmeter_mode: slave
      template:
        metadata:
          labels:
            jmeter_mode: slave
        spec:
          containers:
          - name: jmslave
            image: registry.cn-beijing.aliyuncs.com/7d/jmeter-slave:latest
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 1099
            - containerPort: 50000
            resources:
              limits:
                cpu: 4000m
                memory: 4Gi
              requests:
                cpu: 500m
                memory: 512Mi
    

    jmeter_slaves_svc.yaml( Jmeter slave 的服务清单):

    apiVersion: v1
    kind: Service
    metadata:
      name: jmeter-slaves-svc
      labels:
        jmeter_mode: slave
    spec:
      clusterIP: None
      ports:
        - port: 1099
          name: first
          targetPort: 1099
        - port: 50000
          name: second
          targetPort: 50000
    

    2.3、jmeter_master

    jmeter_master_configmap.yaml(jmeter_master 应用配置):

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: jmeter-load-test
      labels:
        app: influxdb-jmeter
    data:
      load_test: |
        #!/bin/bash
        #Script created to invoke jmeter test script with the slave POD IP addresses
        #Script should be run like: ./load_test "path to the test script in jmx format"
        /jmeter/apache-jmeter-*/bin/jmeter -n -t $1 `getent ahostsv4 jmeter-slaves-svc | cut -d' ' -f1 | sort -u | awk -v ORS=, '{print $1}' | sed 's/,$//'`
    

    jmeter_master_deploy.yaml(jmeter_master 部署清单):

    apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
    kind: Deployment
    metadata:
      name: jmeter-master
      labels:
        jmeter_mode: master
    spec:
      replicas: 1
      selector:
        matchLabels:
          jmeter_mode: master
      template:
        metadata:
          labels:
            jmeter_mode: master
        spec:
          containers:
          - name: jmmaster
            image: registry.cn-beijing.aliyuncs.com/7d/jmeter-master:latest
            imagePullPolicy: IfNotPresent
            command: [ "/bin/bash", "-c", "--" ]
            args: [ "while true; do sleep 30; done;" ]
            volumeMounts:
              - name: loadtest
                mountPath: /load_test
                subPath: "load_test"
            ports:
            - containerPort: 60000
            resources:
              limits:
                cpu: 4000m
                memory: 4Gi
              requests:
                cpu: 500m
                memory: 512Mi
          volumes:
          - name: loadtest 
            configMap:
             name: jmeter-load-test
    

    2.4、influxdb

    jmeter_influxdb_configmap.yaml(influxdb 的应用配置):

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: influxdb-config
      labels:
        app: influxdb-jmeter
    data:
      influxdb.conf: |
        [meta]
          dir = "/var/lib/influxdb/meta"
    
        [data]
          dir = "/var/lib/influxdb/data"
          engine = "tsm1"
          wal-dir = "/var/lib/influxdb/wal"
    
        # Configure the graphite api
        [[graphite]]
        enabled = true
        bind-address = ":2003" # If not set, is actually set to bind-address.
        database = "jmeter"  # store graphite data in this database
    

    jmeter_influxdb_deploy.yaml(influxdb 部署清单):

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: influxdb-jmeter
      labels:
        app: influxdb-jmeter
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: influxdb-jmeter
      template:
        metadata:
          labels:
            app: influxdb-jmeter
        spec:
          containers:
            - image: influxdb
              imagePullPolicy: IfNotPresent
              name: influxdb
              volumeMounts:
              - name: config-volume
                mountPath: /etc/influxdb
              ports:
                - containerPort: 8083
                  name: influx
                - containerPort: 8086
                  name: api
                - containerPort: 2003
                  name: graphite
          volumes:
          - name: config-volume
            configMap:
             name: influxdb-config
    

    jmeter_influxdb_svc.yaml(influxdb 部署服务清单):

    apiVersion: v1
    kind: Service
    metadata:
      name: jmeter-influxdb
      labels:
        app: influxdb-jmeter
    spec:
      ports:
        - port: 8083
          name: http
          targetPort: 8083
        - port: 8086
          name: api
          targetPort: 8086
        - port: 2003
          name: graphite
          targetPort: 2003
      selector:
        app: influxdb-jmeter
    

    2.5、grafana

    jmeter_grafana_deploy.yaml(grafana 部署清单):

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: jmeter-grafana
      labels:
        app: jmeter-grafana
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: jmeter-grafana
      template:
        metadata:
          labels:
            app: jmeter-grafana
        spec:
          containers:
          - name: grafana
            image: grafana/grafana:5.2.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 3000
              protocol: TCP
            env:
            - name: GF_AUTH_BASIC_ENABLED
              value: "true"
            - name: GF_USERS_ALLOW_ORG_CREATE
              value: "true"
            - name: GF_AUTH_ANONYMOUS_ENABLED
              value: "true"
            - name: GF_AUTH_ANONYMOUS_ORG_ROLE
              value: Admin
            - name: GF_SERVER_ROOT_URL
              # If you're only using the API Server proxy, set this value instead:
              # value: /api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
              value: /
    

    jmeter_grafana_svc.yaml(grafana 部署服务清单):

    apiVersion: v1
    kind: Service
    metadata:
      name: jmeter-grafana
      labels:
        app: jmeter-grafana
    spec:
      ports:
        - port: 3000
          targetPort: 3000
      selector:
        app: jmeter-grafana
      type: NodePort
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/service-weight: 'jmeter-grafana: 100'
      name: jmeter-grafana-ingress
    spec:
      rules:
      # 配置七层域名
      - host: grafana-jmeter.7d.com
        http:
          paths:
          # 配置Context Path
          - path: /
            backend:
              serviceName: jmeter-grafana
              servicePort: 3000
    

    五、初始化 dashboard

    1、启动 dashboard 脚本

    $ ./dashboard.sh
    

    检查 service 部署情况:

    $ kubectl get svc -n 7dgroup
    NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
    jmeter-grafana      NodePort    10.96.6.201    <none>        3000:31801/TCP               10m
    jmeter-influxdb     ClusterIP   10.96.111.60   <none>        8083/TCP,8086/TCP,2003/TCP   10m
    jmeter-slaves-svc   ClusterIP   None           <none>        1099/TCP,50000/TCP           10m
    

    我们可以通过 http://任意 node_ip:31801/ 访问 grafana

    最后,我们在 grafana 导入 dashborad 模版:

    图片

    图片
    如果你不喜欢这个模版,也可以导入热门模版:5496

    在这里插入图片描述
    在这里插入图片描述

    2、部署清单

    dashboard.sh 该脚本用于自动创建以下内容:

    • (1)influxdb pod 中的一个 influxdb 数据库(Jmeter)
    • (2)grafana 中的数据源(jmeterdb)
    #!/usr/bin/env bash
    working_dir=`pwd`
    #Get namesapce variable
    tenant=`awk '{print $NF}' $working_dir/tenant_export`
    ## Create jmeter database automatically in Influxdb
    echo "Creating Influxdb jmeter Database"
    ##Wait until Influxdb Deployment is up and running
    ##influxdb_status=`kubectl get po -n $tenant | grep influxdb-jmeter | awk '{print $2}' | grep Running
    influxdb_pod=`kubectl get po -n $tenant | grep influxdb-jmeter | awk '{print $1}'`
    kubectl exec -ti -n $tenant $influxdb_pod -- influx -execute 'CREATE DATABASE jmeter'
    ## Create the influxdb datasource in Grafana
    echo "Creating the Influxdb data source"
    grafana_pod=`kubectl get po -n $tenant | grep jmeter-grafana | awk '{print $1}'`
    ## Make load test script in Jmeter master pod executable
    #Get Master pod details
    master_pod=`kubectl get po -n $tenant | grep jmeter-master | awk '{print $1}'`
    kubectl exec -ti -n $tenant $master_pod -- cp -r /load_test /![]()jmeter/load_test
    kubectl exec -ti -n $tenant $master_pod -- chmod 755 /jmeter/load_test
    ##kubectl cp $working_dir/influxdb-jmeter-datasource.json -n $tenant $grafana_pod:/influxdb-jmeter-datasource.json
    kubectl exec -ti -n $tenant $grafana_pod -- curl 'http://admin:admin@127.0.0.1:3000/api/datasources' -X POST -H 'Content-Type: application/json;charset=UTF-8' --data-binary '{"name":"jmeterdb","type":"influxdb","url":"http://jmeter-influxdb:8086","access":"proxy","isDefault":true,"database":"jmeter","user":"admin","password":"admin"}'
    

    六、启动测试

    1、执行脚本

    $ ./start_test.sh
    

    需要一个测试脚本,本例为:web-test.jmx

    $  ./start_test.sh
    Enter path to the jmx file web-test.jmx
    ''SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/jmeter/apache-jmeter-5.0/lib/log4j-slf4j-impl-2.11.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/jmeter/apache-jmeter-5.0/lib/ext/pepper-box-1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
    Jul 25, 2020 11:30:58 AM java.util.prefs.FileSystemPreferences$1 run
    INFO: Created user preferences directory.
    Creating summariser <summary>
    Created the tree successfully using web-test.jmx
    Configuring remote engine: 10.100.113.31
    Configuring remote engine: 10.100.167.173
    Starting remote engines
    Starting the test @ Sat Jul 25 11:30:59 UTC 2020 (1595676659540)
    Remote engines have been started
    Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445
    summary +    803 in 00:00:29 =   27.5/s Avg:   350 Min:   172 Max:  1477 Err:     0 (0.00%) Active: 40 Started: 40 Finished: 0
    summary +   1300 in 00:00:29 =   45.3/s Avg:   367 Min:   172 Max:  2729 Err:     0 (0.00%) Active: 40 Started: 40 Finished: 0
    summary =   2103 in 00:00:58 =   36.4/s Avg:   361 Min:   172 Max:  2729 Err:     0 (0.00%)
    summary +   1400 in 00:00:31 =   45.4/s Avg:   342 Min:   160 Max:  2145 Err:     0 (0.00%) Active: 40 Started: 40 Finished: 0
    summary =   3503 in 00:01:29 =   39.5/s Avg:   353 Min:   160 Max:  2729 Err:     0 (0.00%)
    summary +   1400 in 00:00:31 =   45.2/s Avg:   352 Min:   169 Max:  2398 Err:     0 (0.00%) Active: 40 Started: 40 Finished: 0
    summary =   4903 in 00:02:00 =   41.0/s Avg:   353 Min:   160 Max:  2729 Err:     0 (0.00%)
    summary +   1400 in 00:00:30 =   46.8/s Avg:   344 Min:   151 Max:  1475 Err:     0 (0.00%) Active: 40 Started: 40 Finished: 0
    summary =   6303 in 00:02:30 =   42.1/s Avg:   351 Min:   151 Max:  2729 Err:     0 (0.00%)
    summary +   1200 in 00:00:28 =   43.5/s Avg:   354 Min:   163 Max:  2018 Err:     0 (0.00%) Active: 40 Started: 40 Finished: 0
    summary =   7503 in 00:02:57 =   42.3/s Avg:   351 Min:   151 Max:  2729 Err:     0 (0.00%)
    summary +   1300 in 00:00:30 =   43.7/s Avg:   456 Min:   173 Max:  2401 Err:     0 (0.00%) Active: 40 Started: 40 Finished: 0
    summary =   8803 in 00:03:27 =   42.5/s Avg:   367 Min:   151 Max:  2729 Err:     0 (0.00%)
    summary +   1400 in 00:00:31 =   44.9/s Avg:   349 Min:   158 Max:  2128 Err:     0 (0.00%) Active: 40 Started: 40 Finished: 0
    summary =  10203 in 00:03:58 =   42.8/s Avg:   364 Min:   151 Max:  2729 Err:     0 (0.00%)
    summary +   1400 in 00:00:32 =   44.3/s Avg:   351 Min:   166 Max:  1494 Err:     0 (0.00%) Active: 40 Started: 40 Finished: 0
    summary =  11603 in 00:04:30 =   43.0/s Avg:   363 Min:   151 Max:  2729 Err:     0 (0.00%)
    summary +   1400 in 00:00:30 =   46.9/s Avg:   344 Min:   165 Max:  2075 Err:     0 (0.00%) Active: 40 Started: 40 Finished: 0
    summary =  13003 in 00:05:00 =   43.4/s Avg:   361 Min:   151 Max:  2729 Err:     0 (0.00%)
    summary +   1300 in 00:00:28 =   46.0/s Avg:   352 Min:   159 Max:  1486 Err:     0 (0.00%) Active: 40 Started: 40 Finished: 0
    summary =  14303 in 00:05:28 =   43.6/s Avg:   360 Min:   151 Max:  2729 Err:     0 (0.00%)
    summary +   1400 in 00:00:31 =   45.6/s Avg:   339 Min:   163 Max:  2042 Err:     0 (0.00%) Active: 40 Started: 40 Finished: 0
    summary =  15703 in 00:05:58 =   43.8/s Avg:   358 Min:   151 Max:  2729 Err:     0 (0.00%)
    summary +    494 in 00:00:07 =   69.0/s Avg:   350 Min:   171 Max:  1499 Err:     0 (0.00%) Active: 0 Started: 40 Finished: 40
    summary =  16197 in 00:06:06 =   44.3/s Avg:   358 Min:   151 Max:  2729 Err:     0 (0.00%)
    Tidying up remote @ Sat Jul 25 11:37:09 UTC 2020 (1595677029361)
    ... end of run
    

    查看测试数据:
    图片

    2、部署清单

    start_test.sh(此脚本用于自动运行 Jmeter 测试脚本,而无需手动登录 Jmeter 主 shell,它将询问 Jmeter 测试脚本的位置,然后将其复制到 Jmeter master pod 并启动自动对 Jmeter slave 进行测试):

    #!/usr/bin/env bash
    #Script created to launch Jmeter tests directly from the current terminal without accessing the jmeter master pod.
    #It requires that you supply the path to the jmx file
    #After execution, test script jmx file may be deleted from the pod itself but not locally.
    
    #直接从当前终端启动 Jmeter 测试而创建的脚本,无需访问 Jmeter master pod。
    #要求提供 jmx 文件的路径
    #执行后,测试脚本 jmx 文件可能会从 pod 本身删除,但不会在本地删除。
    
    working_dir="`pwd`"
    
    # 获取 namesapce 变量
    tenant=`awk '{print $NF}' "$working_dir/tenant_export"`
    
    jmx="$1"
    [ -n "$jmx" ] || read -p 'Enter path to the jmx file ' jmx
    
    if [ ! -f "$jmx" ];
    then
        echo "Test script file was not found in PATH"
        echo "Kindly check and input the correct file path"
        exit
    fi
    
    test_name="$(basename "$jmx")"
    
    # 获取 master pod 详细信息
    master_pod=`kubectl get po -n $tenant | grep jmeter-master | awk '{print $1}'`
    kubectl cp "$jmx" -n $tenant "$master_pod:/$test_name"
    
    ## 启动 Jmeter 压测
    kubectl exec -ti -n $tenant $master_pod -- /bin/bash /load_test "$test_name"
    kubectl exec -ti -n $tenant $master_pod -- /bin/bash /load_test "$test_name"
    

    jmeter_stop.sh(停止测试):

    #!/usr/bin/env bash
    #Script writtent to stop a running jmeter master test
    #Kindly ensure you have the necessary kubeconfig
    
    #编写脚本来停止运行的 jmeter master 测试
    #请确保你有必要的 kubeconfig
    working_dir=`pwd`
    
    #获取 namesapce 变量
    tenant=`awk '{print $NF}' $working_dir/tenant_export`
    master_pod=`kubectl get po -n $tenant | grep jmeter-master | awk '{print $1}'`
    kubectl -n $tenant exec -it $master_pod -- bash -c "./jmeter/apache-jmeter-5.0/bin/stoptest.sh"                               
    

    七、小结

    传统 Jmeter 存在的问题:

    • 并发数超过单节点承载能力时,多节点环境配置、维护复杂;
    • 默认配置下无法并行运行多个测试,需要更改配置启动额外进程;
    • 难以支持云环境下测试资源的弹性伸缩需求。

    Kubernetes-Jmeter 带来的改变:

    • 压测执行节点一键安装;
    • 多个项目、多个测试可并行使用同一个测试资源池(最大并发数允许情况下, Kubernetes 也提供了 RBAC、namespace 等管理能力,支持多用户共享一个集群,并实现资源限制),提高资源利用率;
    • 对接 Kubernetes HPA 根据并发数自动启动、释放压测执行节点。

    源码地址:

    • https://github.com/zuozewei/blog-example/tree/master/Kubernetes/k8s-jmeter-cluster

    参考资料:

    • [1]:https://github.com/kubernauts/jmeter-kubernetes
    展开全文
  • 文章目录版本记录说明存疑问题JMeter 简单说明下载及安装如何查看说明文档`$JMETER_HOME/bin` 文件夹下文件的说明如何调整 JMeter 的JVM配置集群说明启动 被控节点 的 JMeter server主控节点 分发任务主控节点 中途...

    版本记录

    日期人员类型版本说明
    2019年12月22日dcmini创建v1.0.0

    说明

    在搭建JMeter 测试集群的过程中遇到了一些坑在这里做一些记录, 如果有什么问题欢迎大家在评论中指出。

    存疑问题

    序号说明是否解决解决日期
    1如何使用命令行参数或者环境变量来改变JVM的运行参数
    2JMeter server 启动时,在命令行中加上 server.rmi.ssl.disable 参数会失效,必须到jmeter.properties 文件中修改
    3集群模式 server 读取 csv 文件是否有其他更好的方式,目前只能等分切分才能保证不重复读取

    JMeter 简单说明

    下载及安装

    推荐去官网下载: https://jmeter.apache.org/download_jmeter.cgi

    解压缩后就可以跑起来了。

    ps:

    • 我不喜欢在 环境变量里配置 JMETER_HOME ,因为测试机器一般是临时开的有的时候还是借用其他环境的机器用完之后还要删除,感觉很麻烦。

    如何查看说明文档

    打开 $JMETER_HOME/printable_docs/index.html,这个和官方文档是一样的,离线看速度快一点儿。
    在这里插入图片描述

    $JMETER_HOME/bin 文件夹下文件的说明

    • jmeter: linux 环境下的启动脚本
    • jmeter-server:linux 环境下 server 的启动脚本
    • jmeter.bat:windows 环境下的启动脚本
    • jmeter-server.bat:windows 环境下 server 的启动脚本

    这里需要注意的是 jmeter-server* 文件调用的还是 对应的 jmeter 文件,所以我们需要多 jmeter-server 进行的配置都需要在 jmeter 文件中找答案。
    在这里插入图片描述

    如何调整 JMeter 的JVM配置

    因为 JMeter 是用 JAVA 编写的,所以其启动方法肯定就是运行 java -jar 这条命令,所以几乎所有的配置都是挂在这条命令之下的。我们可以看一下启动文件中都挂了哪些参数。
    $JMETER_HOME/bin/jmeter 文件为例,在其最后一行前加上 echo 命令。
    在这里插入图片描述然后我们启动 JMeter 就可以看到其拼写出来的 java -jar 命令

    /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/bin/java -server -XX:+HeapDumpOnOutOfMemoryError -Xms2g -Xmx2g -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20 -Djava.security.egd=file:/dev/urandom -Duser.language=en -Duser.region=EN -Xdock:name=JMeter -Xdock:icon="./../docs/images/jmeter_square.png" -Dapple.laf.useScreenMenuBar=true -Dapple.eawt.quitStrategy=CLOSE_ALL_WINDOWS -jar ./ApacheJMeter.jar

    我们来理一下这些参数

    • -server JMeter单机启动也是启动一个 server ,地址是默认的 127.0.0.1
    • -XX:+HeapDumpOnOutOfMemoryError 当内存溢出的时候储存 heap dump文件,文件可以使用 JAVA 的 jhat 命令生成网页报告,也可以使用 Eclipse Memory Analyzer(MAT) 来生成报告。
    • -Xms2g JVM 初始分配的内存
    • -Xmx2g JVM 最大分配的内存
    • -XX:MaxMetaspaceSize Meta区最大
    • -XX:+UseG1GC 启动 G1 回收器
    • -XX:MaxGCPauseMillis 设置每次年轻代垃圾回收的最长时间
    • -XX:G1ReservePercent 设置堆内存保留为假天花板的总量
    • -Djava.security.egd JAVA 用于加快可靠算技术的产生
    • -Duser.language 用户语言
    • -Duser.region 用户区域
    • -Xdock:name dock 名字
    • -Xdock:icon dock 图标
    • -Dapple.laf.useScreenMenuBar 不知道是啥意思😿
    • -Dapple.eawt.quitStrategy 不知道是啥意思😢

    我们打开 $JMETER_HOME/bin/jmeter 可以看到这些参数都是写在这份文件中的。
    那么这里就有一个疑问了我们可以通过哪些方式来修改 JVM 的参数呢?

    • 修改 $JMETER_HOME/bin/jmeter 文件
    • 命令行参数
    • 环境变量

    测试发现只能修改$JMETER_HOME/bin/jmeter文件能够修改。
    这里我不是很理解为什么 JMeter 不设计然我们用命令行或者环境变量来修改JVM参数,可能是我没有找到,如果大家有知道的话请留言告诉我

    集群说明

    JMeter 的集群模式是主从结构,主控节点负责分发执行脚本,被控节点用于执行分发下来的脚本。
    在这里插入图片描述

    启动 被控节点 的 JMeter server

    $ ./jmeter-server \
      -J server_port=40005 \
      -J server.rmi.localport=40005 \
      -J server.rmi.ssl.disable=true \
      -D java.rmi.server.hostname=192.168.0.3
    

    当然大家也可以使用 nohup ... & 到后台运行

    参数说明

    • server_port 服务监听端口
    • server.rmi.localport rmi 监听端口
    • server.rmi.ssl.disable rmi ssl 关闭
    • java.rmi.server.hostname rmi hostname 在多网卡的时候必须配置

    在这里还是有一个问题,那就是有的时候 server.rmi.ssl.disable 这个配置好像是不生效的,需要到 jmeter.properties 文件中 将 server.rmi.ssl.disable 改成 =true 才可以。

    主控节点 分发任务

    这里可以使用GUI界面进行任务的下发, 也可以使用no-GUI模式下发,我还是喜欢后者,但是我没有比较过这两者在性能上有多大的差距,大家如果知道的话请告诉我。

    $ ./jmeter \
      -R 192.168.2.243:40005 \
      -D java.rmi.server.hostname=192.168.1.78 \
      -n -t '/root/car_share_jmeter/jmx/MQTT-No1-01.jmx' \
      -l '/root/car_share_jmeter/result/MQTT-No1-00001-10000-1000-1-2019年12月20日首次.csv' \
      -G thread_numOfThreads=10000 \
      -G thread_rampUpPeriod=1000 \
      -G lp_pubMessage=7 \
      -G csv_deviceInfo='/root/car_share_jmeter/csv/10000/MQTT_TEST_01_10000.csv' \
      -G ct_pubMessage=570000
    

    这里就算变贴一个以前项目的测试命令,参数说明

    • -R 远程 server 的地址,多个 server 用 , 隔开
    • -D rmi 的 hostname 多网卡的时候需要配置
    • -n 使用非GUI 模式启动
    • -t 测试脚本文件路径
    • -l 结果文件地址,这里也是有一个问题,那就是这个文件的目录必须事先创建好,感觉非常不方便。
    • -G 测试脚本的一些自定义参数,这里发现 -J 在集群模式下是不起作用的

    主控节点 中途停止

    以前我每一次要中途停止测试都是 ctrl + c 强制停止线程,后来发现这个方法好蠢。在 $JMETER_HOME/bin 目录下随便找一下就有 stoptest.sh 脚本,看名字就是用来中途停止测试的。

    在主控节点上运行 ./stoptest.sh 就可以停止测试。

    集群测试 CSV 文件的处理

    很多时候我们需要让 JMeter 从 csv 文件中读取模拟用户的用户名和密码来模拟多用户登陆的场景,在单机模式时只要填写上文件路径就可以了,但是在集群模式下 各个 server 是不知道对方的存在的,所以需要我们自己来避免集群中的多个线程读取到同一条csv 文件记录。

    我使用的方法是将csv文件按照 server 数量均匀拆分 并保存到 被控节点的相同目录下。

    如果大家有更好的办法请告诉我。

    展开全文
  • jmeter集群压测搭建

    万次阅读 2017-10-31 18:02:38
    jmeter集群方法参考:http://www.cnblogs.com/suntingme/p/5995721.html 准备: 1:一台调度机(windows GUI),因为windows图形界面方便看压测监控信息 2:N台执行机(linux) 3:csv参数文件的配置  可能出现的...
  • jmeter支持分布式测试,在分布式模式下,由一台调度机调度所有的执行机(集群节点),执行脚本时可以自由的选择单节点执行或者分发集群中指定或全部的机器执行。在使用调度机客户端分发脚本时,无论是在GUI模式还是...
  • jmeter集群测试。

    2019-06-20 17:09:00
    jmeter集群测试的官方文档:http://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.html 一、测试机器。 集群测试的电脑,分为2种: Master 运行JMeter GUI 界面(jmet...
  • JMeter集群可能遇到的问题 1.打开 jmeter-server.bat 报错 ,jar包找不到 解决办法: 第一步:java -version 查看 是否装了jdk,如未装jdk,先安装jdk并配置环境变量 第二步:是否配置了jmeter环境变量,如没有...
  • jmeter集群使用

    2020-06-30 15:05:43
    jmeter脚本jmx文件 二、连接阿里云master 通过FinalShell输入账号密码端口,堡垒机需要使用手机端阿里云App,进入"管控"->"虚拟FMA"中接收验证码; 通过rz命令上传jmx到远程master; 执行命令 jmeter -n -t /...
  • JMeter 集群入门

    2020-09-10 21:16:22
    JMeter 集群入门 快速启动 1. 下载最新版 JMeter 为了避免不必要的错误,客户端、服务端请使用相同版本 2. 服务端启动 bin/jmeter-server -Djava.rmi.server.hostname=192.168.0.161 -Dserver.rmi.localport=9900 ...
  • Jmeter集群部署教程

    千次阅读 2017-03-27 12:36:48
    作为一个纯 JAVA 的GUI应用,JMeter 对于CPU和内存的消耗还是很惊人的,所以当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误。不过,JMeter 也...
  • jmeter集群

    2021-11-24 20:54:41
    jmeter集群模式的部署:windows作为调度机(master),多个linux作为负载机(slave)。布署在linux主机上的jmeter agent,是实际发起模拟请求的,jmeter master控制jmeter slave的运行,是总控制器。 (调度机...
  • JMeter集群模式的应用

    千次阅读 2019-08-07 09:08:47
    JMeter集群模式的应用 JMeter对于许多Java程序员是曾经和现在的最得心应手的压测工具,而且JMeter本身也是使用Java开发的。截止本文写作时间,官方网站上最新的版本是5.1.1,需要在Java 8的环境下运行。5.1.1版本...
  • Jmeter集群搭建

    2021-04-20 20:56:23
    (1)在Jmeter的安装目录的bin文件夹中找到jmeter.properties文件 (2)打开jmeter.properties文件,先添加slave(从机)的ip地址,添加多个时每个ip用英文逗号隔开 添加后启动jmeter,在运行—>远程启动中...
  • jmeter分布式集群搭建

    2021-09-10 12:26:04
    集群环境搭建 虚拟机安装 安装目标 在物理机上 安装 3台虚拟机 一主2从 , 先安装一台虚拟机 ,并在上面装了jmeter jdk 后再进行克隆 另外2台 单台虚拟机配置 2核cpu/2G内存/50G硬盘 网路使用net方式 Os为centos7 ...
  • 安装jmeter5.0时启动报java.lang.ClassNotFoundException: org.apache.commons.httpclient.methods.multipart.PartSource 查看你的jmeter安装目录下的lib/ext文件夹下是否有JMeterPlugins-Standard.jar文件,如果...
  • 配置Jmeterjmeter.bat,处理多网卡的问题) 现象 调度机(Master)启动测试任务的时候,在执行机(Slave)上的日志会抛出错误,显示和一个没用到的ip通信,导致无法正常通信。 java.rmi.ConnectIOException: ...
  • 搭建Jmeter容器集群平台

    万次阅读 热门讨论 2018-05-03 11:11:49
    基于大量虚拟机的Jmeter集群有个缺点,就是不方便管理,比如需要重启Jmeter服务,还需要一个个的连接到虚拟机上进行操作,而且安装部署不方便(无法一键部署),也不方便将集群封装成整体应用对外提供服务。...
  • JMeter集群搭建

    2017-02-19 22:18:12
    Jmeter的安装参考我的相关博客,本篇博文旨在简单介绍JMeter集群的安装。 windows下的JMeter可视化较好,否则linux下需要安装GUI,而windows下搭建JMeter集群的话,性能没有Linux下的好,所以我打算搭建一套windows+...
  • jmeter集群测试

    2019-10-08 04:06:08
    jmeter-server -Jserver_port=10001jmeter -Jremote_hosts=127.0.0.1:10001 转载于:https://www.cnblogs.com/atwanli/articles/4695872.html
  • jmeter压测集群部署和实战

    千次阅读 2018-02-08 16:34:26
    1.在所有期望运行 JMeter 作为 Load Generator 的机器上安装JMeter,并确定其中一台机器作为 Controller,其他的机器作为 Agent。agent搭建在linux(centos 6.5)服务器环境下,server搭建在windows(server 2016)...
  • 安装jdk和jmeter 一、 安装jdk,要用1.8及以上版本 在control和agent机器上都要安装,步骤: • 将jdk压缩包上传到服务器,并使用命令: tar –zxvf jdk-8u11-linux-x64.tar.gz 将安装包解压 • 若是zip包 使用uzip...
  • 下图是JMeter集群模式的部署图,JMeter agent是部署在linux主机上的服务,是实际发起模拟请求的。JMeter controller控制JMeter agent的运行,是总控制器。 安装JMeter 下面开始安装和配置。 JMeter下载地址:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,828
精华内容 2,331
关键字:

jmeter集群