Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

130
Vistas
IPC msgsnd espera inesperadamente

[Aunque estoy trabajando en Perl, creo que esta pregunta se relaciona con las API y los límites de Linux System V IPC en lugar de algo específico de Perl].

Tengo dos máquinas Centos, cada una con CentOS Linux versión 7.9.2009 (Core).

Tengo un programa que bifurca a un niño y luego usa los mensajes System V IPC para comunicarse con el niño, el niño prepara las respuestas y las envía al padre.

En una máquina vemos el comportamiento esperado. El hijo produce lotes de mensajes, el padre los consume. Ocasionalmente, el hijo trabaja un poco más rápido que el padre, por lo que puede llenar la cola, el hijo luego espera hasta que el padre consume algunos mensajes y continúa.

Podemos inspeccionar los tamaños de las colas con ipcs -q y ver que ocasionalmente se alcanza el límite predeterminado de 10 mensajes por cola, el hijo hace una pausa y luego vemos que la cola está vacía como se esperaba.

Creemos que los límites de la cola se especifican en archivos en /proc/sys/fs/mqueue/ y, por ejemplo, se ve que msg_max es el 10 esperado. Estos valores son idénticos en ambas máquinas.

También podemos ver los ulimits de usuario relacionados con la cola mediante ulimit -q y ver un valor superior a 800 000 bytes en ambas máquinas.

El enigma es que en nuestra segunda máquina vemos que el niño escribe tres mensajes en la cola e intenta escribir el cuarto y esperar; deliberadamente no establecemos un tiempo de espera. Es como si el escritor creyera que la cola está llena, aunque ipcs -q muestra solo 3 elementos en la cola. En este momento, el padre aún no está intentando leer los mensajes.

 ------ Message Queues -------- key msqid owner perms used-bytes messages 0x0000002a 1474560 dave 600 15020 3

La pregunta: ¿qué, aparte de que la cola esté llena, haría que msgsnd() se detuviera? La pausa parece continuar indefinidamente, el niño continúa cuando el padre se activa y lee algunos mensajes.

Tenemos muchas máquinas que ejecutan este código sin problemas. Falla en tres máquinas nuevas. ¿Presumiblemente hay alguna característica específica del entorno que interactúa con nuestro código?

El código perl usa una biblioteca delgada sobre las llamadas al sistema (detalles omitidos)

 $mQueue = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR | S_IWUSR); msgsnd( $mQueue, pack("l! a*", length($msg), $msg);
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

El problema era que el tamaño máximo predeterminado de la configuración del núcleo de la cola se estableció en un valor bajo.

Esta calibración se puede ver usando la opción -l de ipcs.

 ipcs -q -l ------ Messages Limits -------- max queues system wide = 3671 max size of message (bytes) = 8192 default max size of queue (bytes) = 16384

La configuración del núcleo en cuestión se almacena en

 /proc/sys/kernel/msgmnb

y se puede cambiar (como root) usando el comando

 sysctl -w kernel.msgmnb=65536 kernel.msgmnb = 65536
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda