Теперь мне под этот вопрос задавали и раньше, но все, кажется, показывают мягкий предел. Меня беспокоит то, как процесс имеет больше файловых дескрипторов (fd), чем жесткое ограничение, и что это означает для производительности?
Основываясь на других онлайн-статьях, жесткое ограничение - это жесткий потолок, что может означать сбой в случае попадания?
Я должен добавить, что теперь система не сломалась, и в настоящее время работает относительно хорошо. Я просто хочу узнать, как улучшить производительность и получить преимущества для программного обеспечения, которое существует уже 15 лет.
Конфигурация
Это веб-сервер, на котором работает JAVA, который передает данные в postgresql с других устройств.
]# cat /proc/sys/fs/file-max
20854863
]# cat /proc/sys/fs/file-nr
43320 0 20854863
Запустил команду su, чтобы показать, что это для учетной записи root.
]# su - root -c "ulimit -Hn -Hu"
open files (-n) 4096
max user processes (-u) 819554
Анализ
Root работает 923 процесса
]# lsof -u root | awk '{ print$2 }' | uniq -c | wc -l
923
Из этого есть один процесс, который имеет больше fd, чем настроено
]# lsof -u root | awk '{ print$2 }' | uniq -c |
...
10823 2550
...
]# ls -l /proc/2550/fd/ | wc -l
10675
Таким образом, в зависимости от конфигурации у нас может быть намного больше процессов, чем при открытии файлов, но система не увидит этого. У нас также есть другой пользователь, название компании, и у него та же проблема. Жесткий лимит составляет 4096, но он содержит 13112 открытых файлов для одного процесса.
С тех пор мы увеличили это значение для конкретной компании до 16000, но пока не меняем root, поскольку я понимаю, что происходит.
Вопросы
Как система использует больше fd, чем настроено для жесткого ограничения?
Для процесса разветвления это делается системой или приложением, которое вы пишете? В случае нашего программного обеспечения, похоже, что java с удовольствием запускается под одним процессом, если у него достаточно fd.
Если мы сравним это с сервисом postgres, postgres с радостью запускает больше процессов, когда достигает мягкого предела или просто нуждается в других вещах.
]# lsof -u postgres | awk '{ print$2 }' | uniq -c
1 PID
678 1064
741 1067
766 1131
561 1446
681 1447
1034 36122
912 54028
951 54195
1026 56139
... about a dozen more records