Solaris::ProcessContract - Manage Solaris process contracts via
libcontract
VERSION
1.01
DESCRIPTION
This module allows you to use the libcontract(3) facility to manage
contracts for your process and any child processes you create.
The process contract system on solaris allows you to group together
related processes for monitoring and resource limiting.
By default, the child processes you create will live in the same
contract group as the parent.
The solaris smf init system uses contracts to manage the processes of
running services. This allows it do things like restart the service if
the number of processes in the contract that the service lives in drops
to zero.
This makes sense in most scenarios, like when your code is forking off
copies of itself for parallelization, since a fault in one process
probably means something is wrong with your entire service.
However, if your code is forking off worker processes that are unrelated
to the parent process, having them all in the same contract is
troublesome.
For example, if the parent process is a daemon that forks off unrelated
worker processes, solaris will fail to detect when the number daemon
processes has dropped to zero and the service is unavailable. Since the
unrelated worker processes are in the same contract, those are counted
against the "is the daemon still running?" checks.
To solve this, you need to create a new contract group for any worker
processes you fork, so that they have their own space for monitoring and
resource limitations and do not affect the parent process.
This is also a good practice for any code on solaris that forks off
worker processes for long running or resource intensive jobs, as it
allows for more accurate resource limits and better tracking of what
resources are being used.
See:
man libcontract
man contract
man process
man smf
man svc.startd
man ctrun
INSTALLATION
The libcontract(3) facility was first made available on Solaris 10, so
you need to be running at least that to install this module.
This module will fail to install if it cannot find "libcontract" while
running "Makefile.PL", but does no other checks to forcefully validate
your operating system and version.
TODO
Right now, this module gives you what you need to control the contract
system when forking processes. That is going to be the most important
need for most people writing daemon software in perl for solaris.
Ideally, it could be expanded to be able to fully monitor and
acknowledge contract system events.
It also would be nice to have access to some of the deeper info when
querying contracts, or maybe have a way to tie the proc filesystem in to
the contract filesystem so that you could query both.