Im Moment weiß ich, wie man:
- Suchlimit für offene Dateien pro Prozess:
ulimit -n
- Zählen Sie alle geöffneten Dateien von allen Prozessen:
lsof | wc -l
- Erhalte die maximal erlaubte Anzahl offener Dateien:
cat /proc/sys/fs/file-max
Meine Frage ist: Warum gibt es in Linux ein Limit für offene Dateien?
open-files
limit
Xanpeng
quelle
quelle
Antworten:
Der Grund dafür ist, dass das Betriebssystem Speicher zum Verwalten jeder geöffneten Datei benötigt und der Speicher eine begrenzte Ressource ist - insbesondere bei eingebetteten Systemen.
Als Root-Benutzer können Sie die maximale Anzahl der geöffneten Dateien pro Prozess (über
ulimit -n
) und pro System (zecho 800000 > /proc/sys/fs/file-max
. B. ) ändern .quelle
/.../file-max
einen ziemlich großen Wert festlegen, solange der Speicher nicht belegt ist?file-max
scheint die Standardeinstellung für RAM-Größe geteilt durch 10 KB zu sein. Da der pro Datei-Handler verwendete reale Speicher viel kleiner sein sollte (struct file
plus einige treiberabhängige Speicher), scheint dies eine recht konservative Grenze zu sein.Bitte beachten Sie, dass
lsof | wc -l
viele doppelte Einträge zusammengefasst werden (gegabelte Prozesse können Dateizugriffsnummern usw. gemeinsam nutzen). Diese Zahl könnte viel höher sein als das eingestellte Limit/proc/sys/fs/file-max
.Gehen Sie folgendermaßen vor, um die aktuelle Anzahl der geöffneten Dateien aus der Sicht des Linux-Kernels zu ermitteln:
cat /proc/sys/fs/file-nr
Beispiel: Dieser Server hat 40096 von maximal 65536 offenen Dateien, obwohl lsof eine viel größere Anzahl meldet:
quelle
lsof
viele Dateien zweimal oder öfter gemeldet werden/dev/null
, können Sie beispielsweise Folgendes raten:lsof|awk '{print $9}'|sort|uniq|wc -l
lsof|awk '!a[$NF]++{c++}END{print c}'
, um die nicht doppelte Anzahl der geöffneten Dateien abzurufen.Ich denke, das hat hauptsächlich historische Gründe.
Ein Unix Dateideskriptor ist ein kleiner
int
Wert, zurückgeführt durch Funktionen wieopen
undcreat
und weitergegebenread
,write
,close
und so weiter.Zumindest in früheren Versionen von Unix war ein Dateideskriptor lediglich ein Index für ein Array von Strukturen mit fester Größe pro Prozess, wobei jede Struktur Informationen zu einer geöffneten Datei enthält. Wenn ich mich recht erinnere, haben einige frühe Systeme die Größe dieser Tabelle auf ungefähr 20 begrenzt.
Neuere Systeme haben höhere Grenzwerte, haben jedoch das gleiche allgemeine Schema weitgehend außerhalb der Trägheit beibehalten.
quelle
fileno
undfdopen
würde ich erwarten, dass sie nahezu austauschbar sind.int
Deskriptor oder über a zugegriffen wirdFILE*
. Wenn Sie über mehr als 20 Dateien geöffnet habenopen()
, würde diesfdopen()
fehlschlagen?