GithubHelp home page GithubHelp logo

alibaba / tprofiler Goto Github PK

View Code? Open in Web Editor NEW
2.4K 339.0 928.0 1.26 MB

TProfiler是一个可以在生产环境长期使用的性能分析工具

License: GNU General Public License v2.0

Shell 2.18% Java 94.24% Batchfile 3.58%

tprofiler's Introduction

TProfiler is a code profiling tool.

author:[email protected]

Note: TProfiler requires Java6™ VM.

Please refer to Wiki for more information:
https://github.com/alibaba/TProfiler/wiki

The source code is available using the GPL version 2. We are actively looking for contributors, so if you have any ideas, bug reports, or patches you would like to contribute please do not hesitate to do that.

tprofiler's People

Contributors

jimmy-zha avatar jlusdy avatar khotyn avatar lidongbo avatar manlge avatar tianxiao-ma avatar violetgo avatar wenshao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tprofiler's Issues

"Comparison method violates its general contract!"

TimeSortDatapublic int compareTo(TimeSortData o) {
        if (this.sum > o.sum) {
            return -1;
        } else {
            return 1;
        }
    }
当sum相等时会出现IllegalArgumentException(
                "Comparison method violates its general contract!")

tprofiler对性能的影响测试结果

配置:
startProfTime = 17:28:00
endProfTime = 20:00:00
eachProfUseTime = 5
eachProfIntervalTime = 50
samplerIntervalTime = 20
port = 50000
debugMode = false
needNanoTime = false
ignoreGetSetMethod = true

同一个接口,相同参数,没有cache 压测结果:
结论:qps几乎没什么影响, 这是为什么?

不使用tprofiler的压测结果:
summary + 80918 in 7.3s = 11093.8/s Avg: 14 Min: 0 Max: 122 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
summary + 355915 in 30s = 11863.8/s Avg: 16 Min: 11 Max: 30 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
summary = 436833 in 37.3s = 11712.9/s Avg: 16 Min: 0 Max: 122 Err: 0 (0.00%)

使用tprofiler的压测结果:
summary + 308453 in 27s = 11421.6/s Avg: 16 Min: 1 Max: 205 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
summary = 308454 in 27.2s = 11352.7/s Avg: 16 Min: 1 Max: 205 Err: 0 (0.00%)
summary + 359548 in 30s = 11984.9/s Avg: 16 Min: 9 Max: 57 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0

Tprofile 会影响class被热替换后的性能

最近,我们在项目中新增了Tprofile进行运行时性能数据的收集,但是发现当我们在运行的时候进行部分(一般是在线解决bug,只针对1-2个class)class文件热更新(使用Instrumentation.addTransformer 和 Instrumentation.retransformClasses)后,服务器运行明显变慢,并且可以排除各种IO的影响,严重的服务器只能重启才能解决问题。

编译错误

在源代码的DataDumpThead类中有代码错误,导致编译失败。具体原因可编译时查看。

有什么需要注意的吗

java -cp tprofiler.jar com.taobao.profile.client.TProfilerClient 127.0.0.1 4096 status

java.net.ConnectException: 拒绝连接
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.(Socket.java:425)
at java.net.Socket.(Socket.java:208)
at com.taobao.profile.client.TProfilerClient.getStatus(TProfilerClient.java:112)
at com.taobao.profile.client.TProfilerClient.status(TProfilerClient.java:57)
at com.taobao.profile.client.TProfilerClient.main(TProfilerClient.java:173)

DataDumpThread编译报错

DataDumpThread.java L109 "c continue;" 这么简单的拼写错误居然直接提交到master分支了

java.lang.ArrayIndexOutOfBoundsException: 17912

启动后大量报错
java.lang.ArrayIndexOutOfBoundsException: 17912
at org.objectweb.asm.ClassReader.(Unknown Source)
at org.objectweb.asm.ClassReader.(Unknown Source)
at com.taobao.profile.instrument.ProfTransformer.transform(ProfTransformer.java:52)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

启动后只生成了tmethod.log

其它两个文件是0K, 配置上除了把profile.properties里的includePackageStartsWith 改成自己的包,其它没动过

脚本启动报错

我按照wiki上的配置说明启动后,报这个错,请问是为什么?
load configuration from "/home/xxx/profile.properties".
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:382)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:397)
Caused by: java.lang.IncompatibleClassChangeError: Implementing class
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at com.taobao.profile.Main.premain(Main.java:29)
... 6 more
FATAL ERROR in native method: processing of -javaagent failed

ASM依赖包冲突问题

如果被监控的java程序依赖了ASM包,那么很有可能会和TProfile中ASM包冲突。我也遇到同样问题并已解决,具体请看injectsocks

关于tprofiler.log无法产生日志,只有=号的问题

hi,各位。
我这边分析了一下TProfiler的代码,定位了这一个bug,并做了简单的修复。这里和大家分享一下,希望对大家有所帮助。
内部的bug主要在于ProfFilter类及其子类MysqlProfFilter上。

ProfFilter.includePackage字段是用于判断是否需要注入代码的。
public static boolean isNeedInject(String className) {
		String icaseName = className.toLowerCase().replace('.', '/');
		for (String v : includePackage) {
			if (icaseName.startsWith(v)) {
				return true;
			}
		}
		return false;
	}

MysqlProfFilter的构造方法会把mysql的包信息也自动写进去到ProfFilter.includePackage去。

在ProfTransformer.transform中,79行处表示“如果可以注入mysql成功;则不再继续注入”,所以问题在于transform4Mysql方法,45行处,
if(!MysqlProfFilter.getInstance().isNeedInject(className))
这个方法虽然获取了Instance,但是调用的是父类的静态方法,也就是说,我们配置的package都会被视为mysql的类,进而使用mysql的统计方式,而无法把日志写到tprofiler.log上

修复方法:
为MysqlProfFilter定义一个新的静态方法,那个方法只需检查mysql的package。
if(!MysqlProfFilter.isNeedInjectMysql(className))

暂时不清楚作者对这个设置是什么原因,我自己对这个逻辑做了修改,验证过tprofiler.log是可以获得日志,进而按照wiki的方法去做性能分析。

希望这些可以帮助到各位需要使用这个工具的朋友,有问题可以在这个issue下补充留言。

部署后低峰期对应用响应时间影响20%

部署后低峰期对应用响应时间影响20% ?

假如TimeControlThread、DataDumpThread、SamplerThread三个线程都关闭(去掉)了,InnerSocketThread这个线程的switchFlag为false,这样子 部署后低峰期对应用响应时间影响也是20% ?

tomca停止shutdown.sh报Address already in use

tomca停止shutdown.sh报Address already in use异常,
异常代码为socket = new ServerSocket(Manager.PORT);我觉得应该这这里判断一下线程是否已经启动。

默认下载的代码的dist目录jar不是源代码编译的版本,直接使用这个jar会造成tomca停止shutdown.sh时无法退出,源代码中此问题已修复。

还有1个疑问是socket = new ServerSocket(Manager.PORT);这里的端口号不是配置的,如果我1台物理机上面有多个java实例,只有第一个能够启动远程操作吧,因为端口号已经被占用,不过这个问题还没有实际验证

加载tprofile是会报NoClassDefFoundError

再jvm参数中加入 -javaagent:/path/tprofile,会有下面的exception
java.lang.NoClassDefFoundError: com/taobao/profile/Profiler
at com.alipay.sofa.service.transform.binding.RemotingBindingListener.(RemotingBindingListener.java)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at org.eclipse.equinox.internal.ds.model.ServiceComponent.createInstance(ServiceComponent.java:493)
at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.createInstance(ServiceComponentProp.java:272)
at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:333)
at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:620)
at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:197)
at org.eclipse.equinox.internal.ds.Resolver.buildNewlySatisfied(Resolver.java:473)
at org.eclipse.equinox.internal.ds.Resolver.enableComponents(Resolver.java:217)
at org.eclipse.equinox.internal.ds.SCRManager.performWork(SCRManager.java:863)
at org.eclipse.equinox.internal.ds.SCRManager$QueuedJob.dispatch(SCRManager.java:830)
at org.eclipse.equinox.internal.ds.WorkThread.run(WorkThread.java:89)
at org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor.run(Executor.java:70)
Caused by: com.alipay.cloudengine.extensions.equinox.KernelBundleClassNotFoundException: com.taobao.profile.Profiler in KernelBundleClassLoader: [bundle=com.alipay.sofa.service.transform_3.0.0]
at com.alipay.cloudengine.extensions.equinox.KernelBundleClassLoader.loadClass(KernelBundleClassLoader.java:125)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 18 more
Caused by: java.lang.ClassNotFoundException: com.taobao.profile.Profiler
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(Unknown Source)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(Unknown Source)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(Unknown Source)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(Unknown Source)
at com.alipay.cloudengine.extensions.equinox.KernelBundleClassLoader.loadClass(KernelBundleClassLoader.java:121)
... 19 more

java.lang.ArrayIndexOutOfBoundsException

java.lang.ArrayIndexOutOfBoundsException: 4723
at org.objectweb.asm.ClassReader.readClass(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at com.taobao.profile.instrument.ProfTransformer.transform(ProfTransformer.java:55)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:250)
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:401)
at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1432)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1377)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:641)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:609)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1484)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:425)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:395)
at org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration$DispatcherServletRegistrationCondition.checkDefaultDispatcherName(DispatcherServletAutoConfiguration.java:202)
at org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration$DispatcherServletRegistrationCondition.getMatchOutcome(DispatcherServletAutoConfiguration.java:192)
at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47)
at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:102)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:217)
at org.springframework.context.annotation.ConfigurationClassParser.processMemberClasses(ConfigurationClassParser.java:349)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:264)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:606)
at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:548)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:185)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:308)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:228)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:270)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:93)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:686)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:524)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)

启动应用的时候,asm的ArrayIndexOutOfBoundsException大量的抛出。

TProfile的版本是1.0.1,从主干下载的代码,启动的运用是Springboot-1.5.3。
开发环境:
Mac 10.13.4
JDK:
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

通过源码打包运行无法正确生成tprofiler.log

通过mvn package源码打包运行无法正确生成tprofiler.log,生成的tprofiler.log内容如下(每行只有一个=):

=

=

而替换成dist中相应的jar包,生成的tprofiler.log正确(可以输出方法id,运行时间等)。
请问如何解决?

TProfiler.log的内容为空

尝试多次运行应用,TProfiler.log的内容只出现莫名其妙的“=”号,并没有像wiki中的说明那样,从而导致无法分析profiler log命令(执行类似命令生成的文件什么内容都没有: java -cp tprofiler.jar com.taobao.profile.analysis.ProfilerLogAnalysis d:/tprofiler.log d:/tmethod.log d:/topmethod.log d:/topobject.log)

感觉统计方法次数计算的不对

我配置文件为:
startProfTime = 11:15:00
endProfTime = 11:20:00
eachProfUseTime = 5
eachProfIntervalTime = 10
samplerIntervalTime = 20

我的测试Demo:
public class Main {
private Tortoise tor = new Tortoise();
private Rabbit rab = new Rabbit();
private Timer tim1 = new Timer();
private Timer tim2 = new Timer();

public static void main(String[] args) {
    Thread.currentThread().setName("Main Thread");  
    Main m = new Main();

    for ( int i = 0; i < 1000000; i++ ){
        m.tor.run();
        m.rab.run();

        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }       
}

}

Tortoise 和 Rabbit类内容一样的,如下。
public class Tortoise{
private static int count = 0;
private static long length = 0; // 跑的距离

public void run(){
    doIt();
}   
public void doIt(){
    count++;
    length++;
}   
public long getLen(){
    return length;
}

}

结果统计出来的,
com/fishwasser/main/Rabbit:doIt:14 1 5 5
com/fishwasser/main/Tortoise:doIt:14 1 2 2
com/fishwasser/main/Tortoise:run:9 1 0 0
com/fishwasser/main/Rabbit:run:9 1 0 0

首先所有的doIt() 都是run()调用的,应该一样多啊; 其次,怎么可能执行次数这么小啊?

是不是我有地方理解错了,欢迎指教!!

谢谢

对于throw指令被catch后再return,会导致pop多次,我comment了一个实现try-finally的链接

对于throw后catch的路径,end代码被调用了多次,也就是pop了多次,虽然会比较start时存入的methodId(foo),对于不相等的,则不上报。但是已经pop出来的,却没有再push回去,会导致整个堆栈均无法正确end,导致错乱,只有等这一波堆栈全pop出来后重新来一次。

foo() {
(start_foo)
try {
(end_foo_1)
throw e;
} catch (e) {
}
(end_foo_2)
return ;
}

对于sql慢速日志,sql由于固定在一个特定的方法里,而且不会存在窃套,其实堆栈深度最大也就1,而且使用了独立的堆栈,问题倒不大。

相关代码:
ProfMethodAdapter. visitInsn(insn) :74
case Opcodes.RETURN:
case Opcodes.ATHROW:
this.visitLdcInsn(mMethodId);
this.visitMethodInsn(INVOKESTATIC, "com/taobao/profile/Profiler", "End", "(I)V");
break;

Profiler. End(methodId): 116
thrData.stackNum--;
long[] frameData = thrData.stackFrame.pop();
long id = frameData[0];
if (methodId != id) {
return;
}

tprofile.log数据异常

-rw-r--r-- 1 root root 0 Apr 22 17:27 ../dist/tmethod.log
-rw-r--r-- 1 root root 287 Apr 22 17:38 ../dist/tprofiler.log
-rw-r--r-- 1 root root 2660414 Apr 22 17:38 ../dist/tsampler.log

tprofiler.log里的数据,会多出很多的等号;应该是方法没执行导致的,可否过滤一下,没执行就不要输出等号了;谢谢!

线程ID 线程栈深度 方法ID 方法执行时间
》23 0 149 1464000
》=
》=
》=

resin启动之后,TProfilerClient连不上

参数是加在resin.sh里面的:

exec $JAVA_EXE -javaagent:/home/java/test/tprofiler.jar -Dprofile.properties=/home/java/test/profile.properties -jar ${RESIN_HOME}/lib/resin.jar $*

在innersocketThread里面加了print,看上去是已经启动成功了,但是serversocket就是连不上。

同一台机器用一个java application做测试就可以:
java -javaagent:/home/java/test/tprofiler.jar -Dprofile.properties=/home/java/test/profile.properties com.dx.test.TestDate

输出日志目录必须要存在

开始使用了一个不存在的目录来存放日志,结果发现日志无法打印,之后尝试使用一个以存在的目录存放日志,可以正常输出日志。

tmethod.log不具备日滚功能

如果重启应用,tmethod.log中的id重新生成,和tprofiler.log历史数据就对应不上了
需要tmethod.log具备日滚功能

Wrong format when write thread.log in linux system

I used "java -cp tprofiler.jar com.taobao.profile.analysis.SamplerLogAnalysis logs/tsampler.log logs/tmethod.log thread.log" to create analyse text for Thread dump log but found"^M" as line spliter. Maybe it should be "\r\n" instead of "\n".

运行过程中tmethod一直为空

basic configuration items

startProfTime = 00:00:00
endProfTime = 24:00:00
eachProfUseTime = 5
eachProfIntervalTime = 0
samplerIntervalTime = 20
port = 50000
debugMode = false
needNanoTime = false
ignoreGetSetMethod = true

file paths

logFilePath = ../tprofiler/tprofiler.log
methodFilePath = ../tprofiler/tmethod.log
samplerFilePath = ../tprofiler/tsampler.log

include & excludes items

excludeClassLoader = org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader
includePackageStartsWith = com.xxx
excludePackageStartsWith =

客户端OOM问题

系统刚刚启动,消耗内存不到500MB,此时执行
D:\bin\TProfiler-master\pkg\TProfiler\lib>java -Xms1000m -Xmx1000m -XX:PermSize=256M -XX:MaxPermSize=256m -cp tprofiler-1.0.1.jar com.taobao.profile.client.TProfilerClient 127.0.0.1 50000 status

会出现OOM错误

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuffer.append(Unknown Source)
at com.taobao.profile.client.TProfilerClient.read(TProfilerClient.java:150)
at com.taobao.profile.client.TProfilerClient.getStatus(TProfilerClient.java:118)
at com.taobao.profile.client.TProfilerClient.status(TProfilerClient.java:57)
at com.taobao.profile.client.TProfilerClient.main(TProfilerClient.java:172)

配置文件如下:

log file name

logFileName = tprofiler.log
methodFileName = tmethod.log
samplerFileName = tsampler.log

basic configuration items

startProfTime = 13:47:00
endProfTime = 13:49:00
eachProfUseTime = 30
eachProfIntervalTime = 0
samplerIntervalTime = 0
port = 50000
debugMode = true
needNanoTime = false
ignoreGetSetMethod = true

file paths

logFilePath = D:/bin/TProfiler-master/logs/${logFileName}
methodFilePath = D:/bin/TProfiler-master/logs/${methodFileName}
samplerFilePath = D:/bin/TProfiler-master/logs/${samplerFileName}

include & excludes items

excludeClassLoader = org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader
includePackageStartsWith = com.taobao
excludePackageStartsWith = com.taobao.sketch;org.apache.velocity;com.alibaba;com.taobao.forest.domain.dataobject;org;net

tprofiler-master版本 启动报错数组下标越界

java.lang.ArrayIndexOutOfBoundsException: 52264
at org.objectweb.asm.ClassReader.readClass(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at com.taobao.profile.instrument.ProfTransformer.transform(ProfTransformer.java:55)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)

Maven Assemebly的Plugin有问题

主分支克隆后。执行命令mvn assembly:assembly
配置好配置后发现:

Failed to find Premain-Class manifest attribute in /home/friddle/bin/tprofiler.jar
解压Jar果断发现META-INF/MANIFEST.MF

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: friddle
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_111

并没有Premain-Class属性。

系统:Linux friddle 4.4.0-3-deepin-amd64 #1 SMP Deepin 4.4.30-2 (2016-12-01) x86_64 GNU/Linux
java版本:
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
maven版本:
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 1.8.0_111, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-3-deepin-amd64", arch: "amd64", family: "unix"

能够将java进程的pid加入到log文件的文件名中?

step1:修改profile.properties文件中的日志文件格式,增加,程序中会将替换为实际的pid
logFilePath = E:/Dropbox/code/java_workspace/jvmDemo/src/tprofiler_.log
methodFilePath = E:/Dropbox/code/java_workspace/jvmDemo/src/tmethod_.log
samplerFilePath = E:/Dropbox/code/java_workspace/jvmDemo/src/tsampler_.log

step2:在Manager.java中增加下面两个方法
private void initPID(){
String processName = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
pid = processName.split("@")[0];
}
public String getPID(){
if(pid==null){
this.initPID();
}
return pid;
}

step3:修改ProfConfig.java中下面三个方法
public void setLogFilePath(String logFilePath) {
this.logFilePath = logFilePath.replace("", Manager.instance().getPID());
}
public void setMethodFilePath(String methodFilePath) {
this.methodFilePath = methodFilePath.replace("", Manager.instance().getPID());
}
public void setSamplerFilePath(String samplerFilePath) {
this.samplerFilePath = samplerFilePath.replace("", Manager.instance().getPID());
}

step4:输出日志文件名:
tprofiler_5728.log
tsampler_5728.log

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.