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

Автор mihail_1, 24 апреля 2013, 11:40:48

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

mihail_1

При открытии очередного файла происходит ошибка.
Как с этим бороться?

cinyflo


mihail_1

#2
Да это все та же страшненная программа. Сама она открывает файлы функцией open().
Закрывает функцией close(). Одновременно открыто не более 128 файлов. Так же по ее запросам открывает файлы mysql. Должно быть около 800 файлов. Сокеты вроде тоже считаются. Программа их открывает функцией connect(). Их должно быть обновременно открытых не более 128, но они как-то неторопливо закрываются, поэтому может быть и больше.
Ошибка произошла в четвертом часу ночи, поэтому уже невозможно установить что там было с системой. Но проц точно не мог быть загружен бальше 10%, оперативки должно было оставаться свободной не менее 1 Gb, а свопа точно нет.

Сообщение объединено: 24 апреля 2013, 13:06:44

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

qupl

#3
Проверьте open_files_limit= в конфигах mysql.

Сообщение объединено: 24 апреля 2013, 13:08:58

И что в ОС : ulimit -n

mihail_1

mysql не жадный 64210.
а вот ulimit всего 1024

qupl

См.  /etc/security/limits.conf

Сообщение объединено: 24 апреля 2013, 13:26:41

Тыц, как пример с mysql.

mihail_1

А каков верхний предел ограничения в /etc/security/limits.conf?

qupl

Почему курить маны должен другой? :)

ЦитироватьAll items support the values -1, unlimited or infinity indicating no
       limit, except for priority and nice.

Вобщем в пределах разумного надо остановиться :).

mihail_1

Увеличение ограничения количества открытых файлов помогло.
Основное количество (около 1000) в списке открытых программой занимают примерно такие строки
Цитировать
test   3456 user 1516u  sock                0,4         24990084 can't identify protocol
test   3456 user 1517u  sock                0,4         25065435 can't identify protocol
Их количество постепенно увеличивается. Это процесс бесконечный или в какой-то момент скорость их исчезновения достигнет скорости появления?


qupl

mihail_1, если программа Ваша, то почему Вы не можете проконтролировать какие файлы и когда открываются?

mihail_1

Потому что это не файлы, а сокеты. И когда программа их закрывает, система их не уничтожает сразу, а хранит для полезного использования. Удается ли ей это или они просто зря занимают ресурсы мне неизвестно. Но то что их количество уже почти в десять раз превышает количество активных сокетов, явно говорит о том что многие из них храняться зря. Но какая логика их хранения/уничтожения прописана в системе и можно ли/стоит ли на эту логику как-то влиять мне неизвестно. И главное как много их может быть?

kobzar

Логика прописана в вашем коде...
Система только делает то что вы ей говорите.

з.ы. - Сограждане 0 предлагаю удалить топик, в виду того что у человека проблеа с кодом которая никак не относиться к дебиану.
Ты дорого мой друг, заплатишь за ошибку,..
Когда оскал мой милый, ты приймешь за улыбку.

mihail_1

kobzar, Ваши сообщения показывают, что власти у Вас куда больше, чем знаний.
Debian не занимается непосредственно открытием/закрытием сокетов, эти действия выполняет ядро.
А проблема большого количества существует далеко не только у моей программы.
Web сервер может перестать отвечать на запросы, из-за большого количества таких сокетов. Уменьшение времени их жизни приводит к снижению производительности (создавать новый дольше чем взять старый). Хорошего решения проьлемы в этом случае вроде бы нет.
Но в моем случае соединения исходящие и известно что после некоторого момента, вероятность повторных соединений с конкретным ip незначительна. Но я не знаю может ли это помочь не таскать это хвост сокетов которые уже не будут использованы.

qupl

* удалил сообщения не относящиеся к вопросу

mihail_1, в любом случае открытие/закрытие как файлов так и сокетов контролирует Ваша программа,  смотрите код в первую очередь.

mihail_1

Хотя вся программа длинная и сложная, кусок работающий с сокетами простой и короткий:
Открываю
Отправляю запрос
Цикл пока не получен конец данных или не истекло время
Закрываю
Но программа его только закрывает, а не уничтожает. И он еще некоторое время продолжает оставаться в запасе (для входящих соединений это точно так, про исходящие незнаю, но вероятно также). Это время можно уменьшать, но нежелательно. А вот есть ли другой способ ускорения закрытия таких сокетов я не нашел. К счастью в моем случае рост числа таких сокет прекратился примерно на 1500, что в принципе не смертельно (хотя без увеличения лимита было не обойтись)