Řešení 1:
Použijte ipcs -l
pro kontrolu aktuálně platných limitů a ipcs -a
a ipcs -m
abyste viděli, co se používá, abyste mohli porovnat výstup. Podívejte se na nattch
sloupec:existují segmenty bez připojených procesů, které nebyly odstraněny při ukončení procesů (což normálně znamená, že se program zhroutil)? ipcrm
může je vymazat, i když pokud se jedná o testovací stroj, restart je rychlejší (a zajistí, že se vaše změny limitů zachytí).
Parametry vašeho jádra se zdají divné. Konkrétně shmall
je počet stránek, nikoli bajtů, a 4 kB je výchozí velikost stránky (spustit getconf PAGESIZE
zkontrolovat, co používáte). Kolik terabajtů RAM máš?
Nyní říkáte, že získáte asi 32 771 segmentů sdílené paměti, což je také asi 32 768 (nebo 2 až 15), což naznačuje, že omezujícím faktorem je podepsané 16bitové int. A jaké jádro používáte (protože to bude mít své vlastní limity)? Oba mohou souviset.
Řešení 2:
Ukázalo se, že shmmni je v jádře omezeno na 32768:
#define IPCMNI 32768 /* <= MAX_INT limit for ipc arrays (including sysctl changes) */
v souboru ...version.../include/linux/ipc.h
.
Tolik k rekompilaci jádra, to je pevný limit pro počet segmentů sdílené paměti.