Maximální počet otevřených souborů v Ubuntu
Operační systémy a někdy i přímo jazyky, či jejich runtimy mají omezený maximální počet otevřených souborů. Z bezpečnostních a performance důvodů. Občas se vám stane, že na tento limit narazíte a potřebujete ho upravit. Jak to pořešit na Ubuntu?
Začal jsem teď na stávajícím Java projektu a první, co jsem zkusil — zbuildovat ho. Bylo tam plno testů (a mraky logování z testů) a běželo to dlouho. Život je plný překvapení: Vyskočila na mne výjimka, co jsem zatím ještě neviděl:
java.io.FileNotFoundException: /path/to/file (Too many open files)
Java používá pro maximální počet otevřených souborů limit operačního systému. Pro nastavení (nejen) tohoto limitu slouží soubor /etc/security/limits.conf
. Limity se nastavují per uživatel/skupina a nastavují se dva: soft a hard. Přiznám se, úplně nechápu, jak (pro soubory) funguje soft limit — z dokumentace jsem to úplně nepochopil. Nicméně nás bude (pro Javu) stejně zajímat pouze hard limit, který procesu řekne: Hasta la vista, baby!
Jaký limit otevřených souborů máte momenálně k dispozici, zjistíte příkazy:
ulimit -Sn
(soft limit maxima otevřených souborů)ulimit -Hn
(hard limit maxima otevřených souborů)
Příklad nastavení:
Tak. A mohli bysme mít hotovo — budete to fungovat… pokud se přihlašujete z terminálu. Typický use case by byl třeba nastavení limitů pro webový server. Pokud vás to ale trápí jako vývojáře na lokálním prostředí, tak budete muset použit příkaz su
, aby se změna v terminálu projevila. Problém je, že v grafickém prostředí se soubor limits.conf
ignoruje
Aby limit pro počet otevřených souborů vzalo v potaz i GUI, je potřeba ještě poeditovat soubor /etc/systemd/system.conf
(a v některých případech i soubor /etc/systemd/user.conf
):
Pak už stačí jen systém restartovat a máme hotovo. (Možná to jde i bez restartu pomocí nějaké systemctl magie, ale na to jsem nepřišel.)