it-swarm-eu.dev

Proč je v Linuxu omezen počet otevřených souborů?

Právě teď vím, jak:

  • najděte limit otevřených souborů na proces: ulimit -n
  • spočítat všechny otevřené soubory všemi procesy: lsof | wc -l
  • získat maximální povolený počet otevřených souborů: cat /proc/sys/fs/file-max

Moje otázka zní: Proč existuje limit otevřených souborů v systému Linux?

143
xanpeng

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

91
jofel

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
67
grebneke

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.

18
Keith Thompson