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