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ů)
Výpis soft a hard limitu max. počtu otevřených souborů

Výpis soft a hard limitu max. počtu 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

Výpis limitů po změně uživatele

Výpis limitů po změně uživatele

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.)