В последнее время у меня был 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)
Максимальный размер создаваемых файлов ядра. Дамп ядра - это снимок системы (ОЗУ + переключатель контекста + регистры процессора).
размер сегмента данных (кбайт, -d)
Максимальный размер сегмента данных процесса. сегмент данных - это часть объектного файла или соответствующего виртуального адресного пространства программы, которое содержит инициализированные статические переменные.
приоритет планирования (-e)
Максимальный приоритет планирования («хороший») процессу может быть назначен.
размер файла (блоки, -f)
Максимальный размер файлов, записываемых оболочкой и ее дочерними элементами.
ожидающие сигналы (-я)
Набор сигналов, ожидающих доставки в вызывающий поток.
https://unix.stackexchange.com/questions/197600/what-are-pending-signals
максимальная заблокированная память (кбайт, -l)
Максимальный размер, который может быть заблокирован в памяти. Блокировка памяти гарантирует, что память всегда находится в ОЗУ и никогда не перемещается на диск подкачки.
максимальный размер памяти (кбайт, -m)
Сколько памяти в настоящее время имеет процесс в основной памяти (ОЗУ), в отличие от общего количества виртуальной памяти, имеющейся у процесса.
открытые файлы (-n)
Максимальное количество открытых файловых дескрипторов. Дескриптор файла - это абстрактный индикатор, используемый для доступа к файлу или другому ресурсу ввода / вывода, например каналу или сетевому сокету.
https://en.wikipedia.org/wiki/File_descriptor
Список файловых дескрипторов: http://www.cyberciti.biz/tips/linux-procfs-file-descriptors.html
размер трубы (512 байт, -p)
Размер внутреннего буфера трубы. См. Раздел «Пропускная способность трубы» в http://man7.org/linux/man-pages/man7/pipe.7.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 возвращаться в правильное местоположение.
время процессора (секунды, -t)
Максимальное время процессора в секундах.
максимальное количество пользовательских процессов (-u)
Максимальное количество процессов, которые пользователь может запустить или разветвить.
https://en.wikipedia.org/wiki/Process_%28computing%29
Эта команда показывает, сколько процессов сейчас использует каждый пользователь:
ps h -Led -o user | sort | uniq -c | sort -n
виртуальная память (кбайт, -v)
Максимальный объем виртуальной памяти, доступной оболочке. Виртуальная память отображает адреса памяти, используемые программой, называемые виртуальными адресами, в физические адреса в памяти компьютера.
файловые замки (-Икс)
Блокировка файла - это механизм, который ограничивает доступ к компьютерному файлу, разрешая доступ только одному пользователю или процессу в любое определенное время.
Поскольку вы не упомянули, в чем именно заключается ваша проблема с ограничением в Linux, исправить ее будет сложно. Ты используешь ulimit -a
для проверки всех ваших недостатков в ОС. Также вы можете изменить все ограничения, которые у вас есть (вы можете уменьшить его, а не увеличить, кроме того, что root может делать что угодно) Попробуйте посмотреть man ulimit
чтобы узнать, какой вариант вам нужно изменить.