Zu Viele geöffnete Datei Fehler in Golang
Ich bin einfach Lesen der /proc/diskstats
- Datei. Mein code ist:
func ReadFromFile(filepath string)(string){
defer func() {
if err1 := recover(); err1 != nil {
fmt.Println("!!!!!!!!!!!!!!!!Panic Occured and Recovered in readFromFile(), Error Info: ", err1)
}
}()
strData := ""
data, err := ioutil.ReadFile(filepath)
if err != nil{
fmt.Println("File read error: ", err)
return ""
}
strData = string(data)
return strData
}
Den Fehler bin ich immer:
File read error: open /proc/diskstats: too many open files
Nicht nur für diese Datei, ich bin auch immer die gleichen Fehler für einige andere Dateien.
Habe ich auch diesen Befehl ausführen:
root@golang:~# lsof|wc -l
785
Bitte guide mich.
- Was ist Ihr ulimit?
- Meine ulimit ist 1024
- ich neu gestartet, meinen Dienst, dann habe ich keinen Fehler,aber die Ausgabe von lsof|wc -l Ausgabe ist, halten Sie auf incresing.
- Schließen Sie nach dem Lesen?
- Nein, ich denke, so ,wie es zu tun. können Sie bitte helfen.
io.ReadFile
keine Datei schließen Funktion direkt. Es ist enthalten in denReadFile
Funktion selbst. Es ist also nicht erforderlich, die Datei zu schließen ausdrücklich. Es wird automatisch schließen.- ioutil.ReadFile schließt nach dem Lesen. Und dump ganze Inhalt.
- Wie rufst du die Funktion? Die Leckage scheint von woanders.
lsof|wc -l
zählt, Dateien öffnen, system-weit. Sie haben es mit der-p
option für Ihren Prozess. Es hilft auch, um wirklich zu sehen, die Ausgabe vonlsof
um zu sehen, was die open-fds sind um zu helfen, das problem zu identifizieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich lief in das gleiche problem (vielleicht verschiedene Umstände oder setup), und befestigte es anders. Ich erstellte ein einfaches und Vereinfachtes Beispiel:
Es ist eine schlechte Idee, weil
defer
ausgeführt werden, wennsome_func
zurück, das könnte eine Weile dauern - abhängig von der loop-Größe.Grundsätzlich auf UNIX-Plattformen, die OS stellen ein limit für die Anzahl offener Datei-Deskriptoren, die ein Prozess haben darf zu jeder Zeit.
Der Fehler
too many open files
angehoben wird, da Sie die Grenze erreicht der Datei (oder pipe oder socket)derzeit geöffnet ist und Sie versuchen, öffnen Sie eine neue Datei (oder pipe oder socket).Um dieses problem zu vermeiden, müssen Sie die Datei schließen, wenn Sie fertig sind, verwenden Sie die Datei öffnen mit dem
Close()
Funktion