When it comes to Solaris 10, all IPC facilities are either automatically configured or can be controlled by resource controls. In the same time, they get new default values, when applicable.
As an example, we will assume that we need to change the limit on number of
shared memory segments that can be created, and that the new default (128) is
not enough either. Before Solaris 10, you've had to set the
shmsys:shminfo_shmmni tunable parameter in the
/etc/system kernel configuration file, which is a system
wide limit, and required a reboot. This parameter is now marked
as Obsolete or Have Been Removed, and its use is clearly
deprecated.
To increase the corresponding limit up to 256 shared memory segments, we now
have to deal with the project.max-shm-ids resource control which
is controlled at the project level. The idea is to set the appropriate resource control to
a project, then execute a program in the context of this project. One method to
achieve this is to create a project at one side (using the project(4) database), and to populate the extended user attributes to
do the association between this project and a user account (using the user_attr(4) database) in order to put the new project as the default
project for the user. Or it is possible not to create an extended user
attribute with this project at all, but use its characteristics explicitly
through the newtask(1) command (and the login(1), cron(1M), and su(1M) programs, or the setproject(3PROJECT) function). But the simplest method, and
the less intrusive one, is certainly to directly put the project as the default
one for a user account. Here is how to do so.
By default, no error message is logged against the syslog
daemon for resource controls. To be able to see an appropriate message in the
messages log file, you must first enable globally the
syslog action for the wanted resource control (the default level
is notice).
# rctladm -e syslog project.max-shm-ids # rctladm -l project.max-shm-ids project.max-shm-ids syslog=notice [ no-basic deny count ]
When the limit on the number of shared memory segments is reached, one message similar to the following is write to the log file:
# grep rctl /var/adm/messages /var/adm/messages:Oct 21 16:47:29 hostname genunix: [ID 883052 kern.notice] privileged rctl project.max-shm-ids (value 128) exceeded by project 3
Here is the definition of the new project, and its configuration.
# getent project user.username
user.username:1000:Project To Increase The Limit Of SHM Segments:::project.max-shm-ids=(priv,256,deny)
#
# projects -l user.username
user.username
projid : 1000
comment: "Project To Increase The Limit Of SHM Segments"
users : (none)
groups : (none)
attribs: project.max-shm-ids=(priv,256,deny)
When a project name begin with the pattern user., the project
will automatically be set as the default one for the corresponding user,
without the need to populate the extended user attributes database. Check that
the project is set as the default project for the account
username.
# id -p username uid=100(username) gid=100(groupname) projid=1000(user.username) # # projects -d username user.username
After a login phase using the username identity, the programs
progname is launched. We can confirm the use of shared memory
segments under the context of the project user.username, and we
can consult the programs statistics report.
# ipcs -mJ
IPC status from as of Wed Oct 29 11:39:59 CET 2008
T ID KEY MODE OWNER GROUP PROJECT
Shared Memory:
m 1409286255 0 --rw-rw-rw- username groupname user.username
m 469762152 0 --rw-rw-rw- username groupname user.username
m 56 0 --rw-rw-rw- username groupname user.username
#
# prstat -n5 -cJ
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3704 username 373M 284M cpu24 2 10 0:07:37 2.1% progname/26
6785 username 285M 196M sleep 29 10 0:04:13 1.1% progname/26
4480 username 785M 697M sleep 29 10 0:11:40 1.1% progname/26
5836 username 293M 204M sleep 29 10 0:06:31 1.0% progname/26
7635 username 277M 188M sleep 29 10 0:01:00 0.9% progname/26
PROJID NPROC SWAP RSS MEMORY TIME CPU PROJECT
1000 26 6472M 6333M 26% 3:57:24 23% user.username
1 17 41M 87M 0.4% 2:39:58 0.0% user.root
0 43 184M 267M 1.1% 4:07:25 0.0% system
3 4 5856K 11M 0.0% 0:00:00 0.0% default
Total: 90 processes, 916 lwps, load averages: 4.41, 2.36, 1.04
Last, we can verify the new setting for one progname instance.
For example for PID 3704:
# prctl -n project.max-shm-ids 3704
process: 3704: bin/progname 54 80 -Xmx192m
NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT
project.max-shm-ids
privileged 256 - deny -
system 16.8M max deny -
The resource management facility can do much more than just tuning IPC settings, such as managing CPU usage, and physical memory control. It is a more fine-grained facility than what is in place before Solaris 10, and did not required a reboot anymore.
As a last word, we can note that there are command line tools to help creating and managing projects and extended user attributes for locally stored databases: respectively projadd(1M), projmod(1M), and useradd(1M), usermod(1M). But since the information sources was hosted in NIS and LDAP network directories, we did not use them for this test case though.
