Практичні максимально відкриті дескриптори файлів (ulimit -n) для системи з високим обсягом


76

Нещодавно ми розпочали тестування завантаження нашої програми та помітили, що у неї дескриптори файлів закінчилися приблизно через 24 години.

Ми працюємо RHEL 5 на Dell 1955:

Процесор: 2 x двоядерний 2,66 ГГц 4 МБ 5150 / 1333FSB ОЗУ: 8 ГБ оперативної пам'яті HDD: 2 х 160 ГБ 2,5 "жорсткий диск SATA

Я перевірив обмеження дескриптора файлу, і він був встановлений у 1024. Враховуючи, що наша програма може потенційно мати близько 1000 вхідних з'єднань, а також 1000 вихідних з'єднань, це здається досить низьким. Не кажучи вже про фактичні файли, які потрібно відкрити.

Моя перша думка полягала в тому, щоб просто збільшити параметр ulimit -n на кілька порядків, а потім повторно запустити тест, але я хотів знати будь-які потенційні наслідки встановлення цієї змінної занадто високою.

Чи є найкращі практики щодо встановлення цього завдання, крім того, щоб з'ясувати, скільки дескрипторів файлів теоретично може відкрити наше програмне забезпечення?

Відповіді:


73

Ці обмеження виникли в той час, коли декілька "звичайних" користувачів (а не додатків) поділять сервер, і нам потрібні способи захистити їх від використання занадто багато ресурсів.

Вони дуже низькі для високопродуктивних серверів, і ми, як правило, встановлюємо їх на дуже високу кількість. (24 кб або більше) Якщо вам потрібні більші числа, вам також потрібно змінити опцію максимального файлу sysctl (як правило, обмежена на 40 кб в ubuntu і 70 к на rhel).

Встановлення обмеження:

# ulimit -n 99999

Максимум файлів Sysctl:

#sysctl -w fs.file-max=100000

Крім того, і це дуже важливо, можливо, вам доведеться перевірити, чи є у вашій програмі витік пам'яті / дескриптора файлів. Використовуйте lsof, щоб побачити все, що він відкрив, щоб побачити, чи вони дійсні чи ні. Не намагайтеся змінювати вашу систему, щоб вона працювала навколо помилок програм.


1
@sucuri Дякую Ми, безумовно, стурбовані витоками ресурсів, але це, мабуть, не так. Ми спостерігали як lsof, так і netstat, і хоча кількість високих, вони не зростають, вони розширюються і стискаються. Я очікую, що якби витік, кількість відкритих розеток або дескрипторів продовжувала б зростати з часом.
Кевін

2
ulimitМежі не для кожного користувача, але в процесі! Див. Unix.stackexchange.com/questions/55319/… І fs.file-maxналаштування призначено для сервера в цілому (тому всі процеси разом).
Тонін

15

Ви завжди могли просто

cat /proc/sys/fs/file-nr

Під час ситуації з високим навантаженням можна дізнатися, скільки дескрипторів файлів використовується.

Щодо максимуму - це просто залежить від того, що ви робите.


Тут я думав, що 143000 досить добре, коли мені показана вище команда 8288 0 793377!
Шрідхар Сарнобат

6

Якщо дескриптори файлів - сокети tcp тощо, ви ризикуєте використовувати велику кількість пам'яті для буферів сокетів та інших об'єктів ядра; ця пам'ять не буде можливою заміною.

Але інакше ні, в принципі проблем не повинно бути. Зверніться до документації ядра, щоб спробувати розробити, скільки пам’яті ядра вона буде використовувати, та / або протестуйте її.

Ми запускаємо сервери баз даних з відкритими дескрипторами файлів ~ 10k (в основному на реальних файлах диска) без великих проблем, але вони 64-бітні і мають багато наборів даних.

Налаштування ulimit - це процес, але також існує загальносистемний ліміт (за замовчуванням я думаю, 32 к)


2

Я особисто не знаю жодної найкращої практики. Це дещо суб'єктивно залежно від функції системи.

Пам’ятайте, що 1024, який ви бачите, - це обмеження на кожного користувача, а не на загальну систему. Поміркуйте, скільки програм ви запускаєте в цій системі. Це єдиний? Користувач, який запускає цю програму, робить ще щось? (IE Чи є у вас люди, які використовують цей обліковий запис для входу та запуску скриптів, які потенційно можуть тікати?)

З огляду на те, що в цьому вікні працює лише ця одна програма, а обліковий запис, на якому працює зазначена програма, призначений лише для цієї мети, я не бачу шкоди у збільшенні вашого ліміту, як ви пропонуєте. Якщо це внутрішня команда розробників, я б просив їх думки. Якщо це від сторонніх постачальників, вони можуть мати конкретні вимоги або рекомендації.


@Grahamux Система призначена для цього додатка, і користувач, який запускає програму, запускає лише цей додаток. Я є частиною внутрішньої команди розробників, тому допомоги там немає.
Кевін

Ліміт не на користувача, а на процес. Дивіться unix.stackexchange.com/questions/55319/…
Тонін

1

Мені здається, одне з тих питань, на яке найкраще відповіли: "перевірити його в середовищі розвитку". Пам’ятаю, років тому Сонце нервувало, коли ти заплутався з цим, але не з таким нервом. Його межа в той час також була 1024, тому я трохи здивований, побачивши, що це зараз те саме для Linux, здається, він повинен бути вищим.

Я знайшов таке посилання навчальним, коли я шукав відповіді на ваше запитання: http://www.netadmintools.com/art295.html

І це також: https://stackoverflow.com/questions/1212925/on-linux-set-maximum-open-files-to-unlimited-possible

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.