Лимит открытых файлов — настройки 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. Этот лимит накладывается ядром системы, но есть и другие механизмы накладывающие свои лимиты, о них я расскажу в следующих статьях.


Оставьте комментарий