Корневые и другие учетные записи, использующие больше описаний файлов, чем настроено с помощью ulimit - PullRequest
1 голос
/ 15 марта 2019

Теперь мне под этот вопрос задавали и раньше, но все, кажется, показывают мягкий предел. Меня беспокоит то, как процесс имеет больше файловых дескрипторов (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

1 Ответ

0 голосов
/ 15 июня 2019

Оказывается, проблема связана с тем, что «левая рука не знает, что делает правая рука».Кажется, одна команда устанавливала ограничения на системном уровне, но другая команда делала это из файлов конфигурации в /etc/default/jetty.В зависимости от того, был ли Jetty запущен из интерактивной или неинтерактивной оболочки, зависит от того, какие настройки он использовал.

Другими словами.Предел был выше, потому что предел в /etc/default/jetty был установлен выше системного.

...