Pregunta

Tengo un programa que:

  • tiene un hilo principal (1) que inicia un hilo del servidor (2) y otro (4).
  • el subproceso del servidor (2) acepta () y luego crea un nuevo subproceso (3) para manejar la conexión.

En algún momento, el subproceso (4) hace un fork / exec para ejecutar otro programa que debería conectarse al zócalo que el subproceso (2) está escuchando. Ocasionalmente, esto falla o lleva demasiado tiempo, y es extremadamente difícil de diagnosticar. Si creo que el sistema funciona, la bifurcación / exec ha funcionado, la aceptación ha ocurrido, se ha creado el nuevo hilo (4) ... pero no ocurre nada en ese hilo (usando strace -ff, el archivo para el pid relevante está en blanco).

¿Alguna idea?

¿Fue útil?

Solución

Llegué a la conclusión de que probablemente era este fenómeno:

http://kerneltrap.org/mailarchive/linux -kernel / 2008/8/15/2950234 / thread

ya que el error es difícil de activar en nuestros sistemas de desarrollo, pero generalmente es reportado por usuarios que se ejecutan en grandes máquinas compartidas; también la aplicación bifurcada inicia una JVM, que a su vez asigna una gran cantidad de subprocesos. El problema también está asociado con la máquina que se está cargando y el uso extensivo de la memoria (tenemos una máquina con 128 GB de RAM y los procesos pueden tener un tamaño de 10 a 100 G).

He estado leyendo el libro de temas de O'Reilly, que explica pthread_atfork (), y sugiere el uso de un padre sustituto " " proceso derivado del proceso principal en el inicio desde el que se ejecutan los subprocesos. También sugiere el uso de un grupo de subprocesos creados previamente. Ambas parecen buenas ideas, así que implementaré al menos una de ellas.

Otros consejos

Parece una condición de punto muerto. Busque funciones de bloqueo, como accept (), el problema debería estar allí.

Reduzca el código al tamaño más pequeño posible que aún tenga el comportamiento y publíquelo aquí. O bien encontrará la respuesta o podremos rastrearla.

BTW - http://lists.samba.org/archive /linux/2002-February/002171.html parece que el comportamiento de pthread para exec no está bien definido y puede depender de su sistema operativo.

¿Tienes algún código entre fork y exec? Esto puede ser un problema.

Ten mucho cuidado con los múltiples hilos y la horquilla. La mayoría de glibc / libstdc ++ es seguro para subprocesos. Si un hilo, aparte del hilo de bifurcación, mantiene un bloqueo cuando la bifurcación ejecuta el proceso bifurcado, heredará los mutex en su estado de bloqueo actual. El nuevo proceso nunca verá esos mutexes desbloqueados. Para obtener más información, consulte man pthread_atfork .

Acabo de caer en los mismos problemas, y finalmente encontré que fork () duplica todos los hilos . Ahora imagine, ¿qué hace su programa después de un fork () con todos los hilos ejecutando doble instancia ...

Las siguientes reglas son de " A Mini -Guía sobre fork () y Pthreads " :

  

1- NO QUIERES hacer eso.

     

2- Si necesita bifurcar () entonces:   siempre que sea posible, bifurca () toda tu   niños antes de comenzar cualquier hilo.   

Editar: probado, fork () no duplica hilos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top