Как работает ограничение дескриптора файла linux? - PullRequest
13 голосов
/ 21 октября 2010

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

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

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

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

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

Ответы [ 3 ]

11 голосов
/ 21 октября 2010

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

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

file-max &file-nr:

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

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

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

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

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

5 голосов
/ 21 октября 2010

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

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

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

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

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

FD_SETSIZE

Maximum number of file descriptors in an fd_set structure.

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

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

0 голосов
/ 22 октября 2010

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

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

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

...