Accounting Errors
Mike Vilot
vilot at gsg.UUCP
Tue Dec 17 01:53:00 AEST 1985
UNIX 4.2BSD Accounting Log Errors
This message reports a major error and several lesser inaccuracies
regarding process resource usage accounting on BSD 4.2 (and also on
4.2-based ULTRIX). The comments below refer to resource usages (average
memory and CPU time) as recorded in the /usr/adm/acct file. Refer to
the acct(5) accounting structures.
Average Memory:
The average memory amount reported is too high by a factor of 100. For
actual average memory sizes greater than about 320 kbytes, this error
results in negative memory being reported (the inflated memory size
toggles the sign bit of the *short* field allocated to receive the
value).
The above error can be fixed by recompiling procedure kern_acct.c and
adjusting the denominator *i* which normalizes the memory integral. The
correct term to divide by is (100*i).
Note that if the actual (not logged--see below) sum of user and system
CPU time is less than one second, then the average memory logged will be
zero!
CPU Time:
In BSD 4.2 both user and system CPU time, as recorded in the accounting
log, now have units of integral seconds (not sixtieths of a second, as
was the case in 4.1).
Procedure kern_clock accumulates CPU times in two parts: integral
seconds and also in microseconds (with a resolution of 10000
microseconds, or one 10-msec clock tick). Unfortunately, kern_acct
ignores the *tv_usec* portion when logging CPU time.
In particular, processes having user or system CPU times of less than
one second will have these times logged as zero (and the logged average
memory usage will also be zero).
The above inaccuracy can be fixed by adding the *tv_usec* portion,
appropriately scaled to units of seconds, to the user and system CPU
times when they are logged in kern_acct.
Further Notes:
1. The TIME command does report CPU times (to resolution of one-tenth of
a second) and code+data average memory (in units of kilobytes). See
Note 4 for a comment on accuracy.
2. The SA utility is apparently still geared to 4.1. It thus assumes
that CPU times are in integral units of sixtieths of a second. Thus the
*j* option will actually yield minutes (not seconds) and the SA command
without the *j* option will yield CPU times in hours (not minutes).
Also, the memory reported by SA will be too high by a factor of 50.
3. Even with the patch to kern_acct mentioned above, the memory logged
in /usr/adm/acct will be too high by a factor of:
(decimal part of CPU time)/(actual CPU time). These
discrepancies can be seen by comparing memory usages given by
/usr/adm/acct and those given by the TIME command. The potential memory
error--even with the patch--is especially acute for total CPU times of
less than about 10 seconds. For CPU times of about 10 seconds, the
maximum memory value error is about 20%.
4. For both /usr/adm/acct and the TIME command, CPU times are
accumulated in 10-msec chunks, for whichever process has the processor
at each interval timer interrupt. Memory integrals are also computed in
kbyte-click chunks. These tally methods are approximate.
James Bouhana
Route comments or discussion to:
--
Michael J. Vilot decvax!gsg!vilot (UUCP)
General Systems Group vilot at wang-inst (CSNET)
51 Main Street MVilot at USC-ISIF (ARPA)
Salem, NH 03079 (603) 893-1000 (DDD)
More information about the Comp.bugs.4bsd.ucb-fixes
mailing list