Právě teď vím, jak:
ulimit -n
lsof | wc -l
cat /proc/sys/fs/file-max
Moje otázka zní: Proč existuje limit otevřených souborů v systému Linux?
Důvod je ten, že operační systém potřebuje paměť ke správě každého otevřeného souboru a paměť je omezeným prostředkem - zejména na vestavěných systémech.
Jako uživatel root můžete změnit maximální počet otevřených souborů na proces (pomocí ulimit -n
) a na systém (např. echo 800000 > /proc/sys/fs/file-max
).
Vezměte prosím na vědomí, že lsof | wc -l
shrnuje mnoho duplicitních položek (rozvětvené procesy mohou sdílet popisovače souborů atd.). Toto číslo může být mnohem vyšší než limit stanovený v /proc/sys/fs/file-max
.
Chcete-li získat aktuální počet otevřených souborů z pohledu linuxového jádra, postupujte takto:
cat /proc/sys/fs/file-nr
Příklad: Tento server má 40096 z maximálně 65536 otevřených souborů, i když lsof hlásí mnohem větší počet:
# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr
40096 0 65536
# lsof | wc -l
521504
Myslím, že je to z velké části z historických důvodů.
Popisovač souboru Unix je malá hodnota int
, vrácená funkcemi jako open
a creat
, a předána do read
, write
, close
atd.
Alespoň v raných verzích Unixu byl deskriptor souboru jednoduše indexem do pole struktur struktur s pevnou velikostí, kde každá struktura obsahuje informace o otevřeném souboru. Pokud si dobře pamatuji, některé dřívější systémy omezily velikost této tabulky na asi 20.
Modernější systémy mají vyšší limity, ale udržují stejné obecné schéma, z velké části mimo setrvačnost.