Incidencias con subprocesos
A continuación se describen algunos de los escenarios que indican incidencias de rendimiento o de estabilidad en la aplicación ThingWorx:
Muchos subprocesos bloqueados durante un largo período de tiempo
Contención de recursos compartidos
Subprocesos de ejecución prolongada
En esta sección se proporciona un resumen de estos tipos de incidencias.
Subprocesos bloqueados
Muchos subprocesos bloqueados durante un período de tiempo prolongado indican una contención de recursos elevada en el nivel de JVM o un posible bloqueo. Cuando muchos subprocesos se bloquean y esperan un recurso compartido, por ejemplo, el acceso a la base de datos, generalmente se bloquea la realización de operaciones de los usuarios.
En ocasiones, una contención elevada se resuelve por sí sola. Por ejemplo, cuando se completa una operación de escritura de base de datos de gran tamaño. Sin embargo, si los subprocesos siguen bloqueados durante un período de tiempo prolongado:
Puede haber una situación de bloqueo; es decir, que los subprocesos se bloqueen mutuamente en un patrón circular.
O bien, puede haber una sola transacción de bloqueo que no complete el procesamiento en el tiempo necesario.
Esta incidencia se puede verificar de la siguiente manera:
Al buscar el número de subprocesos bloqueados.
Al verificar si el subproceso que está bloqueado en una instantánea permanece bloqueado en las instantáneas siguientes.
En la siguiente imagen se muestra un subproceso bloqueado:
En este ejemplo, la operación de descompresión en TWEventProcessor-10 está bloqueada. Está esperando que se complete otra operación de descompresión en el subproceso TWEventProcessor-9. Dos usuarios podrían estar descomprimiendo los ficheros al mismo tiempo en ThingWorx y el segundo usuario debe esperar a que el primero finalice la operación. Ambas operaciones acceden al objeto 0x2f9a4f4, que está bloqueado en TWEventProcessor-9.
Si también hay muchos subprocesos del procesador de eventos bloqueados, puede haber mayores incidencias de estabilidad del servidor. Además, en el subsistema de procesamiento de eventos se puede mostrar un aumento del número de subprocesos activos. También se muestra una cola creciente de eventos no procesados si el escenario bloqueado no se resuelve rápidamente.
Contención de recursos compartidos
Los subprocesos de bases de datos y eventos en ThingWorx pueden ser un obstáculo para el rendimiento por los siguientes motivos:
Verifique la contención del grupo de subprocesos C3P0PooledConnectionPoolManager y TWEventProcessor. Un gran número de subprocesos bloqueados o subprocesos que funcionan de manera activa en esta categoría pueden indicar un posible obstáculo para el rendimiento.
Puede que haya eventos en cola en el servidor si todos los subprocesos de base de datos y eventos están ocupados.
Tenga en cuenta el siguiente ejemplo. En este caso, un subproceso de eventos bloquea todos los subprocesos del conector de la base de datos. El subproceso de evento 11 de la pila de llamadas está realizando una operación de actualización de base de datos de gran tamaño.
"C3P0PooledConnectionPoolManager[identityToken->2v1py89n68drc71w36rx7|68cba7db]-HelperThread-#7" tid=0xa0 in BLOCKED
Blocked: 414717[-1ms], Waited: 416585[-1ms]
User CPU: 5s320ms
at java.lang.Object.wait(Native Method)
- waiting on <0x56978cbf> (a com.mchange.v2.async.ThreadPoolAsynchronousRunner), held by TWEventProcessor-11
"C3P0PooledConnectionPoolManager[identityToken->2v1py89n68drc71w36rx7|68cba7db]-HelperThread-#6" tid=0x9f in BLOCKED
Blocked: 415130[-1ms], Waited: 416954[-1ms]
User CPU: 5s530ms
at java.lang.Object.wait(Native Method)
- waiting on <0x56978cbf> (a com.mchange.v2.async.ThreadPoolAsynchronousRunner), held by TWEventProcessor-11
La lógica de los servicios personalizados que realizan la operación se puede optimizar, tal como se muestra en el siguiente ejemplo:
"TWEventProcessor-11" tid=0x92 in RUNNABLE
Blocked: 3913[-1ms], Waited: 37924[-1ms]
User CPU: 45s430ms
at com.thingworx.persistence.common.sql.SqlDataTableProvider.updateEntry(SqlDataTableProvider.java:13)
at com.thingworx.persistence.TransactionFactory.createDataTransactionAndReturn(TransactionFactory.java:155)
at com.thingworx.persistence.common.BaseEngine.createTransactionAndReturn(BaseEngine.java:176)
Subprocesos de ejecución prolongada
Los subprocesos de ejecución prolongada indican que es posible que se deba optimizar el código personalizado de la aplicación de ThingWorx. Las transacciones de usuario típicas se realizan rápidamente en el nivel de JVM, en un intervalo de subsegundos o pocos segundos. Sin embargo, un subproceso de ejecución prolongada, por ejemplo, en ejecución durante más de 10 minutos, que implique un código personalizado, puede indicar un problema. Reúna varias instantáneas de subprocesos durante un intervalo de 10 minutos para ver cuánto tarda una operación en ejecutarse en un subproceso específico.
Por ejemplo, en una captura durante un intervalo de 60 minutos se muestra el mismo patrón de ejecución en el mismo subproceso:
http-nio-8443-exec-25" tid=0xc7 in RUNNABLE
Blocked: 750[-1ms], Waited: 8866[-1ms]
User CPU: 1h35m
- synchronizer <0x35153c2f> (a java.util.concurrent.ThreadPoolExecutor$Worker)
at com.thingworx.types.data.sorters.GenericSorter.compare(GenericSorter.java:93)
at com.thingworx.types.data.sorters.GenericSorter.compare(GenericSorter.java:20)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:360)
at java.util.TimSort.sort(TimSort.java:234)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1454)
at java.util.Collections.sort(Collections.java:175)
at com.thingworx.types.InfoTable.quickSort(InfoTable.java:722)

En el ejemplo, el subproceso realiza una operación de clasificación en una infotable. La operación de clasificación continúa mientras se itera a través de cada elemento de una infotable de gran tamaño. La operación se puede optimizar para que ocurra una vez al final. Las operaciones de ejecución prolongada crean contención en el nivel de memoria, en el nivel de la base de datos o en otros recursos del servidor. Por lo tanto, es importante identificar y abordar los servicios de ejecución prolongada en la aplicación personalizada de ThingWorx.