Подтвердить что ты не робот

Как работают ограничения дескриптора файла Linux?

Мне сказали, что мой сервер отказался принимать клиентские сетевые подключения на определенном порту, может быть из-за отсутствия файловых дескрипторов. Я посмотрел, что это значит и читал об этом здесь: http://www.netadmintools.com/art295.html

Итак, я протестировал свою систему, и я получил следующее:

cat /proc/sys/fs/file-nr
1088    0   331287

Что это значит? Мой лимит довольно высокий, но у меня есть 0 доступных дескрипторов файлов? Зачем? Как это решить для моего сервера?

Второй столбец фактически остается на 0 даже после того, как я выключил свой сервер, он даже остается на 0 даже сразу после загрузки!

4b9b3361

Ответ 1

Вы хотите посмотреть на /proc/sys/fs/file -max вместо

Из недавнего linux/Documentation/sysctl/fs.txt:

file-max и file-nr:

Ядро распределяет файлы вручную, но пока это не освобождает их снова.

Значение в файле-max означает максимальное количество файлов- которые выделяет ядро ​​Linux. Когда вы получаете много сообщений об ошибках об окончании работы с файлами, вы можете хотите увеличить этот предел.

Исторически три значения в файле-nr обозначали число выделенные файловые дескрипторы, количество выделенного, но неиспользуемого файла ручками и максимальным количеством дескрипторов файлов. Linux 2.6 всегда сообщает 0 как количество бесплатных дескрипторов файлов - это не ошибка, это просто означает, что количество выделенных файловых дескрипторов точно соответствует количеству используемых дескрипторов файлов.

Попытки выделить больше дескрипторов файлов, чем file-max, сообщается с помощью printk, ищите "VFS: максимальный размер файла достиг".

EDIT: основная ошибка, вероятно, не в системе, заканчивающейся глобальными filedescriptors, а просто в вашем процессе. Вероятно, проблема заключается в максимальном размере для выбора.

Ответ 2

Не похоже, что вы попадаете в ограничение дескриптора системного файла. См. этот ответ.

Возможно, ваш серверный процесс использует select и, следовательно, ограничен 1024 дескрипторами? Если вы переключитесь на другой механизм, например. poll вы больше не будете ограничиваться дескрипторами 1024.

select() работает с fd_set s

Это из документации POSIX для select.h:

Следующее должно быть определено как макрос:

FD_SETSIZE

Maximum number of file descriptors in an fd_set structure.

Попробуйте найти или вывести FD_SETSIZE в вашей системе.

Если вы обнаружите, что FD_SETSIZE слишком низок для вас, я скорее попытаюсь отойти от select, чем пытаться увеличить FD_SETSIZE, что обычно сложнее.

Ответ 3

Какую ошибку вы получаете от accept() в этих обстоятельствах? Проверьте errno и сообщите об этом соответствующим образом.

В соответствии с man-страницей accept() предоставит EMFILE или ENFILE, если достигнут предел для каждого процесса или общего файлового дескриптора файла, было бы полезно узнать, какое (или было что-то еще).

Существует ограничение на дескриптор файла для каждого процесса, которое часто устанавливается на 1024, но может быть легко увеличено.