4

Несколько месяцев назад я написал набор сценариев bash, использующих tmux для создания простой IDE на сервере AIX 7.1. В одном из моих скриптов есть ошибка, которая иногда генерирует пользовательские процессы очень быстро, вплоть до лимита, установленного ulimit. Это случается очень редко (примерно раз в месяц), и я уже потратил несколько безуспешных часов на отслеживание этой ошибки, поэтому я решил, что на данный момент я мог бы просто установить предел моего мягкого пользовательского процесса на что-то ниже жесткого предела ( например, 100 вместо 1024), чтобы, когда моя ошибка снова продемонстрировала себя, не было заметного снижения производительности для других пользователей на сервере. К сожалению, «ulimit -Su 100» не работает в bash в AIX 7.1, но работает в ksh. Я выполнил следующий обходной путь:

Сделал ksh оболочкой по умолчанию:

$ chsh [username] /usr/bin/ksh

Написал следующее в ~/.kshrc:

ulimit -Su 100  # works in ksh, but not in bash
/bin/bash -il   # start bash as an interactive login shell
exit            # once bash exits, exit from ksh, too

Так что теперь, каждый раз, когда я создаю оболочку, ksh устанавливает лимит мягкого пользовательского процесса и запускает bash как интерактивную оболочку входа в систему (я все еще хочу получить ~/.bash_profile). Теперь я должен задаться вопросом, будут ли ограничения на пользовательские процессы, установленные в ksh, все еще применяться в подсобках bash? В подоболочке bash верхнего уровня я запустил следующее:

$ ulimit -Sa
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) unlimited
pipe size            (512 bytes, -p) 64
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited

Как видите, ограничение пользовательского процесса установлено на 1024.

Еще одна важная проблема, с которой я столкнулся, это знание того, будет ли ограничение, установленное в ksh, включать процессы, созданные в сеансах tmux в bash-подоболочках.

Другая деталь: всякий раз, когда я создаю новую панель в tmux, я совершенно уверен, что вызывается ksh, исходит ~/.kshrc и запускается bash, как обычно. Я полагаю, что это так, потому что заголовок каждой вновь созданной панели tmux - "ksh" (по умолчанию заголовок панели tmux - это имя текущего процесса на переднем плане), но мне вместо приглашения отображается приглашение bash Кш подскажите.

Это слишком много, поэтому, я полагаю, я опущу дальнейшие детали, если только об этом не попросят.

Редактировать 1: Странное поведение

Посмотрите, что происходит, когда я пытаюсь получить лимит пользовательского процесса с помощью "ulimit -Su" (без аргументов), с использованием фермы и без нее:

$ truss ulimit -Su 2>| truss.out
100
$ ulimit -Su
1024

Может быть, я использую инструмент неправильно, но это выглядит довольно странно. Эти команды выполнялись внутри tmux.

Изменить 2: Дополнительная информация

Эти команды запускались из обычной командной строки bash - без подоболочек или tmux.

$ truss ksh -c "ulimit -Su 100" 2>&1 | grep limit
getrlimit64(9, 0x2FF1B988)                      = 0
setrlimit64(9, 0x2FF1B988)                      = 0
$ truss bash -c "ulimit -Su 100" 2>&1 | grep limit
appulimit(1005, 0)                              = 0x2001C000
bash: line 0: ulimit: max user processes: cannot modify limit: A system call received a parameter that is not valid.

1 ответ1

3

Введение в лимит ресурсов

Ограничения ресурсов в Unix-подобных системах контролируются getrlimit() и setrlimit() . Эти ограничения настраиваются для каждого процесса и наследуются при появлении нового процесса (например, с помощью fork()). Это означает, что если вы хотите установить ограничение в оболочке, команда должна быть встроена в оболочку (не выполняться как дочерний процесс). Действительно, ulimit встроен во многие оболочки, включая ksh и bash .

Наблюдаемое поведение

"Встроенная" природа ulimit объясняет различное поведение в ksh и bash .

Ограничение на количество пользовательских процессов (ulimit -u) устанавливается с помощью setrlimit(RLIMIT_NPROC, ...) . В старых версиях AIX RLIMIT_NPROC не поддерживался. <1> Поддержка была добавлена в AIX 6.1 <2, раздел 5.4.4 Реализованные изменения>, поэтому ulimit в ksh правильно использует setrlimit64() . Вероятно, bash был скомпилирован для совместимости со старой версией AIX и не может контролировать это ограничение.

Заключение

Вы можете использовать встроенный ulimit из ksh и все дочерние процессы будут наследовать настроенные ограничения. Оболочки и процессы в целом не имеют ничего общего с обеспечением и сохранением ограничений на ресурсы, если они явно не вызывают setrlimit() .

альтернатива

В AIX также есть альтернатива, которая должна работать и в более старых версиях AIX:

chdev -l sys0 -a maxuproc=100

Смотри: 3, 4

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .