Назад | Перейти на главную страницу

Как настройки ulimit влияют на Linux?

В последнее время у меня был EAGAIN ошибка с некоторым асинхронным кодом, которая заставила меня поближе взглянуть на ulimit настройки. Хотя я четко понимаю определенные ограничения, такие как nofile, другие до сих пор меня смущают.

Достаточно легко найти ресурсы о том, как их установить, но я не смог найти ни одной статьи, в которой точно объяснялось бы, о чем идет речь, и как это может повлиять на систему.

Определение взято из /etc/security/limits.conf на самом деле не требует пояснений:

- core - limits the core file size (KB)
- data - max data size (KB)
- fsize - maximum filesize (KB)
- memlock - max locked-in-memory address space (KB)
- nofile - max number of open files
- rss - max resident set size (KB)
- stack - max stack size (KB)
- cpu - max CPU time (MIN)
- nproc - max number of processes
- as - address space limit (KB)
- maxlogins - max number of logins for this user
- maxsyslogins - max number of logins on the system
- priority - the priority to run user process with
- locks - max number of file locks the user can hold
- sigpending - max number of pending signals
- msgqueue - max memory used by POSIX message queues (bytes)
- nice - max nice priority allowed to raise to values: [-20, 19]
- rtprio - max realtime priority
- chroot - change root to directory (Debian-specific)

Так что я был бы рад, если бы кто-нибудь просветил меня об этих довольно важных настройках Linux!

Ошибка, с которой я сталкиваюсь, на самом деле:

{ [Error: spawn mediainfo EAGAIN]
  code: 'EAGAIN',
  errno: 'EAGAIN',
  syscall: 'spawn mediainfo',
  path: 'mediainfo',
  spawnargs: 
   [ '--Output=XML',
     '/home/buzut/testMedia' ],
  cmd: 'mediainfo --Output=XML /home/buzut/testMedia' }

Согласно определению на gnu.org:

Была предпринята попытка заблокировать операцию с объектом, для которого выбран неблокирующий режим. Повторное выполнение той же операции приведет к блокировке до тех пор, пока какое-либо внешнее условие не сделает возможным чтение, запись или подключение (независимо от операции).

Я это понимаю EAGAIN ошибка относится к ресурсу, который временно недоступен. Было бы неразумно устанавливать все параметры на unlimited. Таким образом, я бы понял значение того, какие параметры определяют блокировку и настраивают - ulimit настройки, мой код или оба - соответственно.

Вот мои текущие ограничения:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 127698
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 64000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 127698
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Я сделал домашнее задание и (почти) нашел, что делает каждый вариант. Кроме того, я заметил, что в /etc/security/limits.conf чем кажется с ulimit -a. Поэтому здесь я задокументировал только последнее. Конечно, всем предлагается дополнить этот ответ!

  • размер основного файла (блоки, -c)

    Максимальный размер создаваемых файлов ядра. Дамп ядра - это снимок системы (ОЗУ + переключатель контекста + регистры процессора).

    https://en.wikipedia.org/wiki/Core_dump


  • размер сегмента данных (кбайт, -d)

    Максимальный размер сегмента данных процесса. сегмент данных - это часть объектного файла или соответствующего виртуального адресного пространства программы, которое содержит инициализированные статические переменные.

    https://en.wikipedia.org/wiki/Data_segment



  • размер файла (блоки, -f)

    Максимальный размер файлов, записываемых оболочкой и ее дочерними элементами.



  • максимальная заблокированная память (кбайт, -l)

    Максимальный размер, который может быть заблокирован в памяти. Блокировка памяти гарантирует, что память всегда находится в ОЗУ и никогда не перемещается на диск подкачки.

    https://stackoverflow.com/questions/9818755/why-would-we-need-to-lock-a-processs-address-space-in-ram


  • максимальный размер памяти (кбайт, -m)

    Сколько памяти в настоящее время имеет процесс в основной памяти (ОЗУ), в отличие от общего количества виртуальной памяти, имеющейся у процесса.

    https://en.wikipedia.org/wiki/Resident_set_size


  • открытые файлы (-n)

    Максимальное количество открытых файловых дескрипторов. Дескриптор файла - это абстрактный индикатор, используемый для доступа к файлу или другому ресурсу ввода / вывода, например каналу или сетевому сокету.

    https://en.wikipedia.org/wiki/File_descriptor

    Список файловых дескрипторов: http://www.cyberciti.biz/tips/linux-procfs-file-descriptors.html



  • Очереди сообщений POSIX (байты, -q)

    Максимальное количество байтов в очередях сообщений POSIX. Очереди сообщений POSIX позволяют процессам обмениваться данными в форме сообщений.

    http://linux.die.net/man/7/mq_overview

    Очереди сообщений в целом https://en.wikipedia.org/wiki/Message_queue


  • приоритет в реальном времени (-р)

    Максимальный приоритет планирования в реальном времени. Поток с приоритетом в реальном времени никогда не может быть вытеснен прерываниями таймера и работает с более высоким приоритетом, чем любой другой поток в системе.

    https://stackoverflow.com/questions/1663993/what-is-the-realtime-setting-for-for-process-priority


  • размер стопки (кбайт, -с)

    Максимальный размер стека. Размер стека - это зарезервированная область памяти, которая используется для хранения местоположения вызовов функций, чтобы позволить операторам return возвращаться в правильное местоположение.

    https://en.wikipedia.org/wiki/Stack-based_memory_allocation



  • максимальное количество пользовательских процессов (-u)

    Максимальное количество процессов, которые пользователь может запустить или разветвить.

    https://en.wikipedia.org/wiki/Process_%28computing%29

    Эта команда показывает, сколько процессов сейчас использует каждый пользователь:

    ps h -Led -o user | sort | uniq -c | sort -n


  • виртуальная память (кбайт, -v)

    Максимальный объем виртуальной памяти, доступной оболочке. Виртуальная память отображает адреса памяти, используемые программой, называемые виртуальными адресами, в физические адреса в памяти компьютера.

    https://en.wikipedia.org/wiki/Virtual_memory


  • файловые замки (-Икс)

    Блокировка файла - это механизм, который ограничивает доступ к компьютерному файлу, разрешая доступ только одному пользователю или процессу в любое определенное время.

    https://en.wikipedia.org/wiki/File_locking

Поскольку вы не упомянули, в чем именно заключается ваша проблема с ограничением в Linux, исправить ее будет сложно. Ты используешь ulimit -a для проверки всех ваших недостатков в ОС. Также вы можете изменить все ограничения, которые у вас есть (вы можете уменьшить его, а не увеличить, кроме того, что root может делать что угодно) Попробуйте посмотреть man ulimit чтобы узнать, какой вариант вам нужно изменить.