Soluzione 1:
Usa ipcs -l
per verificare i limiti effettivamente in vigore, e ipcs -a
e ipcs -m
per vedere cosa è in uso, in modo da poter confrontare l'output. Guarda il nattch
colonna:ci sono segmenti senza processi collegati che non sono stati rimossi quando i processi sono terminati (il che normalmente significa che il programma si è bloccato)? ipcrm
può cancellarli, anche se se si tratta di una macchina di prova, un riavvio è più rapido (e assicurerà che le modifiche ai limiti vengano rilevate).
I tuoi parametri del kernel sembrano strani. In particolare, shmall
è un conteggio di pagine, non di byte, e 4kB è la dimensione predefinita della pagina (esegui getconf PAGESIZE
per controllare cosa stai usando). Quanti terabyte di RAM hai?
Ora, dici di ottenere circa 32771 segmenti di memoria condivisa, che è anche circa 32768 (o 2 su 15), il che suggerisce che un int a 16 bit con segno è il fattore limitante. E quale kernel stai eseguendo (poiché questo avrà i suoi limiti)? I due potrebbero essere correlati.
Soluzione 2:
Si scopre che shmmni è limitato a 32768 nel kernel:
#define IPCMNI 32768 /* <= MAX_INT limit for ipc arrays (including sysctl changes) */
nel file ...version.../include/linux/ipc.h
.
Così a corto di ricompilare il kernel, questo è il limite massimo per il numero di segmenti di memoria condivisa.