Maison >Java >javaDidacticiel >Exemple de la façon dont btrace localise les défauts de production

Exemple de la façon dont btrace localise les défauts de production

黄舟
黄舟original
2017-03-06 10:21:101357parcourir

Cet article présente principalement des exemples de la méthode btrace de localisation des défauts de production. L'article le présente en détail à travers l'exemple de code. Je pense qu'il a une certaine valeur de référence pour tous les amis qui en ont besoin peuvent y jeter un œil ci-dessous.

Avant-propos

Souvent, nous avons besoin de connaître plus de détails sur le fonctionnement du programme, mais il est impossible d'imprimer tous les détails de fonctionnement du programme pendant le développement Accédez au journal. Habituellement, ce que vous pouvez faire à ce stade est de modifier le code, de le redéployer, puis de l'observer à nouveau. Cependant, cette méthode n'est pas très adaptée aux applications en ligne. difficile à modifier, comme d'autres packages externes référencés, etc. sont très gênants. BTrace est un outil qui peut afficher dynamiquement les détails de l'exécution du programme sans modifier le code ni redémarrer l'application. L'article suivant présente la méthode btrace pour localiser les défauts de production. , les amis dans le besoin peuvent s'y référer.

Phénomènes

Certaines requêtes sont très lentes à travers la couche d'accès aux données et provoquent le blocage du thread de traitement, et l'exception ne peut pas être détectée à partir de la surveillance.

Écrire le script btrace

@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();
 }
 }
}

Juger le SQL et les informations de pile exécutées pendant plus de 10 secondes .

Compilez le script DBProxyTrace.Java et confirmez qu'il n'y a aucun problème avec le script.

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

Exécuter le script DBProxyTrace.class

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

Message

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)

Le positionnement

est bloqué lors de l'annulation de la transaction.

Utilisez jstack pour un positionnement ultérieur.

Imprimer la pile JVM

"$_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)

Conclusion

Blocage Dans l'action de restauration du pilote Oracle, cela est en fait dû au fait que le pilote Oracle ajoute un verrou au niveau de la couche inférieure pour garantir la réponse à la demande série, et ce canal est bloqué par des instructions lentes, donc la restauration est bloquée.

Résumé

Ce qui précède est le contenu de l'exemple de la méthode btrace de localisation des défauts de production. Pour plus de contenu connexe, veuillez prêter attention à. le site PHP chinois (www.php .cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn