Dos слишком много открытых файлов

Обновлено: 06.07.2024

Количество клиентских потоков составляет примерно 10, поэтому одновременно могут быть открыты только 10 файлов. Есть ли вероятность, что Delphi сразу откажется закрывать файлы? Могу ли я убедиться, что это так? Или я здесь ошибаюсь? Это единственное место, где я открываю файлы, и блок try..finally должен гарантировать закрытие открытых файлов, не так ли?

РЕДАКТИРОВАНИЕ: забудьте об изменении

Могу только посоветовать вам использовать более «современные» средства для работы с файлами. Я не знаю, есть ли ограничение на количество открытых файлов с помощью Windows API, но я только что протестировал и мог легко открыть 1000 потоков параллельно:

Я никогда не понимал, почему люди до сих пор используют нетипизированные файлы вместо TStream и его потомков в новом коде.

Изменить: в своем комментарии вы пишете, что хотите читать только текстовые файлы - в этом случае просто создайте TStringList и используйте его LoadFromFile () метод.

Вы не запускаете это на старом компьютере под управлением Windows 9x, не так ли? Если это так, возможно, вы столкнулись с проблемой дескриптора файлов DOS.

Delphi немедленно закрывается в CloseFile. Ваш пример кода кажется правильным.

Попробуйте еще раз, не делая ничего между попыткой и окончанием.

Здесь ЕСТЬ проблема безопасности потоков, хотя я не понимаю, как это могло вызвать проблему.

Проблема в том, что Reset использует глобальную переменную FileMode.

Что касается клиентских потоков - вы уверены, что они не пропадают из-за разорванных соединений или чего-то в этом роде?

Может быть полезно поместить некоторые отладочные данные вместе с Reset и Close, чтобы вы могли видеть, как долго каждый поток имеет файл, открытый.

Вам действительно нужны темы? Похоже, они создают вам проблемы. Без них было бы легче отлаживать ваш код.

Этот код должен работать нормально. Нет известных проблем, связанных с использованием файлов из многопоточного кода (насколько мне известно). Мы довольно регулярно используем такие идиомы, и все работает нормально.

Я бы предложил добавить код регистрации (перед Assign и CloseFile), чтобы увидеть, выполняется ли а) закрытие и б) у вас действительно работает только 10 потоков. Возможно, ваша логика завершения потока неисправна и CloseFile никогда не выполняется.

Почему может случиться так, что чтение из исходного файла или диска невозможно.

Введение

Выключить и снова включить

Да, это клише. Тем не менее, первое, что вы должны попробовать на компьютере с Windows, который говорит, что он не может прочитать ваши данные, это отключить его. Затем сделайте глубокий вдох, сосчитайте до десяти и снова включите его.

Во многих случаях эти ошибки сводятся к программным гремлинам, изгнанным при новой загрузке. Это займет всего несколько секунд, так что стоит пойти.


Устраняем ошибку «Слишком много открытых файлов» или «Too many open files» в 1С под ОС Linux (Red Hat 7/Centos 7)

1. Увеличиваем лимит на открытые файлы всей системы.

2. Увеличиваем лимит на открытые файлы для процессов 1С.

3. Увеличиваем лимиты на открытые файлы для процесса 1С редактированием файла демона.

4. Увеличиваем максимальное число сегментов разделяемой памяти для всей системы.

Примеры использования объекта FileSystemObject (FSO) в 1С

Объектная модель FSO позволяет работать с файлами и папками: создавать, изменять, перемещать и удалять. Получать доступ к системным папкам: наличие, расположение. Можно получать информацию о дисках, папках и файлах: их имена, атрибуты, даты создания или изменения и т.д. Кроме того, создание и манипулирование текстовыми файлами (не двоичными!).

FSO имеет следующие объекты:

Объекты FSO

Drive

Объект Drive обеспечивает доступ к свойствам логических дисков, дисководов и сетевых дисков. Данный объект возвращается методом GetDrive():

Получить все диски можно следующим образом:

Из полученного таким образом массива можно получить инфомацию о всех дисках в системе:

Для каждого ФСО_Диск из ФСО_Диски Цикл Если ФСО_Диск . DriveType = 2 Тогда // Это жесткий диск Прервать ; КонецЕсли ; КонецЦИкла ;

Свойства объекта Drive

Folder (Папка)

Объект Folder обеспечивает доступ ко всем свойствам папки. Данный объект возвращается методом GetFolder():

Свойства Folder

Методы Folder

Files (Файлы)

Объект File обеспечивает доступ ко всем свойствам файла. Данный объект возвращается методом GetFile():

Свойства Files

Методы Files

FileSystemObject

Содержит методами, которые позволяют создавать, удалять, получать информацию обо всех объектах файловой системы. Также осуществляет управление дисководами, папками и файлами. Данный объект создается при помощи команды

Свойства FileSystemObject

Свойство Описание
Drives Возвращает коллекцию состоящую из объектов типа Drive, содержащую все диски на данном компьютере. Примеры работы с этими объектами были описаны выше.

Методы FileSystemObject

TextStream

Объект TextStream обеспечивает доступ к текстовым файлам и содержимому текстовых потоков. Данный объект возвращается методами
OpenTextFile() [объект FileSystemObject];
CreateTextFile() [объект FileSystemObject];
OpenAsTextStream() [объект File].
Свойствами:
StdOut,StdIn,StdErr [объект WshScriptExec]

Свойства TextStream

Свойство Описание
AtEndOfLine Флаг окончания файла. Возвращает -1 если текущая позиция чтения файла указывает на символ конца строки, иначе 0.
AtEndOfStream Флаг окончания файла. Возвращает -1 если текущая позиция чтения текстового потока указывает на символ конца строки, иначе 0.
Column Возвращает номер текущего символа в позиции. Нумерация символов начинается с 1.
Line Возвращает номер текущей строки в позиции. Нумерация строк начинается с 1.

Методы TextStream

Несовместимость формата диска

Хотя два жестких диска могут выглядеть одинаково, способ организации их данных может существенно различаться. Каждая операционная система имеет свой собственный способ разделения физического пространства на механическом жестком диске или твердотельном диске. Единственный способ изменить эту систему — отформатировать диск, что означает, что все данные на нем будут стерты.

Windows будет хорошо играть с дисками, отформатированными в FAT16, FAT 32 и NTFS. Он не будет читать диски, отформатированные для Mac или Linux без дополнительного программного обеспечения.


Для чтения дисков в формате Mac вы можете использовать HFSExplorer. Вы можете использовать Linux Reader для чтения дисков, отформатированных для Linux. В качестве бонуса, Linux Reader также читает форматы Mac.

Если диск, на который вы пытаетесь скопировать файл FAT32, должен знать, что он не может обрабатывать отдельные файлы размером более 4 ГБ. Вам нужно будет переформатировать целевой диск в NTFS или заархивировать файл и использовать функцию разделения файлов программы сжатия.

По возможности на современном компьютере с Windows старайтесь придерживаться NTFS.

Если вы работали с программами, которым приходится обрабатывать очень большое количество файловых дескрипторов, например с распределенными базами данных, такими, как Elasticsearch, то вы, наверняка, сталкивались с ошибкой "too many open files в Linux".

Ошибка too many open files Linux

Дословно эта ошибка означает, что программа открыла слишком много файлов и больше ей открывать нельзя. В Linux установлены жёсткие ограничения на количество открываемых файлов для каждого процесса и пользователя.

Посмотреть, сколько файлов можно открыть в вашей файловой системе, можно, выполнив команду:


Посмотреть текущие ограничения количества открытых файлов для пользователя можно командой:


Утилита ulimit возвращает два вида ограничений - hard и soft. Ограничение soft вы можете менять в любую сторону, пока оно не превышает hard. Ограничение hard можно менять только в меньшую сторону от имени обычного пользователя. От имени суперпользователя можно менять оба вида ограничений так, как нужно. По умолчанию отображаются soft-ограничения:

Чтобы вывести hard, используйте опцию -H:

Вы можете изменить ограничение, просто передав в ulimit новое значение:


Но поскольку hard-ограничение составляет 4000, то установить лимит больше этого значения вы не сможете. Чтобы изменить настройки ограничений для пользователя на постоянной основе, нужно настроить файл /etc/security/limits.conf. Синтаксис у него такой:

имя_пользователя тип_ограничения название_ограничения значение

Вместо имени пользователя можно использовать звездочку, чтобы изменения применялись ко всем пользователям в системе. Тип ограничения может быть soft или hard. Название - в нашем случае нужно nofile. И последний пункт - нужное значение. Установим максимум - 1617596.

sudo vi /etc/security/limits.conf

* hard nofile 1617596
* soft nofile 1617596


Нужно установить значение для soft и hard параметра, если вы хотите, чтобы изменения вступили в силу. Также убедитесь, что в файле /etc/pam.d/common-session есть такая строчка:

session required pam_limits.so

Если её нет, добавьте в конец. Она нужна, чтобы ваши ограничения загружались при авторизации пользователя.

Если вам нужно настроить ограничения только для определенного сервиса, например Apache или Elasticsearch, то для этого не обязательно менять все настройки в системе. Вы можете сделать это с помощью systemctl. Просто выполните:

sudo systemctl edit имя_сервиса

И добавьте в открывшейся файл такие строки:

[Service]
LimitNOFILE=1617596
LimitNOFILESoft=1617596


Здесь мы устанавливаем максимально возможное ограничение как для hard- так и для soft-параметра. Дальше нужно закрыть этот файл и обновить конфигурацию сервисов:

sudo systemctl daemon-reload

Затем перезагрузить нужный сервис:

sudo systemctl restart имя_сервиса

Убедится, что для вашего сервиса применились нужные ограничения, можно, открыв файл по пути /proc/pid_сервиса/limits. Сначала смотрим PID нужного нам сервиса:

ps aux | grep elasticsearch


Затем смотрим информацию:


Выводы

В этой небольшой статье мы разобрали, что делать, если возникает ошибка "слишком много открытых файлов Linux", а также как изменять ограничения на количество открытых файлов для пользователя и процесса в Linux.

Устраняем ошибку «Слишком много открытых файлов» или «Too many open files» в 1С под ОС Linux (Red Hat 7/Centos 7)

Подробнее об ошибке

Пример полного текста ошибки:

Ошибка при выполнении файловой операции … Слишком много открытых файлов .



Описание:

Данная ошибка связана с тем, что ОС Linux исчерпала ограниченный ей лимит файлов на открытие и может возникать как при работе пользователя в пользовательском режиме, так и при работе разработчика с хранилищем конфигурации.

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


Решение:

На всех серверах 1С выполним следующие настройки лимитов открываемых файлов.

Увеличиваем лимит на открытые файлы всей системы.

1. Получим значение количества файлов, которые можно открыть в нашей файловой системе:

Скорее всего, здесь мы увидим числа порядка: 97822; 65208 и т.д.

Такие пределы нас вполне устраивают.

Данное значение используем в дальнейшей настройке.

Но, если понадобится их увеличить – добавим строку настроек в конфигурационный файл /etc/sysctl.conf любым удобным способом:

2. Перечитаем параметры:

где 6500 – это то число файлов, которое нам необходимо иметь возможность открывать в нашей файловой системе.

Увеличиваем лимит на открытые файлы для процессов 1С.

1. Отредактируем файл:

2. Перечитаем параметры:

3. Убедимся, что изменения вступили в силу. Получим pid службы:

4. По номеру pid получим значение параметра «max open files»:

Значение должно быть 65000.


Увеличиваем лимиты на открытые файлы для процесса 1С редактированием файла демона.

Результат данной настройки будет аналогичен предыдущему варианту.

2. Обновим конфигурацию демон:

3. Перезапустим демон:

Отметим также, что помимо настроек, относящихся к количеству открытых файлов – может понадобится обратить внимание на настройки максимального числа сегментов разделяемой памяти для всей системы.

Увеличиваем максимальное число сегментов разделяемой памяти для всей системы.

Все наши модифицированные настройки можем увидеть в конфигурационном файле /etc/sysctl.conf:


Еще можно посмотреть

Публикация 1С на веб-сервере Linux

Публикация 1С на Веб сервере Apache Linux

Пошаговые инструкции по публикация базы и web-сервисов 1С на веб-сервере Apache 2.4 на Linux.

Хранение файлов 1С в томах на nfs-шаре Linux


Ошибки публикации базы и веб сервиса на веб сервере 1C+ Apache +Linux.

Многие из нас привыкли публиковать базу или веб сервис 1С нажатием нескольких кнопок. Но не все из многих знают, что для этого необходимо запустить(от имени администратора!) конфигуратор 1С:Предприятие именно на той машине, где установлен веб сервер(а именно компонента веб-расширения 1С:Предприятия). В случае, если веб-сервер и компонента веб-расширения 1С:Предприятия установлены на машину с ОС Linux без […]


Администрирование серверов 1С на Linux


Ошибки сервера 1С на Linux

Описание типичных ошибок которые возникают при запуске службы сервера 1С на Linux и пути их исправления

Утилита ring license для 1С версии 8.3.14 и выше под Linux

Для чего нужен 1C ring license? На текущий момент широко распространено использование программных лицензий. И системы на базе 1С в этом не исключение. Но, помимо простой активации пин-кодов, программная лицензия 1С также нуждается в обслуживании. Для обслуживания разработчику требуются знания об инструменте для получения списков, информации, анализа состояния файлов программных лицензий. Об этом инструменте мы […]

Установка сервера 1С на linux

Установка сервера 1С Предприятие 8.3 на Linux

Пошаговый процесс установки 1С сервера на Linux. Подготовка Linux к установке. Инсталяция дистрибутива 1С сервера. Его настройка и запуск.

Читайте также: