Solution 1 :
Utilisez ipcs -l
vérifier les limites effectivement en vigueur, et ipcs -a
et ipcs -m
pour voir ce qui est utilisé, afin que vous puissiez comparer la sortie. Regardez le nattch
colonne :y a-t-il des segments sans processus attachés qui n'ont pas été supprimés lorsque les processus se sont terminés (ce qui signifie normalement que le programme a planté) ? ipcrm
peut les effacer, bien que s'il s'agit d'une machine de test, un redémarrage est plus rapide (et s'assurera que vos modifications des limites sont prises en compte).
Vos paramètres de noyau semblent étranges. En particulier, shmall
est un nombre de pages, pas d'octets, et 4 Ko est la taille de page par défaut (exécutez getconf PAGESIZE
pour vérifier ce que vous utilisez). Combien de téraoctets de RAM avez-vous ?
Maintenant, vous dites que vous obtenez environ 32771 segments de mémoire partagée, ce qui représente également environ 32768 (ou 2 sur 15), ce qui suggère qu'un int 16 bits signé est le facteur limitant. Et quel noyau utilisez-vous (car cela aura ses propres limites) ? Les deux peuvent être liés.
Solution 2 :
Il s'avère que shmmni est limité à 32768 dans le noyau :
#define IPCMNI 32768 /* <= MAX_INT limit for ipc arrays (including sysctl changes) */
dans le fichier ...version.../include/linux/ipc.h
.
Donc, à moins de recompiler le noyau, c'est la limite stricte du nombre de segments de mémoire partagée.