Лимит открытых файлов — настройки sysclt.conf

Здесь я разбираю настройки системы с помощью конфига /etc/sysclt.conf, для того чтобы задать лимит открытых файлов для системы и процессов.















Лимит открытых файлов в системе




В системе Linux каждый открытый файл занимает файловый дескриптор. Информация по занятым файловым дескрипторам и их лимит хранится в файле /proc/sys/fs/file-nr:




$ cat /proc/sys/fs/file-nr
1120    0       9223372036854775807




В выводе мы видим 3 числа:




  • Количество выделенных файловых дескрипторов (1120). Показывает количество открытых файлов в системе.



  • Число выделенных, но не используемых файловых дескрипторов (0). Ядро версии выше чем Linux 2.6 всегда показывает 0. Потому что количество выделенных файловых дескрипторов точно соответствует количеству используемых файловых дескрипторов.



  • Максимальное число файловых дескрипторов (9223372036854775807). Это и есть лимит открытых файлов в системе, который можно изменить с помощью файла sysclt.conf.




Для того, чтобы задать лимит, нужно в файле /etc/sysclt.conf задать параметр fs.file-max и указать ему значение, например:




$ sudo nano /etc/sysctl.conf
fs.file-max=1000000




Для того, чтобы изменения вступили в силу нужно выполнить команду:




$ sudo sysctl -p
fs.file-max = 1000000




В выводе мы увидим, какие изменения применяются.




И чтобы проверить наши изменения, опять посмотрим на файл /proc/sys/fs/file-nr:




$ cat /proc/sys/fs/file-nr
1120    0       1000000




После проделанного я верну всё как было:




$ sudo nano /etc/sysctl.conf
fs.file-max=9223372036854775807

$ sudo sysctl -p
fs.file-max = 9223372036854775807




Вообще, на серверах, вряд ли понадобится уменьшать данный лимит.




Лимит открытых файлов для каждого процесса




Общесистемный лимит мы рассмотрели. Теперь я покажу как задать лимит открытых файлов для каждого отдельного процесса. Но вначале посмотрим какой лимит используется по умолчанию, для этого нужно посмотреть файл /proc/sys/fs/nr_open:




$ cat /proc/sys/fs/nr_open
1048576




То есть, любой процесс в системе не сможет открыть более 1048576 файлов.




Можем поменять это значение, также используя /etc/sysctl.conf. Параметр в этом случае будет называться fs.nr_open:




$ sudo nano /etc/sysctl.conf
fs.nr_open=1024

$ sudo sysctl -p
fs.file-max = 9223372036854775807
fs.nr_open = 1024

$ cat /proc/sys/fs/nr_open
1024




Если хотите, то можете почитать официальную документацию по файлам находящимся в /proc/sys/fs/здесь.




Узнаём сколько сейчас открыто файлов у произвольного процесса




Чтобы узнать, сколько сейчас открыто файлов у произвольного процесса, выполните ls /proc/<pid>/fd | wc -l:




$ sudo ls /proc/1/fd/ | wc -l
81

$ sudo ls /proc/525/fd/ | wc -l
15




А для того, чтобы пробежаться по списку процессов определённого пользователя и узнать сколько файлов эти процессы открыли, я написал такой скрипт:




$ nano openfiles-users-procs.sh
#!/bin/bash
user=$1
function work_fun {
   ps -u $user | awk '{print $1}' | grep -v PID | while read line
      do
         echo "Открыто файлов для `ps -p "$line" -o comm | grep -v COMMAND` ("$line") = `sudo ls /proc/$line/fd/ | wc -l`"
      done
}
work_fun | sort -rnk 7




Дадим право на исполнение этому скрипту:




$ chmod u+x openfiles-users-procs.sh




И выполним:




$ ./openfiles-users-procs.sh alex
ls: cannot access '/proc/6952/fd/': No such file or directory
ls: cannot access '/proc/6953/fd/': No such file or directory
ls: cannot access '/proc/6954/fd/': No such file or directory
Открыто файлов для systemd (677) = 29
Открыто файлов для sshd (788) = 11
Открыто файлов для (sd-pam) (678) = 7
Открыто файлов для openfiles-users (6955) = 4
Открыто файлов для openfiles-users (6949) = 4
Открыто файлов для bash (797) = 4
Открыто файлов для sort (6951) = 3
Открыто файлов для openfiles-users (6950) = 3
Открыто файлов для  (6954) = 0
Открыто файлов для  (6953) = 0
Открыто файлов для  (6952) = 0




Здесь, в самом начале, вы видите ошибки. Просто процессы 6952, 6953, 6954 существовали, но пока скрипт выполнялся они уже завершились. А просто сложив все эти числа вы узнаете, сколько файлов открыто у определённого пользователя.









Итог




В этой статье я разобрал, как можно задать лимит открытых файлов используя конфиг sysclt.conf. Этот лимит накладывается ядром системы, но есть и другие механизмы накладывающие свои лимиты, о них я расскажу в следующих статьях.










2022-11-02T15:52:43
Администрирование Linux