Оптимизация работы процессов
Ограничение использования оперативной памяти для отдельных проектов
Понятие "проект" в Solaris
Проектом в Solaris называется единица администрирования, предназначенная для оптимального управления ресурсами системы. К проекту могут относиться любые пользователи и группы, и каждый пользователь или группа могут входить в несколько проектов. В большой системе удобно определить ряд проектов в базе проектов (файле /etc/project или соответствующем файле базы NIS).
Проект характеризуется уникальным идентификатором проекта (PROJID). Каждый пользователь обязательно относится к некоему проекту по умолчанию, и какой именно это проект, определяется при входе пользователя в систему. Пользователь обязательно имеет главный проект (по аналогии с главной группой), но может участвовать в нескольких проектах.
Каждый процесс также обязательно ассоциируется с каким-нибудь проектом. Это не обязательно главный проект пользователя, запустившего процесс, так как пользователь волен отнести запущенный им процесс к любому из проектов, участником которых он является. Отнести пользователя или группу к проекту можно либо в описании пользователя в файле /etc/user_attr, либо в файле проектов /etc/project. Для тех случаев, когда администратор не позаботился о том, чтобы отнести пользователей к определенным проектам, в системе имеется предопределенный проект default, к которому относятся все пользователи, группы и процессы, для которых явным образом не указано иное.
Главный проект пользователя определяется при входе в систему следующим образом:
- если в файле /etc/user_attr запись об этом пользователе имеет атрибут project, то в качестве главного проекта пользователю назначается указанный таким образом проект ;
- если в /etc/project имется проект с именем user.UID, где UID совпадает с UID пользователя, то он назначается главным проектом пользователя;
- если в /etc/project есть проект group.groupname и groupname совпадает с именем главной группы пользователя, то этот проект назначается главным пользователю;
- если в базе проектов есть проект с именем default, то главным назначается он.
Проверка перечисленных условий производится в указанном выше порядке. В качестве базы данных проектов может использоваться не только файл /etc/project, но и база данных NIS или LDAP. Порядок обращения к службам имен (файлу, NIS или LDAP) определяется в файле /etc/nsswitch.conf:
project: files nis ldap
При использовании PAM может оказаться полезным также изучить страницу руководства pam_projects(5).
Если при входе для пользователя не удалось определить главный проект, вход пользователю запрещается.
При внесении изменений в базу данных проектов изменения коснутся только процессов, которые будут запущены после этого, и тех пользователей, которые войдут в систему после сохранения изменений. На уже запущенные процессы и уже работающих пользователей изменения не повлияют.
Файл /etc/project имеет следующий формат:
projname:projid:comment:user-list:group-list:attributes
где:
projname - это имя проекта (в нем не должно быть точек, запятых или двоеточий), то есть уникальный идентификатор проекта ;
projid - неотрицательное целое число не большее 2147483647;
user-list - список пользователей, входящих в проект, имена через запятую;
group-list - список групп, входящих в проект, имена групп через запятую;
attributes - атрибуты проекта в формате имя=значение.
Везде, где указано "список", может стоять звездочка (подразумевает "все"), имя может быть предварено восклицательным знаком, что означает "кроме этого" (!groupname - все указанные группы, кроме groupname).
По умолчанию файл /etc/project выглядит так:
system:0:::: user.root:1:::: noproject:2:::: default:3:::: group.staff:10::::
Помимо редактирования файла вручную вы можете пользоваться программами projadd, projmod и projdel для добавления, изменения или удаления проектов. Для получения информации о соответствии процессов проектам следует запускать программы ps, id, pgrep, prstat:
ps -o user,pid,uid,projid USER PID UID PROJID root 672 0 1 root 625 0 1 root 654 0 1 root 652 0 1 root 808 0 1 id -p uid=0(root) gid=1(other) projid=1(user.root)
Синтаксис вызова pgrep:
pgrep -J projidlist
например:
pgrep -J 1 | more 347 460 461 345 368 426 435 378 427 411 412 414 434 436 438 459 463 467 469 470 649 650 prstat -J PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 345 root 63M 14M sleep 59 0 0:01:35 0,8% Xsun/1 622 root 15M 2532K sleep 59 0 0:00:02 0,6% dtterm/1 470 root 141M 55M sleep 49 0 0:02:07 0,5% soffice.bin/4 820 root 7624K 4576K cpu0 59 0 0:00:00 0,3% prstat/1 672 root 4728K 696K sleep 49 0 0:00:00 0,0% bash/1 652 root 24M 3784K sleep 49 0 0:00:01 0,0% sdtimage/1 654 root 79M 10M sleep 19 10 0:00:08 0,0% java/15 195 root 5660K 0K sleep 59 0 0:00:00 0,0% syslogd/13 175 root 2160K 0K sleep 59 0 0:00:00 0,0% lockd/2 170 root 3028K 0K sleep 59 0 0:00:00 0,0% in.named/1 237 root 1348K 0K sleep 59 0 0:00:00 0,0% powerd/2 183 root 6108K 644K sleep 59 0 0:00:00 0,0% automountd/3 322 root 4360K 0K sleep 59 0 0:00:00 0,0% snmpdx/1 347 root 8632K 0K sleep 59 0 0:00:00 0,0% dtlogin/1 158 root 2412K 0K sleep 59 0 0:00:00 0,0% inetd/1 PROJID NPROC SIZE RSS MEMORY TIME CPU PROJECT 1 30 480M 99M 84% 0:04:00 2,3% user.root 0 38 135M 5788K 4,8% 0:00:00 0,0% system Total: 68 processes, 185 lwps, load averages: 0,04, 0,14, 0,14Пример 11.1. Результаты работы программы pgrep
Эта программа выполняется как интерактивная на полном экране (подобно top ).
Управление оперативной памятью с помощью rcapd
В системе Solaris, начиная с версии 9 выпуска 12/03, появился демон укупорки ресурсов (Resource Capping Daemon), который управляет тем, как процессы используют оперативную память. Управление выполняется на попроектной основе, т.е. ресурсы ограничиваются для конкретных проектов.
Демон укупорки ресурсов rcapd занимается ограничением потребления физической памяти для процессов, относящихся к проектам с установленными ограничениями. Существуют также программы rcapstat и rcapadm, предоставляющие возможность управления работой rcapd и получения статистики.