Heim  >  Artikel  >  Java  >  Btrace-Methode zur Lokalisierung von Produktionsfehlern

Btrace-Methode zur Lokalisierung von Produktionsfehlern

高洛峰
高洛峰Original
2017-02-27 15:35:231405Durchsuche

Vorwort

Oft müssen wir mehr Details über die Ausführung des Programms wissen, aber es ist unmöglich, während der Entwicklung alle Ausführungsdetails im Programm auszudrucken . Normalerweise können Sie zu diesem Zeitpunkt den Code ändern, erneut bereitstellen und ihn dann erneut beobachten. Wenn Sie jedoch auf Code stoßen, ist dies nicht der Fall B. andere referenzierte externe Pakete usw. sind sehr problematisch. BTrace ist ein Tool, das Programmlaufdetails dynamisch anzeigen kann, ohne den Code zu ändern oder die Anwendung neu zu starten. Der folgende Artikel stellt die Methode von BTrace vor, um Produktionsfehler zu lokalisieren. Freunde in Not können darauf verweisen.

Phänomene

Einige Anfragen durchlaufen die Datenzugriffsschicht sehr langsam und führen dazu, dass der Verarbeitungsthread blockiert wird und die Ausnahme bei der Überwachung nicht erkannt werden kann.

Btrace-Skript schreiben

@BTrace
public class DBProxyTrace {

 @OnMethod(clazz = "xxx.xxx.QueryHandler", method = "query",
  location = @Location(Kind.RETURN))
 public static void trace2(String sql, @Duration long duration) {
 if (duration/1000000 > 10 * 1000) {
  com.sun.btrace.BTraceUtils.println(duration/1000000 + "ms");
  com.sun.btrace.BTraceUtils.println("this task executes more than 10s. the sql is : "
   + sql);
  com.sun.btrace.BTraceUtils.println("jstack is : ");
  com.sun.btrace.BTraceUtils.jstack();
 }
 }
}

Beurteilen Sie die SQL- und Stack-Informationen, die länger als 10 Sekunden ausgeführt werden .

Kompilieren Sie das Skript DBProxyTrace.Java und bestätigen Sie, dass kein Problem mit dem Skript vorliegt.

./bin/btracec -cp build/ java/DBProxyTrace.java

Führen Sie das Skript DBProxyTrace.class aus

./bin/btrace -cp build/ 17342 DBProxyTrace.class

Nachricht

10468ms
this task executes more than 10s. the sql is : rollback
jstack is :
xxx.QueryHandler.query(QueryHandler.java:106)
xxx.net.AbstractConnection.onReadData(AbstractConnection.java:245)
xxx.net.NIOReactor$RW.run(NIOReactor.java:77)
java.lang.Thread.run(Thread.java:745)

Positionierung

ist beim Transaktions-Rollback blockiert.

Verwenden Sie jstack zur weiteren Positionierung.

JVM-Stack drucken

"$_NIOREACTOR-7-RW" prio=10 tid=0x00007f069856f000 nid=0xde1 waiting for monitor entry [0x00007f0677011000]
 java.lang.Thread.State: BLOCKED (on object monitor)
 at Oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:1167)
 - waiting to lock <0x000000068086fbc0> (a oracle.jdbc.driver.T4CConnection)

Fazit

Blockierung Bei der Rollback-Aktion des Oracle-Treibers liegt dies tatsächlich daran, dass der Oracle-Treiber auf der unteren Ebene eine Sperre hinzufügt, um die Antwort auf die serielle Anforderung sicherzustellen, und dieser Kanal durch langsame Anweisungen blockiert wird, sodass das Rollback blockiert wird.

Weitere Artikel zur Btrace-Methode zur Lokalisierung von Produktionsfehlern finden Sie auf der chinesischen PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn