Lösung 1:
Verwenden Sie ipcs -l
um die tatsächlich geltenden Grenzwerte zu überprüfen, und ipcs -a
und ipcs -m
um zu sehen, was verwendet wird, damit Sie die Ausgabe vergleichen können. Sehen Sie sich die nattch
an Spalte:Gibt es Segmente ohne angehängte Prozesse, die nicht entfernt wurden, als Prozesse beendet wurden (was normalerweise bedeutet, dass das Programm abgestürzt ist)? ipcrm
können sie löschen, obwohl, wenn dies eine Testmaschine ist, ein Neustart schneller ist (und sicherstellt, dass Ihre Änderungen an den Grenzwerten übernommen werden).
Ihre Kernel-Parameter scheinen seltsam. Insbesondere shmall
ist eine Anzahl von Seiten, nicht Bytes, und 4 KB ist die Standardseitengröße (führen Sie getconf PAGESIZE
aus um zu überprüfen, was Sie verwenden). Wie viel Terabyte RAM hast du?
Jetzt sagen Sie, Sie erhalten ungefähr 32771 gemeinsam genutzte Speichersegmente, was auch ungefähr 32768 (oder 2 hoch 15) entspricht, was darauf hindeutet, dass ein 16-Bit-Ganzzahl mit Vorzeichen der begrenzende Faktor ist. Und welchen Kernel verwenden Sie (da dieser seine eigenen Grenzen hat)? Die beiden können verwandt sein.
Lösung 2:
Es stellt sich heraus, dass shmmni im Kernel auf 32768 begrenzt ist:
#define IPCMNI 32768 /* <= MAX_INT limit for ipc arrays (including sysctl changes) */
in der Datei ...version.../include/linux/ipc.h
.
So kurz vor dem Neukompilieren des Kernels, das ist die harte Grenze für die Anzahl der gemeinsam genutzten Speichersegmente.