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.