Alibaba Arthas ist ein Tool zum Überwachen und Profilieren von Java-Anwendungen. Die Funktion besteht darin, dass sie verwendet werden kann, ohne die Einstellungen zu ändern oder die überwachte Anwendung neu zu starten. Es gibt viele Dinge, die Arthas tun kann, und ich habe früher nur einige der Funktionen verwendet, aber als ich es noch einmal nachgeschlagen habe, habe ich festgestellt, dass ich verschiedene Dinge tun kann, deshalb möchte ich auf die Einführung eingehen.
Führen Sie zum Installieren und Ausführen von Arthas einfach den folgenden Befehl aus (für Linux): Arthas selbst ist eine Java-Anwendung, sodass sie in anderen Umgebungen ausgeführt werden kann.
$ curl -O https://arthas.aliyun.com/arthas-boot.jar
$ java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.4.0
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 631 org.logstash.Logstash
[2]: 3834 camel-springboot-rest-test-0.0.1-SNAPSHOT.jar
Die ausgeführte Java-Anwendung wird in den beiden folgenden Zeilen angezeigt. Geben Sie daher den zu überwachenden Prozess ein.
2 ★ Diesmal"2"Eingeben
[INFO] arthas home: /root/.arthas/lib/3.4.1/arthas
[INFO] Try to attach process 3834
[INFO] Attach process 3834 success.
[INFO] arthas-client connect 127.0.0.1 3658
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.4.1
pid 3834
time 2020-09-12 01:17:02
Mit dem Befehl dashboard können Sie ein Dashboard ausführen, das die Thread-Liste der Java-Anwendung, den Status der Heap-Nutzung usw. anzeigen kann. Drücken Sie "q", um den Vorgang zu beenden.
[arthas@3834]$ dashboard
Mit dem Befehl thread können Sie eine Liste von Threads anzeigen.
Sie können die Informationen eines bestimmten Threads anzeigen, indem Sie [Thread-ID] aus der obigen Liste verwenden.
[arthas@3834]$ thread 156
"Camel (camel-1) thread #1 - ThroughputLogger" Id=156 TIMED_WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@74abfe92
at sun.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@74abfe92
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Zeigt die Stapelverfolgung der Methode an.
stack [Klasse] [Methode]
[arthas@4939]$ stack mkyz08.example.HelloRestController hello
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 29 ms, listenerId: 5
ts=2020-09-12 01:47:58;thread_name=http-nio-8080-exec-8;id=18;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@710f4dc7
@mkyz08.example.HelloRestController.hello()
at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-2)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:142)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
Führen Sie die folgenden Schritte aus, um die Anzahl der Impressionen zu begrenzen.
stack [Klasse] [Methode] -n [Anzahl der Hinrichtungen]
Überwachen Sie Informationen wie Methodenrückgabewerte, Ausnahmen und Parameter. Es kann mit dem Befehl watch ausgeführt werden.
watch [Klasse] [Methode] [Andere Optionen]
"{params, returnObj}" zeigt den Rückgabewert und die Parameter nach der Ausführung an. "-x 2" ist die Anzeigetiefe.
[arthas@4939]$ watch mkyz08.example.HelloRestController hello "{params,returnObj}" -x 2
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 35 ms, listenerId: 19
ts=2020-09-12 05:24:36; [cost=1.155725ms] result=@ArrayList[
@Object[][
@String[hoge],
],
@String[Hello World],
]
Verwenden Sie "{params, returnObj} -b", um den Rückgabewert und die Parameter anzuzeigen, bevor Sie die Methode ausführen. Obwohl der Rückgabewert angegeben ist, ist er immer null, da er noch nicht ausgeführt wurde.
[arthas@4939]$ watch mkyz08.example.HelloRestController hello "{params,returnObj}" -x 2 -b
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 36 ms, listenerId: 20
ts=2020-09-12 05:25:06; [cost=0.03669ms] result=@ArrayList[
@Object[][
@String[hoge],
],
null,
]
Zeigen Sie die Logger-Informationen mit dem Logger-Befehl an.
[arthas@4939]$ logger
name ROOT
class ch.qos.logback.classic.Logger
classLoader org.springframework.boot.loader.LaunchedURLClassLoader@685f4c2e
classLoaderHash 685f4c2e
level INFO
effectiveLevel INFO
additivity true
codeSource jar:file:/root/camel-springboot-rest-test-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/logback-classic-1.2.3.jar!/
appenders name CONSOLE
class ch.qos.logback.core.ConsoleAppender
classLoader org.springframework.boot.loader.LaunchedURLClassLoader@685f4c2e
classLoaderHash 685f4c2e
target System.out
Sie können die Protokollebene mit dem folgenden Befehl ändern.
$ logger --name ROOT --level DEBUG
Update logger level success.
Im Fall von Spring-Boot musste der Klassenlader mit "-c" angegeben werden.
$ logger --name ROOT --level DEBUG -c 685f4c2e
Update logger level success.
Sie können MBean-Informationen mit dem Befehl mbean anzeigen.
[arthas@4939]$ mbean org.apache.camel:context=MyCamelRestApp,type=routes,* ExchangesCompleted
OBJECT_NAME org.apache.camel:context=MyCamelRestApp,type=routes,name="hello world route"
--------------------------------------------------------------------------------------------------
NAME VALUE
--------------------------------------------------------------------------------------------------
ExchangesCompleted 78
Sie können einen Heap-Dump mit dem Befehl heapdump abrufen.
[arthas@4939]$ heapdump /tmp/dump.hprof
Dumping heap to /tmp/dump.hprof ...
Heap dump file created
Wenn "--live" angegeben ist, wird FullGC ausgeführt, bevor der Heap-Dump erfasst wird.
[arthas@4939]$ heapdump --live /tmp/dump_live.hprof
Dumping heap to /tmp/dump_live.hprof ...
Heap dump file created
async-profiler
Versuchen Sie, Ihre Anwendung mit dem Async-Profiler zu profilieren.
[arthas@4939]$ profiler start
Started [cpu] profiling
#Überprüfen Sie die Anzahl der Beispieldatenerfassungen
[arthas@4939]$ profiler getSamples
2
#Überprüfen Sie den Profiler-Status
[arthas@4939]$ profiler status
[perf] profiling is running for 19 seconds
[arthas@4939]$ profiler stop
OK
profiler output file: /root/arthas-output/20200912-022458.svg
Wenn Sie den Profiler mit "Profiler Stop" stoppen, wird die SVG-Datei ausgegeben. Sie können auch in HTML ausgeben. Das erfasste Flammendiagramm ist wie folgt.
Sie können Methodenaufrufe mit dem Befehl trace verfolgen. Der Trace zeigt auch die Ausführungszeit jeder Methode an, sodass Sie damit analysieren können, welche Methode langsamer ist.
[arthas@4939]$ trace mkyz08.example.HelloRestController hello
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 72 ms, listenerId: 7
`---ts=2020-09-12 02:11:16;thread_name=http-nio-8080-exec-3;id=13;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@710f4dc7
`---[1.01167ms] mkyz08.example.HelloRestController:hello()
+---[0.130848ms] org.apache.camel.CamelContext:getEndpoint() #26
`---[0.649678ms] org.apache.camel.ProducerTemplate:sendBody() #27
Führen Sie die folgenden Schritte aus, um die Anzahl der Ausführungen zu begrenzen.
trace [Klasse] [Methode] -n [Anzahl der Hinrichtungen]
Wenn Sie nur die Methoden extrahieren möchten, die für die angegebene Zeit ausgeführt wurden (im Beispiel 100 ms), führen Sie sie wie folgt aus.
trace [Klasse] [Methode] '#cost>100'
Nicht nur der Befehl trace, sondern Sie können auch den Befehl grep verwenden. Sie können es beispielsweise verwenden, um nach Paket zu filtern.
[arthas@5716]$ trace mkyz08.example.HelloRestController hello | grep mkyz08
Press Q or Ctrl+C to abort.
`---[1.459843ms] mkyz08.example.HelloRestController:hello()
`---[0.066367ms] mkyz08.example.HelloRestController:add() #29
Mit dem Befehl jad können Sie den auf der JVM ausgeführten Bytecode rückwärts in den Quellcode kompilieren. Es kann verwendet werden, wenn Sie den Code der Methode überprüfen möchten, die von den Befehlen trace und stack angezeigt wird. Es scheint, dass es verwendet werden kann, um zu überprüfen, ob andere geänderte Inhalte auf den Server angewendet werden.
[arthas@4939]$ jad mkyz08.example.HelloRestController
ClassLoader:
+-org.springframework.boot.loader.LaunchedURLClassLoader@685f4c2e
+-sun.misc.Launcher$AppClassLoader@70dea4e
+-sun.misc.Launcher$ExtClassLoader@7c6908d7
Location:
file:/root/camel-springboot-rest-test-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/
/*
* Decompiled with CFR.
*
* Could not load the following classes:
* org.apache.camel.CamelContext
* org.apache.camel.Endpoint
* org.apache.camel.ProducerTemplate
* org.springframework.web.bind.annotation.RequestMapping
* org.springframework.web.bind.annotation.RequestMethod
* org.springframework.web.bind.annotation.RestController
*/
package mkyz08.example;
import javax.annotation.Resource;
import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
import org.apache.camel.ProducerTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value={"/spring"})
public class HelloRestController {
@Resource
private ProducerTemplate producer = null;
@Resource
private CamelContext context;
@RequestMapping(method={RequestMethod.GET}, value={"/hello"}, produces={"text/plain"})
public String hello(String msg) {
Endpoint end = this.context.getEndpoint("seda:hello_world");
this.producer.sendBody(end, (Object)msg);
return "Hello World";
}
}
Affect(row-cnt:1) cost in 505 ms.
Lesen Sie die externe Klassendatei und ersetzen Sie sie durch die Klasse in der JVM.
Beschränkungen -Argumente, Methodennamen und Rückgabewerte können nicht geändert werden. -Klassenfelder und -methoden können nicht geändert, hinzugefügt oder gelöscht werden.
[arthas@5716]$ redefine /root/HelloRestController.class
redefine success, size: 1, classes:
mkyz08.example.HelloRestController
Verwenden Sie den Befehl monitor, um die Anzahl der Methodenausführungen, die durchschnittliche Ausführungszeit usw. zu überwachen.
monitor [Klasse] [Methode]
Ein Beispiel für das Ausführungsergebnis ist wie folgt. Geben Sie das Anzeigeintervall (Sekunden) mit der Option "-c" an.
[arthas@5716]$ monitor -c 5 mkyz08.example.HelloRestController hello
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 35 ms, listenerId: 3
timestamp class method total success fail avg-rt(m fail-rat
s) e
---------------------------------------------------------------------------------------------------------------------------------
2020-09-12 06:40:2 mkyz08.example.HelloRestCont hello 1 1 0 0.40 0.00%
4 roller
timestamp class method total success fail avg-rt(m fail-rat
s) e
---------------------------------------------------------------------------------------------------------------------------------
2020-09-12 06:40:2 mkyz08.example.HelloRestCont hello 9 9 0 0.97 0.00%
9 roller
timestamp class method total success fail avg-rt(m fail-rat
s) e
---------------------------------------------------------------------------------------------------------------------------------
2020-09-12 06:40:3 mkyz08.example.HelloRestCont hello 5 5 0 0.26 0.00%
4 roller
[arthas@4939]$ vmoption
KEY VALUE ORIGIN WRITEABLE
---------------------------------------------------------------------------------------------------------------------------------
HeapDumpBeforeFullGC false DEFAULT true
HeapDumpAfterFullGC false DEFAULT true
HeapDumpOnOutOfMemoryError false DEFAULT true
~ Abkürzung ~
#Beim Ändern des Wertes
[arthas@4939]$ vmoption PrintGC true
Successfully updated the vm option.
NAME BEFORE-VALUE AFTER-VALUE
------------------------------------
PrintGC false true
help -Zeig Hilfe
cls -Löschen Sie den Bildschirm
session -Aktuelle Sitzungsinformationen anzeigen
reset - resets enhanced classes. All enhanced classes will be reset to their original states. When Arthas server closes, all these enhanced classes will be reset too
version -Arthas-Version anzeigen
history -Befehlsausführungsverlauf anzeigen
quit -Beenden Sie Arthas Client
stop -Stoppen Sie den Arthas-Server
keymap -Arthas Tastaturkürzel anzeigen
Was ich früher mit verschiedenen Werkzeugen gemacht habe, kann jetzt mit Arthas gemacht werden. Es gibt auch viele andere Befehle als die diesmal eingeführten. Bitte überprüfen Sie sie auf der offiziellen Website. Interessant sah auch die Webkonsole aus.
Recommended Posts