Как обезопаситься от достижения лимита File Descriptor

«Как обезопаситься от достижения лимита File Descriptor» — вопрос из категории Linux, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go можно избежать достижения лимита файловых дескрипторов, следуя этим практикам:

  1. Всегда закрывайте файлы и сетевые соединения после использования:
file, err := os.Open("file.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close() // гарантированное закрытие
  1. Используйте пулы соединений для баз данных и HTTP клиентов:
client := &http.Client{
    Transport: &http.Transport{
        MaxIdleConns:        100,
        MaxIdleConnsPerHost: 10,
    },
}
  1. Увеличьте лимит через ulimit -n в Unix-системах (обычно 1024 по умолчанию).

  2. Мониторьте использование дескрипторов с помощью lsof или netstat.

  3. Для временных файлов используйте os.CreateTemp() с последующим удалением.

  4. В случае ошибки "too many open files" - проверьте утечки через runtime.SetFinalizer.

Важно: всегда обрабатывайте ошибки при работе с ресурсами и используйте defer для гарантированного освобождения.