Ответ
В Go можно избежать достижения лимита файловых дескрипторов, следуя этим практикам:
- Всегда закрывайте файлы и сетевые соединения после использования:
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close() // гарантированное закрытие
- Используйте пулы соединений для баз данных и HTTP клиентов:
client := &http.Client{
Transport: &http.Transport{
MaxIdleConns: 100,
MaxIdleConnsPerHost: 10,
},
}
-
Увеличьте лимит через
ulimit -nв Unix-системах (обычно 1024 по умолчанию). -
Мониторьте использование дескрипторов с помощью
lsofилиnetstat. -
Для временных файлов используйте
os.CreateTemp()с последующим удалением. -
В случае ошибки "too many open files" - проверьте утечки через
runtime.SetFinalizer.
Важно: всегда обрабатывайте ошибки при работе с ресурсами и используйте defer для гарантированного освобождения.