2012-07-26 18 views
17

Estoy tratando de comprender un problema que tenemos con un proceso de Java que está bloqueado. Este proceso ha estado en producción durante aproximadamente 4 meses y esta semana comenzó a colgar. Cuando miro a un vertedero de hilo del proceso de todos los temas relevantes (3) tienen pilas como la siguiente:Solucionar problemas del proceso pendiente de Oracle

"TxnParser_1" prio=6 tid=0x69bd3400 nid=0x2534 runnable [0x6aa2f000] 
    java.lang.Thread.State: RUNNABLE 
     at java.net.SocketInputStream.socketRead0(Native Method) 
     at java.net.SocketInputStream.read(SocketInputStream.java:129) 
     at oracle.net.ns.Packet.receive(Unknown Source) 
     at oracle.net.ns.DataPacket.receive(Unknown Source) 
     at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source) 
     at oracle.net.ns.NetInputStream.read(Unknown Source) 
     at oracle.net.ns.NetInputStream.read(Unknown Source) 
     at oracle.net.ns.NetInputStream.read(Unknown Source) 
     at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1099) 
     at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1070) 
     at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:478) 
     at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207) 
     at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:790) 
     at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1039) 
     at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:830) 
     at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1132) 
     at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1687) 
     at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1653) 
     - locked <0x40e22f88> (a oracle.jdbc.driver.T4CStatement) 
     - locked <0x28f8d398> (a oracle.jdbc.driver.T4CConnection) 
     at com.gcg.data.LogParsingInfo.initFromDB(LogParsingInfo.java:262) 
     at com.gcg.om.OmQueueEntry.initParseInfoFromDB(OmQueueEntry.java:104) 
     at com.gcg.om.GenericQueueEntry.run(GenericQueueEntry.java:237) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:619) 

No hay hilos en espera de bloqueos por lo que el proceso no está en punto muerto. Estos 3 hilos que están haciendo el trabajo están bloqueados esperando una respuesta de Oracle, al menos eso es lo que me parece.

Al consultar Oracle, cuando consulto v $ session, parece que una de las conexiones asociadas con estos hilos está ejecutando una consulta, aunque no puedo ver el sql.

select ... from v$session where ...; 
SQL_ADDRESS  SQL_HASH_VALUE SQL_ID  SQL_CHILD_NUMBER SQL_EXEC_START SQL_EXEC_ID PREV_SQL_ADDR PREV_HASH_VALUE PREV_SQL_ID PREV_CHILD_NUMBER PREV_EXEC_START PREV_EXEC_ID 
---------------- -------------- ------------- ---------------- -------------- ----------- ---------------- --------------- ------------- ----------------- --------------- ------------ 
       00    0               0000000239F59EE8  1483377872 fqr8pndc6p36h     5 26-JUL-12   32080545 
       00    0               0000000239F59EE8  1483377872 fqr8pndc6p36h     5 26-JUL-12   32080546 
0000000148CABD88  1784444892 a16hxxtp5sxyw            0000000239F59EE8  1483377872 fqr8pndc6p36h     5 26-JUL-12   32080544 

select * from v$sql where sql_id = 'a16hxxtp5sxyw'; 

no rows selected 

Mis preguntas son:

  1. Estoy en lo correcto en mi análisis de que el proceso se bloquea simplemente esperando una respuesta por parte de Oracle?
  2. ¿Qué debería estar buscando en Oracle para entender por qué este proceso está bloqueando?

Actualizado:

Basado en el comentario con respecto a mirar en DBA_WAITERS y DBA_LOCKS

select * from dba_waiters; 

no rows selected 

select * from dba_locks where BLOCKING_OTHERS <> 'Not Blocking'; 

no rows selected 

Había 98 filas en dba_locks pero ya que todos son 'no bloquear' No creo que es un problema de bloqueo? El proceso en cuestión ha estado en este estado durante más de 3 horas, por lo que ya se habría detectado un punto muerto.

Soy de la teoría de que la instancia de Oracle no es "saludable", pero no sé qué mirar. Tengo una solicitud para reiniciar el servidor de Oracle, pero eso aún no se ha hecho.

Pregunta de seguimiento: ¿Es normal que v $ session contenga un sqlid que no existe en v $ sql y, en caso afirmativo, bajo qué condiciones?

+2

"colgado" jejejejeje;] – mre

+1

Eso es Correcto, mi proceso es más grande que tu proceso. ;) – sceaj

+0

¿Es probable que el proceso esté haciendo alguna actualización, o solo es una consulta? Si se está actualizando, ¿alguna otra cosa podría estar bloqueando lo que sea que esté tratando de hacer? Comenzaría por ver si 'DBA_WAITERS' o' DBA_LOCKS' muestran algo interesante. –

Respuesta

9

El problema se resolvió y la respuesta fue correcta en la tabla v $ session. Aparentemente, las sesiones de Oracle pueden bloquearse por otras razones además del bloqueo. Observe la columna FINAL_BLOCKING_SESSION: identifica la sesión que es la causa raíz del bloqueo. Investigamos la sesión 845 y descubrimos que el proceso del cliente (identificado por MACHINE y PORT) ya no existía. El DBA mató a la sesión 845 y todos volvieron a la normalidad.

SID  SERIAL# STATUS PROGRAM   TYPE SQL_ID  PREV_SQL_ID BLOCKING_SESSION_STATUS BLOCKING_INSTANCE BLOCKING_SESSION FINAL_BLOCKING_SESSION_STATUS FINAL_BLOCKING_INSTANCE FINAL_BLOCKING_SESSION EVENT 
------- ------- --------- ---------------- ---- ------------- -------------- ----------------------- ----------------- ---------------- ----------------------------- ----------------------- ---------------------- ---------------------------- 
108 22447 ACTIVE Gcg log parser 1 USER    fqr8pndc6p36h VALID     1     1581    VALID       1      845     library cache: mutex X 
639 40147 ACTIVE Gcg log parser 3 USER    fqr8pndc6p36h VALID     1     1581    VALID       1      845     library cache: mutex X 
742 34683 ACTIVE Gcg log parser 2 USER a16hxxtp5sxyw fqr8pndc6p36h VALID     1     1581    VALID       1      845     library cache: mutex X 
+0

¿Podría aclarar cómo filtró e identificó que estas tres entradas son la causa raíz del bloqueo? ¿Qué los delató? Estoy teniendo exactamente el mismo problema. Gracias. –

+1

Las 3 entradas que se muestran no son la causa raíz: son las sesiones de Oracle de mi aplicación que estaban siendo bloqueadas. Si se desplaza hacia la derecha y mira las columnas BLOCKING_SESSION y FINAL_BLOCKING_SESSION, verá que allí hay valores SID. Cuando investigamos el SID 845 (FINAL_BLOCKING_SESSION), la sesión era para un cliente que ya no existía; por alguna razón, Oracle no pudo detectar que el proceso del cliente había desaparecido. – sceaj

+0

@sceaj - actualmente estamos experimentando este mismo problema. Ha identificado correctamente la sesión problemática, pero no es una raíz causada. También estamos en esta etapa y la solución sería matar la sesión, sin embargo, necesitamos entender por qué Oracle y la sesión del cliente no se sincronizaron. Creemos firmemente que hay algún "error" de red que desencadenó esto. Mientras que el equipo de red está investigando el problema subyacente de la comunicación. Nosotros, el DEV, decidimos introducir el "tiempo de espera de lectura", que hace que la conexión sea más resiliente. –

-3

Si la instancia en sí misma es "no saludable", reiniciar el servidor Oracle debería remediar eso y devolverlo al estado saludable. Hasta entonces, podría configurar un balanceador de carga HTTP para verificar el estado de varias instancias, al sondear una URL y devolver un resultado entre 100 y 500 para una sesión saludable.

+3

Estoy completamente desconcertado en cuanto a lo que es su sugerencia o cómo ayuda? Lo que ayudaría son los pasos directos para identificar la causa del bloqueo: no quiero suponer que el reinicio solucionará el problema solo para descubrir que existe el mismo problema después del reinicio. – sceaj

2

También me encontré con este problema hace poco, y se utiliza esta consulta se encontró bloqueo/sesiones cerradas en Oracle:

select 
    inst_id||' '||sid||','||serial# inst_sid_s#, 
    username, 
    row_wait_obj#||','||row_wait_block#||','||row_wait_row# obj_lck, 
    blocking_session_Status||' '||blocking_instance||','||blocking_session blk_info, 
    final_blocking_session_Status||' '||final_blocking_instance||','||final_blocking_session f_blk_info, 
    event, 
    seconds_in_wait 
from 
    gv$session 
where 
    lockwait is not null 
order by 
    inst_id; 

Fuente: http://www.dba-oracle.com/t_final_blocking_session_final_blocking_instance.htm

Cuestiones relacionadas