美文网首页工作生活
流量录制,基于常态化压测

流量录制,基于常态化压测

作者: 上山走18398 | 来源:发表于2020-11-29 12:38 被阅读0次

    简介

    常态化压测、业务压测、集群压测、全链路压测、等基于特定需求的对后台接口进行的并发式请求,接口自动化
    压测数据的来源: 数据仓库,线上流量(可能不包含新的逻辑字段),获取数据的手段多种多样
    压测数据的有效性:
    压测数据的真实性:
    Java Instrument的使用:https://blog.csdn.net/GV7lZB0y87u7C/article/details/79860776
    TcpCopy_网易、Gor、diffy基于网络层面的录制 jvm-sandbox-repeater
    阿里doom平台
    滴滴 RDebug
    模拟真实的读库,那写库如何操作?
    发压机管理调度尽量无瓶颈

    基于流量的自动化接口回归

    1. 流量复制
    2. 流量回归

    读接口
    写接口
    mock数据,如何保证数据库不被脏数据污染

    3. 引流

    正式 <=> 测试 <=> 预发

    参考链接:
    https://www.ctolib.com/topics-128206.html

    Java Instrument

    简介
    可以构建一个独立于应用程序(Agent),用来监测和协助运行在JVM上的程序,甚至能够替换和修改某些类的定义

    1. 启动后的instrument (VM启动)
    2. 本地代码(native code)instrument
    3. 动态改变classpath

    java.lang.instrument包的具体实现,依赖于JVMTI(java virtual machine tool interface)类定义动态改变和操作
    1. JVMTI 提供了一套”代理”程序机制,可以支持第三方工具程序以代理的方式连接和访问 JVM,并利用 JVMTI 提供的丰富的编程接口,完成很多跟 JVM 相关的功能

    1. 事实上,java.lang.instrument 包的实现,也就是基于这种机制的:在 Instrumentation 的实现当中,存在一个 JVMTI 的代理程序,通过调用 JVMTI 当中 Java 类相关的函数来完成Java 类的动态操作。除开 Instrumentation 功能外,JVMTI 还在虚拟机内存管理,线程控制,方法和变量操作等等方面提供了大量有价值的函数。

    参考链接:https://blog.csdn.net/GV7lZB0y87u7C/article/details/79860776
    https://www.jianshu.com/p/5c62b71fd882

    vm启动前设置Instrument
    1. Instrumentation 的最大作用,就是类定义动态改变和操作。在 Java SE 5 及其后续版本当中,开发者可以在一个普通 Java 程序(带有 main 函数的 Java 类)运行时,通过 -javaagent参数指定一个特定的 jar 文件(包含 Instrumentation 代理)来启动 Instrumentation 的代理程序

    关键字:

    premain(String agentArgs,Instruments inst) {
      inst.addTransform(new 实现ClassFileformer的类())
      //另外一种方法
    ClassDefinition def = new ClassDefinition(....)
    inst.redefineClasses(new ClassDefinition[] {def})//可以批量转换很多类
    }
    ClassFileTransformer - Interface
    transform() - ClassFileTransformer中的方法
    
    VM启动后动态Instrument

    关键字

    Attach API 揭示了agentmain的用法,扩展的API,开发者可以方便的监控一个JVM,运行一个外加的代理程序
    两个主要类:
    1. VirtualMachine代表一个java虚拟机-JVM枚举、Attach、Detach动作
    2. VirtualMachineDescriptor:一个描述虚拟机的容器类
    
    通过attach()方法传入一个jvm的pid(进程id),远程连接到jvm上
    通过loadAgent()方法向jvm注册一个代理程序agent,返回Instrumentation实例
    该实例可以在class加载前改变class字节码,可以在class加载后重新加载
    
    agentmain(String agentArgs,Instrumentation inst) {
        inst.addTransform(new 实现ClassFileformer的类())
        inst.retransformClasses(...) //批量转换类定义
    }
      inst.addTransform(new 实现ClassFileformer的类())
    
    
    
    
    //在main函数开始运行后才启动
    public static void agentmain(String agentArgs,Instrumentation inst) 
    public static void agentmain(String agentArgs)
    
    Instrument原理
    1. Interface Summary
    1. ClassFileTransformer:定义了类加载前的预处理类,可以在这个类中对需要加载的类的字节码做一些处理,比如进行字节码增强;
    An agent provides an implementation of this interface in order to transform class files;
    
    2. Instrumentation: 增强器,由JVM在入口参数中传递,提供了如下功能
    有几个主要方法
    This class provides services needed to instrument Java programming language code
    ............
    ...........
    
    1. Class summary
    
    ClassDefinition: This class serves as a parameter block to the Instrumentation.redefineClasses method
    
    工作原理
    1. Instrument Agent 动态库通过JVM初始化,被动态加载
    2. Instrument Agent初始化的时候,注册了JVMTI的初始化函数eventHandlerVMInit
    3. JVM启动调用了初始化函数eventHandlerVMInit,启动了Instrument Agent,用sun.instrument.instrumentationImpl类里的方法loadClassAndCallPremain去初始化我们自定义的transform里的premain方法
    4. 初始化函数注册了class解析的JVMTI的ClassFileLoadHook
    5. 在解析class的时候,JVM调用JVMTI的ClassFileLoadHook函数,钩子函数调用了sun.instrument.instrumentationImpl的transform方法,通过TransformManager的transform的方法最终调用了我们自定义的MyTransformer的类的transform方法
    6. 因为字节码是在解析class之前改的,通过直接替代修改后字节码的数据流,最后进入class的解析,,。
    7. 重新加载class依然走5~6步

    相关文章

      网友评论

        本文标题:流量录制,基于常态化压测

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