You don't "allocate" memory to a DMSII data base -- instead the
ALLOWEDCORE parameter sets an upper limit on how much memory the data
base will allow itself to use for I/O buffers. Buffers are allocated on
demand, as they are needed. Once the ALLOWEDCORE threshold is reached,
DMSII will start reusing buffers (writing them back to disk first if
necessary) or returning buffer areas to the system to keep its total
buffer memory usage below the threshold. Note that this affects only the
"save" memory used for buffers -- there is no control over the amount of
memory DMSII will use for control structures, code segments, etc.
Also note that the amount of buffer memory a data base uses is
potentially constrained further by the BUFFERS attribute on each
structure. That specifies a fixed number of buffers, plus a number of
per-user buffers the data base will allow itself to use. "User" in this
context is an invocation of a structure. If your program invokes a
structure three times, that's three users in terms of buffer counting.
Those buffers will not actually be allocated, though, unless the data
access pattern of the program actually requires additional buffers. Like
ALLOWEDCORE, BUFFERS should be viewed as a threshold that DMSII will try
not to cross. The BUFFERS specification is ignored, however, the the
OVERLAYGOAL parameter is non-zero.
So the first part of the answer to your question is that the amount of
buffer memory actually used by a data base depends on the access
patterns of your mix of programs. If that mix only touches 200 unique
blocks, you'll have at most 200 buffers allocated, assuming that
collection of buffers does not cross the ALLOWEDCORE or any of the
BUFFERS thresholds. If the mix you are running doesn't chew up the
remaining memory with buffers, there is no impact.
The second part of this is what happens when the mix actually does
demand more buffer memory than is available? I honestly don't know the
answer to this, as I haven't been in that position in almost 40 years.
The Accessroutines will return SYSTEMERROR #9 if main memory is
exhausted, but if the MCP has been backed that far into a corner, it's
likely that other bad things are going to be happening -- task aborts,
lockups, possibly the MCP itself will lock up. I wouldn't be surprised
if you need to Halt/Load to get out of such a situation.
It's so easy to avoid this problem, though -- ALLOWEDCORE can be changed
dynamically using the <mix>SM command. You don't need to modify the
parameter in DASDL. The value will be stored in the data base CONTROL
file and will persist across Halt/Loads and DASDL updates. Just set it
once after each time you clone the data base to your test system, and
you're done.
While most performance monitors on the market will track and analyze
both DMSII and system memory utilization, it is not that difficult to
write a utility that will do it yourself.
DMSII buffer memory utilization can be obtained on a global or
per-structure basis using the DMINQ function in DMALGOL. In particular,
see the discussion of the Get Statistics Information call (A[0]=25) in
Section 3 of the DMALGOL manual, with A[1]=0 and A[2]=1. This is the API
behind a <mix>SM STATISTICS command.
Total system memory utilization can be obtained by making a SYSTEMSTATUS
Type-2 call. See Section 3 in the SYSTEMSTATUS manual.
--
Paul