Понимание ulimit -u
Я хотел бы понять, что здесь происходит.
linvx$ ( ulimit -u 123; /bin/echo nst )
nst
linvx$ ( ulimit -u 122; /bin/echo nst )
-bash: fork: Resource temporarily unavailable
Terminated
linvx$ ( ulimit -u 123; /bin/echo one; /bin/echo two; /bin/echo three )
one
two
three
linvx$ ( ulimit -u 123; /bin/echo one & /bin/echo two & /bin/echo three )
-bash: fork: Resource temporarily unavailable
Terminated
one
Я предполагаю, что первые 122 процесса потребляются самим Bash, а остальные ulimit
определяет, сколько параллельных процессов мне разрешено иметь. Документация не очень ясно об этом. Я что-то пропустил?
Что еще более важно для реального развертывания, как я могу знать, какого рода ulimit
реалистично? Это длительный демон, который порождает рабочие потоки по требованию и пожинает их при уменьшении нагрузки. Я несколько раз приводил его к смерти. Наиболее важный предел - это, вероятно, объем памяти, который я сейчас ограничил 200М на процесс, но я хотел бы выяснить, как я могу установить ограничение на количество детей (программа позволяет мне настроить максимум, но как я знаю, что в этой части кода нет ошибок?)
Приложение: В более новой системе я получаю большее число и немного другое поведение.
xubuntu12.04$ ( ulimit -u 206; /bin/echo nst )
nst
xubuntu12.04$ ( ulimit -u 205; /bin/echo nst )
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable
Terminated
xubuntu12.04$ bash --version
GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Я считаю, что в более старой системе был Bash v3.
В dash
, Я получаю другое поведение, хотя все еще не поведение, которое я ожидаю (и опция называется -p
вместо -u
):
xubuntu12.04$ dash
$ ( ulimit -p 1; /bin/echo nst )
nst
$ ( ulimit -p 2; /bin/echo nst & /bin/echo too & )
dash: 0: Cannot fork
$ ( ulimit -p 208; /bin/echo nst & /bin/echo too & )
dash: 0: Cannot fork
nst
$ ( ulimit -p 209; /bin/echo nst & /bin/echo too & )
nst
too
2 ответа
Ограничение учитывают не только подпроцессы в подоболочке, но и все, что находится в системе под вашим uid.
Таким образом, если у вас есть 200 процессов, работающих как вы где-нибудь в системе, процесс с ulimit -u 205
сможет только разветвляться, пока общее количество не достигнет 205 - то есть пять раз (если ничего не выходит).
Так работает ulimit.
Если вы хотите разрешить одному пользователю 4 запущенных процесса,
у вас будет 1+4 (один для процесса bash, который в данный момент использует пользователь)
Из моих тестов,
создал пользовательский тест,
ran ulimit -u 1
не может запустить какие-либо команды, так как Bash уже запущенный процесс,
ran ulimit -u 2
можно запустить только один процесс, например,
ps aux -> returned value but ps aux | grep test -> did not return as it's using 2 processes
Наконец, использование ulimit в вашей корневой учетной записи не рекомендуется, ulimit в основном используется для больших многопользовательских сред.
Надеюсь, это поможет!
Ура,
===============
-a All current limits are reported
-b The maximum socket buffer size
-c The maximum size of core files created
-d The maximum size of a process’s data segment
-e The maximum scheduling priority ("nice")
-f The maximum size of files written by the shell and its children
-i The maximum number of pending signals
-l The maximum size that may be locked into memory
-m The maximum resident set size (many systems do not honor this limit)
-n The maximum number of open file descriptors (most systems do not allow this
value to be set)
-p The pipe size in 512-byte blocks (this may not be set)
-q The maximum number of bytes in POSIX message queues
-r The maximum real-time scheduling priority
-s The maximum stack size
-t The maximum amount of cpu time in seconds
-u The maximum number of processes available to a single user
-v The maximum amount of virtual memory available to the shell
-x The maximum number of file locks
-T The maximum number of threads