Solución 1:
Usa ipcs -l
para comprobar los límites actualmente en vigor, y ipcs -a
y ipcs -m
para ver lo que está en uso, para que pueda comparar la salida. Mira el nattch
columna:¿hay segmentos sin procesos adjuntos que no se eliminaron cuando se cerraron los procesos (lo que normalmente significa que el programa se bloqueó)? ipcrm
puede borrarlos, aunque si se trata de una máquina de prueba, un reinicio es más rápido (y se asegurará de que se recojan los cambios en los límites).
Los parámetros de su kernel parecen extraños. En particular, shmall
es un recuento de páginas, no de bytes, y 4kB es el tamaño de página predeterminado (ejecute getconf PAGESIZE
para comprobar lo que está utilizando). ¿Cuántos terabytes de RAM tienes?
Ahora, usted dice que obtiene alrededor de 32771 segmentos de memoria compartida, que también son alrededor de 32768 (o 2 a 15), lo que sugiere que un int de 16 bits firmado es el factor limitante. ¿Y qué kernel está ejecutando (ya que esto tendrá sus propios límites)? Los dos pueden estar relacionados.
Solución 2:
Resulta que shmmni está limitado a 32768 en el kernel:
#define IPCMNI 32768 /* <= MAX_INT limit for ipc arrays (including sysctl changes) */
en el archivo ...version.../include/linux/ipc.h
.
A falta de volver a compilar el núcleo, ese es el límite estricto en la cantidad de segmentos de memoria compartida.