За прошедший год я закончил основные основы Linux Foundation курса администрирования Linux. Сегодня я собираюсь сосредоточиться на файловых дескрипторах и как ваше приложение создает их, а Должен Закрыть их.
Начнем с очень высокого уровня определения того, как os linux видит свой мир.
Все в бегущей системе Linux — это файл.
Файловый дескриптор — это файл, который ядро Linux создает и удаляет для каждого файла, открытого и закрытого процессом.
Ядро Linux позволяет конечное количество файловых дескрипторов!
Давайте посмотрим на это в действии. Начните свое приложение и получите PID.
java -jar app.jar ps -ef | grep app.jar
Теперь CD в каталог процессов и сделайте LS.
cd /proc/3535 ls -al
Это все информация о вашем запуске приложении, которое нуждается в ядре.
Давайте сосредоточимся на файловых дескрипторах каталог
ls -al /proc/3535/fd ls -al /proc/3535/fd | wc -l
Вы увидите, что есть номер открытых дескрипторов файлов.
Используйте ваше приложение для немного и вернитесь к этому каталогу и снова выполните команду выше.
Сколько дескрипторов сейчас сейчас?
Вернитесь в свое приложение снова и используйте его еще.
Сколько там сейчас?
Если этот номер продолжает идти вверх, вы направляетесь к неприятностям!
В конце концов вам приложение не сможет ничего делать, поскольку он больше не может открыть файловые дескрипторы.
Из моего опыта основные виновники — поток ввода/вывода Отказ
Итак, как мы решаем это?
Легкий!
Закройте ваши потоки.
Попробовать ресурсы для спасения. Откройте все, что вы транслируете в блоке TRY-STRECLES, и JVM будет обрабатывать закрытие пара для вас
//... try (InputStream data = new InputStream()){ // ... }
У Python есть похожая концепция
# ... with open('mine.txt', r) as f: # ...
Я уверен, что другие языки имеют ту же концепцию, поэтому не стесняйтесь комментировать его, и я буду обновлять сообщение.
Итак, Всегда закрывайте ваши потоки, чтобы ваше приложение в конечном итоге не упадет.
Оригинал: «https://dev.to/thomaswdmelville/how-file-descriptors-can-bring-your-service-down—17ke»