• 基于locust的性能测试平台搭建


    前段时间加入性能测试组,并参与搭建基于locust的性能测试平台,我分到的任务相对独立,开发locust的启动接口和停止运行接口,现开发的差不多了,做一个总结

    一、locust运行的相关内容

    二、locust操作相关的linux命令

    启动locust:"locust -f /usr/fin/FinBomber/LF_"+taskCode+".py --host="+host+" -P "+port

    杀掉所有在运行的locust进程:ps -ef |grep locust|grep -v grep | awk '{print $2}' | xargs kill -9

    获取所有在运行的locust进程:ps -ef |grep locust|grep -v grep | awk '{print $2}'

    获取指定port对应的pid:"/usr/sbin/lsof -i:"+port+"|grep -v grep | awk '{print $2}'|awk 'NR==2{print}'"

    杀掉该pid:"kill -9 "+locustPid

     三、接口编写思路

    1.编写两个接口,一个启动,同时更新数据库相关字段,另一个为停止运行,同时更新数据库相关字段。如下图

     2.代码敲着敲着问题就暴露了

    问题:java连linux执行启动locust命令(locust -f /usr/fin/FinBomber/LF_"+taskCode+".py --host="+host+" -P "+port),启动是启动了,但是会一直卡那,代码不会继续往下走(往下主要是执行更新数据库操作,后续停止运行接口才能获取到pid,从而杀掉进程),完全不知道咋整,一度觉得整不出来的时候,灵光一现

    解决方法:既然启动命令可以完成启动,只是不能继续往下走代码,那就让它别走了,再开一个接口来完成这件事不就好了,傻缺!瞬间觉得我真是天才

    最终方案:启动编写两个接口,一个启动,一个更新数据库

    -------------------------------解决方法更新---------------------------------

    用多线程!!!!瞬间觉得自己之前真是井底之蛙

    四、上代码

    java连接linux执行命令代码如下:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.net.ServerSocket;

    import org.apache.commons.lang.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import ch.ethz.ssh2.Connection;
    import ch.ethz.ssh2.Session;
    import ch.ethz.ssh2.StreamGobbler;

    public class LinuxCommandUtil {
    private static final Logger log = LoggerFactory.getLogger(LinuxCommandUtil.class);
    private static String DEFAULTCHART="UTF-8";
    /**
    * 登录主机
    * @return
    * 登录成功返回true,否则返回false
    */
    public static Connection login(String ip,
    String userName,
    String userPwd){

    boolean flg=false;
    Connection conn = null;
    try {
    conn = new Connection(ip);
    conn.connect();//连接
    flg=conn.authenticateWithPassword(userName, userPwd);//认证
    if(flg){
    log.info("=========登录成功========="+conn);
    return conn;
    }
    } catch (IOException e) {
    log.error("=========登录失败========="+e.getMessage());
    e.printStackTrace();
    }
    return conn;
    }

    /**
    * 远程执行shll脚本或者命令
    * @param cmd
    * 即将执行的命令
    * @return
    * 命令执行完后返回的结果值
    */
    public static String execute(Connection conn,String cmd){
    String result="";
    try {
    if(conn !=null){
    Session session= conn.openSession();//打开一个会话
    session.execCommand(String.valueOf(cmd));//执行命令
    result=processStdout(session.getStdout(),DEFAULTCHART);
    //如果为得到标准输出为空,说明脚本执行出错了
    if(StringUtils.isBlank(result)){
    log.info("得到标准输出为空,链接conn:"+conn+",执行的命令:"+cmd);
    result=processStdout(session.getStderr(),DEFAULTCHART);
    }else{
    log.info("执行命令成功,链接conn:"+conn+",执行的命令:"+cmd);
    }
    conn.close();
    session.close();
    }
    } catch (IOException e) {
    log.info("执行命令失败,链接conn:"+conn+",执行的命令:"+cmd+" "+e.getMessage());
    e.printStackTrace();
    }
    return result;
    }
    /**
    * 解析脚本执行返回的结果集
    * @param in 输入流对象
    * @param charset 编码
    * @return
    * 以纯文本的格式返回
    */
    public static String processStdout(InputStream in, String charset){
    InputStream stdout = new StreamGobbler(in);
    StringBuffer buffer = new StringBuffer();;
    try {
    BufferedReader br = new BufferedReader(new InputStreamReader(stdout,charset));
    String line=null;
    while((line=br.readLine()) != null){
    buffer.append(line+" ");
    }
    } catch (UnsupportedEncodingException e) {
    log.error("解析脚本出错:"+e.getMessage());
    e.printStackTrace();
    } catch (IOException e) {
    log.error("解析脚本出错:"+e.getMessage());
    e.printStackTrace();
    }
    return buffer.toString();
    }
    //获取未占用的端口号
    public static String getFreePort(){
    ServerSocket serverSocket = null; //读取空闲的可用端口
    String localIp = null;
    try {
    serverSocket = new ServerSocket(0);
    localIp = serverSocket.getInetAddress().getLocalHost().getHostAddress();
    } catch (IOException e) {
    e.printStackTrace();
    }
    String port = String.valueOf(serverSocket.getLocalPort());
    System.out.println("系统分配的端口号 port="+port);
    System.out.println("当前本机ip:"+localIp);
    //获取当前进程ID
    String processName =
    java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
    System.out.println("当前进程ID:"+Long.parseLong(processName.split("@")[0]));
    return port;
    }
    public static String execLocalCmd(String cmd){
    String line="";
    try{
    Runtime rt = Runtime.getRuntime();
    //执行命令, 最后一个参数,可以使用new File("path")指定运行的命令的位置
    Process proc = rt.exec(cmd,null,null);
    InputStream stderr = proc.getInputStream();
    InputStreamReader isr = new InputStreamReader(stderr,"GBK");
    BufferedReader br = new BufferedReader(isr);

    while ((line = br.readLine()) != null) { // 打印出命令执行的结果
    System.out.println(line);
    }
    }catch (Exception e){
    e.printStackTrace();
    }
    return line;

    }
    public static void main(String[] args) {
    // long currentTimeMillis = System.currentTimeMillis();
    String ip = "X.X.X.X";
    String username = "XXX";
    String password = "XXXXXX";
    // String cmd = "sh runLocust.sh";
    String cmd = "ps -ef |grep locust|grep -v grep | awk '{print $2}' | xargs kill -9";
    Connection connection = login(ip, username, password);
    String execmd = execute(connection, cmd);
    // System.out.println(execmd);
    // long currentTimeMillis1 = System.currentTimeMillis();
    // System.out.println("ganymed-ssh2方式"+(currentTimeMillis1-currentTimeMillis));
    getFreePort();
    }

    }
  • 相关阅读:
    mssql 循环的写法,备用
    用了十几年的windows记录下我不知道的几个快捷键
    折腾了下java下webservice,折腾了大半天,居然是eclipse的版本不对
    连接Linux 下mysql 慢的问题,解决之
    解决windows7蓝屏的方法
    MySQL錯誤:Value '00000000' can not be represented as java.sql.Date解決方法[转]
    jdbc连接三种数据库的连接语句写法(备查)
    遇到一个json解析的错误,费了好大的劲,最后发现是少了一个包
    【转】The reference to entity "characterEncoding" must end with the ';' delimiter
    synaptics 插入USB鼠标禁用,网上
  • 原文地址:https://www.cnblogs.com/lynnetest/p/11698325.html
Copyright © 2020-2023  润新知