2012-06-19 14 views
8

Esto es en el sistema operativo Linux. La aplicación está escrita en C++ con la biblioteca ACE.cómo detectar si un subproceso o proceso se está muriendo de hambre debido a la programación del sistema operativo

Sospecho que uno de los hilos en el proceso se bloquea durante un tiempo inusualmente largo (de 5 a 40 segundos) a veces. La aplicación funciona bien la mayoría de las veces, excepto un par de veces al día que tiene este problema. Hay otras 5 aplicaciones similares que se ejecutan en la caja que también están vinculadas a E/S debido a los pesados ​​datos entrantes de socket.

Me gustaría saber si hay algo que pueda hacer programáticamente para ver si el subproceso/proceso está obteniendo su porción de tiempo.

Respuesta

3

Si un proceso se está muriendo de hambre, el autocontrol para ese proceso no sería tan productivo. Pero, si solo desea que el proceso detecte que no se ha ejecutado por un tiempo, puede llamar al times periódicamente y comparar la diferencia relativa en el tiempo transcurrido con la diferencia relativa en el tiempo programado del usuario (sumaría los campos tms_utime y si desea contar los tiempos de espera para los hijos como tiempo productivo, y sumaría en los campos tms_stime y tms_cstime si considera que el tiempo del núcleo gastado en su nombre es un tiempo productivo). Para los tiempos de subprocesos, la única forma que conozco es consultar el sistema de archivos /proc.

Un proceso externo de alta prioridad o un subproceso de alta prioridad podría supervisar externamente procesos (y subprocesos) de interés leyendo las entradas /proc/<pid>/stat apropiadas para el proceso (y /proc/<pid>/task/<tid>/stat para los subprocesos). Los tiempos del usuario se encuentran en los campos 14 y 16 del archivo stat. Los tiempos del sistema se encuentran en los campos 15 y 17. (Las posiciones de campo son precisas para mi kernel Linux 2.6.)

Entre dos puntos de tiempo, determina la cantidad de tiempo transcurrido que ha pasado (un proceso de monitor o una secuencia por lo general se activaría a intervalos regulares). Entonces la diferencia entre los tiempos acumulados de procesamiento en cada uno de esos puntos de tiempo representa cuánto tiempo el hilo de interés llegó a ejecutarse durante ese tiempo. La relación entre el tiempo de procesamiento y el tiempo transcurrido representaría el intervalo de tiempo.

Una última poco de información: En Linux, yo uso el siguiente para obtener el tid del hilo actual para examinar la derecha task en el directorio /proc/<pid>/task/:

tid = syscall(__NR_gettid); 

hago esto, porque no podía Busque la llamada al sistema gettid realmente exportada por cualquier biblioteca de mi sistema, aunque esté documentada. Pero, podría estar disponible en el tuyo.

Cuestiones relacionadas