Metering and Performance Analysis on Lisp Machines
“The Lisp-machine meter” is not one continuously renamed application. The inspected systems contain at least four different instruments:
- System 46 LMETER reads cumulative microcode counters before and after a form. It reports paging, map, PDL-buffer, and aging activity at the Listener.
- System 46 PTRAC records a time-ordered page trace and supplies textual decoders, filters, summaries, and paging-policy simulators. The source does not call it a process tracer.
- Maintained LM-3 System 303 METER records selected microcode events for enabled stack groups into a dedicated disk partition, then reconstructs a call tree or prints an event trace. It has a textual API, not a window-system front end.
- Genera retains the older PC Meter sampler and adds a large optional Metering Substrate plus the Dynamic Windows Metering Interface. The latter offers six run types, persistent run history, configurable fields, call-tree navigation, and programmatic form-measurement macros.
These distinctions matter historically and operationally. A cumulative counter delta cannot reconstruct a call sequence. A page-reference trace is not a function-call profile. A statistical PC histogram attributes samples to address ranges but does not recover callers. The later Metering Interface combines several collectors and views, but it does not make those underlying mechanisms identical.
This page treats “complete” at the following explicit grain:
- every user-oriented entry point and report in System 46
LMETER; - every output, filter, analysis, and keyboard-table entry in System 46
PTRAC, while excluding its internal structure accessors; - every documented control and analysis option, analyzer, output form, and report column in the maintained LM-3
METERsource; - every operation in the recovered Genera PC Meter dictionary, plus user-relevant source-only controls;
- all 27 commands in the recovered Metering Interface command dictionary, all additional interface-local commands found in the inspected 8.5 source, all dedicated keyboard and mouse gestures, all six run types and their creation options, every major output-field family, and every display sorting/filtering choice; and
- the four recovered documented short-form metering macros, with separately labeled source-only generalizations.
The inventory does not claim to cover site extensions, Joshua's separate metering integration, arbitrary collectors constructed through the substrate, or commands inherited from packages that are not loaded in the named world.
Evidence and release boundaries
MIT CADR System 46
The historical source is the public System 46 snapshot at Git revision 8e978d7d1704096a63edd4386a3b8326a2e584af.
| Release file | Bytes | SHA-256 | Evidence supplied |
|---|---|---|---|
src/moon/lmeter.21 |
5,144 | 18040dc133d0912ca24c54f1494582fc927a436f5ad79b76eab466e51120318f |
counter-delta Listener and one-form report |
src/moon/ptrace.57 |
32,764 | f48065916bae608ed53945d54a137d6f2a07885d6dddda6b4ad4659c6e243f84 |
page-trace recorder, decoders, filters, and simulations |
src/moon/ptrace.notes |
1,134 | c115283731af5ff2fc73e1b7eea1c284db75b3af72de07da250239e23471d229 |
contemporary implementation checklist and unresolved documentation work |
src/lispm/qmisc.281 |
62,028 | ed80c13e4d51f5d9b3132a8f193673f081f25d310835087c40cc8c9b08d063ad |
primitive READ-METER and WRITE-METER access |
The recovered public System 46 on-line help contains the two Qmisc docstrings but no operator documentation for LMETER or PTRAC. That omission is consistent with two contemporary manual-planning notes: one says to add LMETER to the programs chapter, and another lists “metering features” as an unwritten system topic. ptrace.notes likewise ends with an unfinished request for a brief document.
Maintained LM-3 System 303
The later public source is the maintained LM-3 System repository at Fossil check-in 4df393c68d7f083ce42d5c377039d26043cc18a9031ace28258dc97f4137eb91, tag system-303. This is maintained restoration work, not silently treated as an untouched historical distribution.
| Maintained file | Bytes | SHA-256 | Evidence supplied |
|---|---|---|---|
io1/meter.lisp |
32,671 | d5c8248fdba68d31534a676a1eb959b914be6b961b407d7e1be18993aa80eefa |
recorder control, event parsing, analyzers, and reports |
doc/meter.text |
5,275 | e625b050fbf9bd74e6c3bf20790b75a04563c3759a32d1643f6735efedbae33f |
older rough notes and sample output |
man/fd-hac.text |
83,921 | db1562bb42be7daae0fe1a16cc8bc1b9ab2c93254e546b2e84190b28ed7607a5 |
maintained user manual |
man/fd-sub.text |
64,764 | 5f52eb0f9bc4609540a06c54120676b3febd73bd00fbf9f80a2002e83ff35a8e |
explicit separation of raw microcode meters from Lisp metering tools |
sys/sysdcl.lisp |
25,396 | 2999f1824666171d729dae611a09204ac0bd42373f30d7d22c733f904c27a6dd |
one-module METER system declaration |
The current files were independently compared byte-for-byte with the named Fossil check-in. The maintained microcode sources were also inspected where a rough documentation claim conflicted with meter.lisp.
Licensed Genera 8.5 material
The Genera source observations use the locally purchased Open Genera archive and the Genera 8.5 world it supplies. The source, world, and decoded help remain ignored and are not linked or redistributed. The descriptions below are original evidence summaries.
| Release pathname | Evacuated version | Bytes | SHA-256 | Evidence supplied |
|---|---|---|---|---|
sys.sct/sys2/pcmeter.lisp |
3032 | 20,225 | 0b5b565c9d97dd7b800fbe21b6df0e8a034ca6e8118ca992c92fc65f7d68a718 |
older PC Meter implementation |
sys.sct/metering/metering-sysdcl.lisp |
46 | 5,011 | d75541a6f3187fc5bb62c8c60985b7e19c6226f86fdaf79fa9a0c6b9a05ab26b |
Metering Substrate composition |
sys.sct/metering/commands.lisp |
4036 | 20,208 | 8182bc3c5c544bed5a8973b8f2bc3d5bfa797aeb397645dc8c5ac41fae4f06ab |
substrate's public control layer |
sys.sct/metering/function-call-metering.lisp |
4060 | 50,339 | f3250a9337dd7892ba86018395c69abc4af22a6803043862901a61e40dc877e7 |
trap controls and fudge-factor calibration |
sys.sct/metering/pc-metering.lisp |
4013 | 20,531 | 9f855228f739ef7803558eebdf8ec8199b1e32fe1e33c287ee6011029dfb8d51 |
PC sampler as a substrate collector |
sys.sct/metering/utilities/measure-form.lisp |
4027 | 30,011 | 94e3601ffc223bde410a22f5dbb044ea11aef1f17198d2936f4365ed586b180f |
short-form measurement and histograms |
sys.sct/metering/interface/sysdcl.lisp |
17 | 3,713 | 1d44d34bb349a5f75c5a356da91e0050292a651c56e9e83ddf945611acc09b4c |
interface system and six run modules |
sys.sct/metering/interface/mi.lisp |
229 | 111,662 | 47a0156b1ef4a51c3abbc585628a0096ce116093a8c402d3702b24cd20295f82 |
program framework, commands, fields, and run creation |
sys.sct/metering/interface/call-tree-mixin.lisp |
34 | 33,406 | 6429e320c168aad4e8ab7421bfddb9237e595dbf893f8e6ef618be0fc6218419 |
call-tree filtering and gestures |
sys.sct/metering/interface/function-call-mixin.lisp |
14 | 11,866 | 392f8e37fb2e53b701328ce537867859627de981d06b2496fbf36beeb1ba18a4 |
function-list sorting and filtering |
sys.sct/metering/interface/function-call-metering-run.lisp |
21 | 34,903 | fe94fdaa36c2c0e3bd0c5f0947c2dbc8946ce2964e1773205abb5c2d872fa129 |
deterministic function-call fields |
sys.sct/metering/interface/call-tree-metering-run.lisp |
23 | 39,315 | e289107a3a1e256b0e508b668482edee18c01f857f309b97a338e67acb04ac92 |
deterministic call-tree fields |
sys.sct/metering/interface/statistical-function-call-metering-run.lisp |
20 | 13,550 | c75bf843017b4c55cc4407f663eed031244edcf0b2c94b9946ad3a0b22161ef0 |
sampled function fields |
sys.sct/metering/interface/statistical-call-tree-metering-run.lisp |
27 | 25,942 | d56d8cc3e49d6c224bfe1acc84f108136232cfd7eb61a8b6213a2eef93bcb36d |
sampled call-tree fields |
sys.sct/metering/interface/page-trace-metering-run.lisp |
31 | 37,006 | 8a1da815be71a16ed344d8ebda2a8b0530a97f428c664667150de461d488276d |
Page Fault run and event display |
sys.sct/metering/interface/pc-metering-run.lisp |
25 | 16,727 | 12061125cbcf997711ed2ccaf3cfc9b64a068e1f6877a6faf97da07ca77cc264 |
Statistical Program Counter run |
The local system directories identify both METERING and METERING-INTERFACE component patch levels as 444. Recovered installed help is from documentation system 440, so a difference between help and source is reported as a versioned difference, not silently treated as a typo.
| Installed logical document | Evacuated version | Source bytes | Source SHA-256 | Records |
|---|---|---|---|---|
doc:installed-440;meter-int;meter-int1.sab |
42 | 40,432 | 4042cc4fe8e893c620732f7dd1369d88bb388f1dedea587c6afc72383b87a6cf |
12 |
doc:installed-440;meter-int;meter-int2.sab |
37 | 61,012 | 75466b34970ae3e8dc032a77c08969e4417fd13fe8913b900f397cc17641c96e |
29 |
doc:installed-440;meter-int;meter-int3.sab |
31 | 97,962 | db7222a7244806caacba78c9981bb9232609fdfcb520a0bec9f7284c89bec9ba |
18 |
doc:installed-440;meter-int;meter-int4.sab |
11 | 24,848 | 42f5b152a12b0ab627162effa73a0b74c690d36d16a6448d66df23cf904e2bfc |
8 |
doc:installed-440;meter;pc-meter.sab |
11 | 15,772 | b9ec9462b9dd74b19a08b21dc2bb415f77793692e073779e5cc55bf4e62d0c77 |
17 |
The public manual cross-check is the Metering Interface and PC Metering material in Symbolics's Program Development Utilities, Genera 8. The optional-system loading instruction is also present in the Genera 8.3 Software Installation Guide for the NXP1000. Both were verified 2026-07-18.
System 46: LMETER is a counter-delta tool
The primitive READ-METER and WRITE-METER functions address named entries in the microcode's A-memory counter block. LMETER builds two user tools on that primitive; it does not collect a stream of events.
| Entry point | Behavior | Visible report |
|---|---|---|
READY-ON |
Replaces the ordinary Listener read/eval/print loop until READY-OFF; snapshots counters before each evaluation and prints their deltas after evaluation, excluding read and print time |
elapsed seconds; disk reads, writes, and fresh pages; first- and second-level map reloads; PDL-buffer read, write, and memory faults; pages aged and age-flushed |
READY-OFF |
Throws to the catcher installed by READY-ON |
no report; restores control to the caller |
METER form |
Evaluates one quoted form, prints its result, then computes counter changes | memory and wired size; map reloads; PDL-buffer faults; disk reads, writes, errors, and fresh pages; aging rate, calculated lap time, pages aged, and pages made flushable |
READY-ON also maintains the Listener history variables -, *, and +. Its display is deliberately compact: a single braced status line follows each evaluation. METER prints a multi-line report but does not measure a call tree, attribute costs to individual functions, or remove the cost of the evaluated form's own output.
Revision 21 differs from revision 20 only by the addition of the MIT copyright notice. This is useful negative lineage evidence: the inspected System 46 tool's behavior did not change between those two evacuated versions.
Raw meters are not the later Meter application
The name collision persists into System 303. Its maintained subsystem manual explicitly distinguishes the READ-METER/WRITE-METER microcode counters from the Lisp metering tools. LMETER uses those counters directly; LM-3 METER instead records event frames. Calling both simply “the meter” obscures a real architecture change.
System 46: PTRAC is a page-reference trace
The ptrace.57 heading calls itself “Page-trace support macrocode.” No inspected source expands PTRAC as an acronym, so this page preserves that uncertainty. What is certain is its subject: page-ins, page-outs, and their paging context, not scheduler/process events in general.
Record layout and lifecycle
PAGE-TRACE-ON allocates a wired, static ART-32B array, by default large enough for 2,000 four-word records. Each record contains:
- a clock sample;
- the referenced virtual address;
- flags for swap-out, stack-group switch, transport, scavenging, and asynchronous activity, together with a low micro-PC field; and
- a sampled current function taken from the machine's M-AP register.
The recorder validates that loaded microcode symbols match the running microcode version, clears the array, wires it, and enables the %PAGE-TRACE microcode hook. PAGE-TRACE-OFF disables the hook, unwires the array, and releases the GC arrest. GC is arrested because collection or flipping could change address and region meanings; the source also warns that flipping invalidates a trace.
The “current function” is explicitly heuristic: the microcode samples M-AP at the page event and hopes it is representative. The decoder stores area and space names, function, and micro-PC symbol information in list records before a later flip can invalidate those interpretations.
Complete user-oriented PTRAC surface
| Group | Entry points | Result |
|---|---|---|
| Start/stop | PAGE-TRACE-ON &optional trace-size, PAGE-TRACE-OFF |
enable or disable recording and manage wiring/GC arrest |
| Decode current buffer | PRINT-PAGE-TRACE &optional last-n, LISTIFY-PAGE-TRACE &optional last-n |
newest-first text, or an oldest-first list of decoded PAGE-TRACE-ELEMENT records |
| Decode saved list | PRINT-PAGE-TRACE-LIST list |
oldest-first text with inter-event deltas |
| File output | FILE-PAGE-TRACE filename &optional last-n, FILE-PAGE-TRACE-LIST filename list |
print current or saved trace to a file |
| Editor output | BUFFER-PAGE-TRACE buffer &optional last-n, BUFFER-PAGE-TRACE-LIST buffer list |
append a page break and report to a named editor buffer |
| Filters | FILTER-SWAP-IN list in-p, FILTER-AREA list area, FILTER-SPACE list space, FILTER-SCAVENGER list scavenger-p |
return a filtered reference string without changing the records |
| Basic summary | SUMMARY-INFORMATION list, REPORT-AREA-COUNTS list |
counts of swap-ins, scavenger/transporter/async activity and distinct pages; or page-fault counts by area |
| Re-reference analysis | SUMMARIZE-RE-SWAPINS list max-interval, SUMMARIZE-THRASHING list max-interval &optional show-p |
interval distributions for repeated swap-ins or swap-out/then-in pairs |
| Policy simulation | SIMULATE-HYPER-PAGING list hyper-page-size &optional max-time-interval, SIM-FIFO list memory-size, SIM-LRU list memory-size, SIM-DEFERRED-CACHE list memory-size &optional cache-size, GROUP-SWAP-HACK list fifo-size area-group-size-alist |
estimated locality and alternative paging-policy results |
| Page-table inspection | PRINT-PHT-STATS, REPORT-WIRED-PAGES &optional area-name |
page-table swap-status totals or wired-page area scan |
The textual trace heading says that entries are newest first and identifies the columns as delta milliseconds, address, flags, micro-PC, and macro function. Each decoded line can show the area and region space type plus OUT, SCAV, TRAN, and ASYN flags.
Two shortcuts are pushed into TV:*ESCAPE-KEYS*:
- the character named
HAND-UPcallsPAGE-TRACE-ON; and HAND-DOWNsends the current trace to an editor buffer namedPAGE TRACE.
These are entries in the historical TV escape-key table. Without a compatible System 46 runtime, this page does not guess how a particular modern keyboard mapping labels those characters.
Source-visible limits and unfinished work
- A proposed 512-by-512 scatter plot of space interval against time interval is present only as commented code in revision 57. It is not a shipped command.
ptrace.notessays the filters, evaluated address fields, micro-PC timing investigation, and GC arrest were completed, but a brief user document was still outstanding.- Revision 57 improves wiring, adds more region-space decodes, handles the special free-memory address, and reformats output relative to revision 54. It comments out the scatter plot that was live in revision 54.
- Several simulations describe their own approximation limits. For example, the group-swap model does not fully model memory residency or induced paging, and the deferred-cache simulation omits some verification references.
LM-3 System 303: disk-backed microcode event metering
The maintained METER system is one source module. Its rough documentation says that it is awaiting a window-system interface, and the maintained system declaration still contains no graphical module. Its workflow is Listener- and file-oriented:
- create or locate a disk partition named
METR; - enable selected stack groups, processes, windows, or all stack groups;
- reset the recording buffer;
- execute forms with selected microcode event bits enabled; and
- analyze the event frames into a call tree, summary, or event listing.
The microcode writes complete records into a wired memory page and spills full pages into METR. A record does not cross a page boundary. Its common header holds event code and length, real-time clock, accumulated disk-wait time, page-read count, current stack group, current function, and regular-stack depth. Function entry/exit and stack-switch records add event-specific values; page records add the fault address and micro-PC/flag information.
Because records contain raw Lisp pointers outside the collected heap, the tool arrests the GC process. The operator must call METER:RESUME-GC-PROCESS after finishing.
Recording controls and event mask
| Interface | Exact behavior |
|---|---|
METER:RESET |
disables microcode events while resetting the memory pointer, disk address, and remaining partition count |
METER:ENABLE &rest things |
enables the stack group denoted by each stack group, process, or window; T enables all stack groups globally |
METER:DISABLE &rest things |
disables named objects; no arguments disables all tracked objects; T disables only the global enable |
METER:METERED-OBJECTS |
records the objects enabled through the API |
METER:SUSPEND |
prevents further disk spill by setting remaining disk count to zero |
METER:RESUME-GC-PROCESS |
revokes the METERING GC arrest reason |
METER:TEST form &optional enables |
resets, enables only the current stack group, evaluates one form, then disables it; default event mask is octal 14 |
METER:RUN &rest forms |
resets and evaluates forms using stack groups already enabled; event mask is octal 14 |
METER:PRINT-RAW-DATA |
prints raw event number and record length for every frame |
SYS:%METER-MICRO-ENABLES uses bit 1 for page faults, 2 for consing, 4 for function entry/exit, and 8 for stack-group switches. The default octal 14 therefore records function boundaries and stack switches. Stack-switch records are essential to avoid charging time spent in another stack group to the function that happened to be active before the switch.
The maintained microcode implements page-in and page-out recording when bit 1 is enabled. A cons event number and analyzer slot exist, but meter.lisp marks the cons event unimplemented and no corresponding microcode recording routine was found.
Complete METER:ANALYZE option and report surface
General keywords are:
| Keyword | Meaning |
|---|---|
:ANALYZER |
event table or analyzer name; default :TREE, alternative :LIST-EVENTS |
:STREAM |
write to the supplied stream |
:FILE |
create an output file and close it afterward |
:BUFFER |
append through an interval stream to a named editor buffer |
:RETURN |
retain and return the parsed intermediate structure |
:INFO |
reuse a returned intermediate structure instead of rereading METR |
The :TREE analyzer accepts:
| Keyword | Meaning |
|---|---|
:OUTPUT |
METER:TREE-NULL, METER:TREE-PRINT, or default METER:SUMMARIZE-TREE |
:FIND-CALLERS |
replace normal output with caller counts for one function spec or a list |
:STACK-GROUP |
restrict TREE-PRINT, SUMMARIZE-TREE, or caller output to one stack group or a list |
:SUMMARIZE |
restrict summary rows to one function spec or a list |
:INCLUSIVE |
include callees in a function's totals; recursive calls can therefore be counted more than once |
:SORT-FUNCTION |
MAX-CALLS, MAX-RUN-TIME (default), MAX-REAL-TIME, MAX-PAGE-FAULTS, or MAX-RUN-TIME-PER-CALL |
The three tree reports answer different questions:
TREE-PRINTprints every reconstructed call-tree node with indentation, function, own real/run time and faults, and descendant real/run time and faults.SUMMARIZE-TREEmerges nodes by function and prints Functions, # calls, Run T, Faults, and Real T, followed by totals.TREE-FIND-CALLERSprints caller, callee, and call count for the requested callees.
:LIST-EVENTS prints one row per event with real time, run time, cumulative page faults, stack-group name, current function, stack depth, event kind, and event-specific data. Function records show calls and returns; stack-switch records name the old stack group; page records show page-in/page-out, address, area, and decoded microcode position.
Documentation drift is evidence
The older rough doc/meter.text calls the analyzer option :FILTER; the maintained source parser and formal manual call it :ANALYZER. Passing :FILTER to the inspected implementation does not select an analyzer: it falls through into analyzer-specific options and is rejected. The rough note also says page-fault recording is unimplemented, whereas the maintained microcode contains explicit page-in and page-out recording paths. The consing statement remains accurate.
This is an example of why the manual layers cannot be collapsed. The rough note captures an earlier state and design intent; the maintained source and formal manual describe a later interface.
Genera has three metering layers
1. The older PC Meter
PC Meter predates the Metering Interface, which the installed documentation dates to Genera 7.2. It statistically samples the current macro-PC into a wired array of address-range buckets. On 3600-family hardware the sampling source can be an audio microtask or a FEP task; on Ivory/IMach the inspected source uses a periodic interrupt handler. Samples outside the configured address range are counted as misses.
The recovered dictionary documents the following complete operation set:
| Operation | Purpose |
|---|---|
METER:MAKE-PC-ARRAY size |
allocate and wire the sample array |
METER:MONITOR-ALL-FUNCTIONS |
make the current compiled-function address extent the monitored range |
METER:SETUP-MONITOR &optional start end |
map an address interval into the array |
METER:MONITOR-BETWEEN-FUNCTIONS lower upper |
use two functions as approximate range boundaries; compilation/region allocation can invalidate the assumption |
METER:EXPAND-RANGE start-bucket &optional end-bucket |
remap the whole array onto an inclusive old bucket range |
METER:START-MONITOR &optional clear |
enable sampling, normally clearing prior counts |
METER:STOP-MONITOR |
disable sampling |
METER:REPORT &optional function-list |
print totals and per-bucket percentages/functions |
METER:PRINT-FUNCTIONS-IN-BUCKET bucket |
print compiled functions mapped to a bucket |
METER:LIST-FUNCTIONS-IN-BUCKET bucket |
return those function names as a list |
METER:RANGE-OF-BUCKET bucket |
return bucket start and limit addresses |
METER:MAP-OVER-FUNCTIONS-IN-BUCKET bucket function &rest args |
invoke a callback for each compiled function in a bucket |
METER:FUNCTION-RANGE function |
return the first and last buckets occupied by a function |
METER:FUNCTION-NAME-WITH-ESCAPES object |
decode a compiled function or microcode escape object |
METER:WITH-MONITORING clear body... |
unwind-protected start/body/stop wrapper |
REPORT first prints total, ignored, and listed sample counts and the percentage listed. Each subsequent row identifies a bucket, percentage, and either one function or a truncated indication of multiple functions.
Source adds user-relevant operations omitted from the recovered dictionary: UNMAKE-PC-ARRAY, PC-METERING-SUPPORTED-P, sampling-rate query/setters, FUNCTION-LIST with a threshold, and ESCAPE-MONITOR. The apparent escape-key registration for ESCAPE-MONITOR is commented out, so it is not counted as a live key binding.
2. The optional Metering Substrate
METERING-SUBSTRATE is a general instrumentation framework, not a screen. Its system declaration is marked optional and not advertised. The module order was deliberately flattened because the source says the system-construction tool had dependency bugs; that comment is restoration-relevant evidence, not a claim that the conceptual architecture is random.
The architecture separates:
- triggers, which define observable events or boundaries;
- regions, which pair an entry and exit and can compute differences;
- controls, which decide scope and when instrumentation is switched on;
- generators, which create values at a trigger;
- collectors, including records, histograms, and backtraces, which retain generated values; and
- generated/inserted/wirable code, which installs fast instrumentation into function and machine paths.
The command layer exposes composition operations rather than a fixed profiler: attach a collector or generator to a trigger, name generated values, filter events, meter conditionally, set a control's scope/switch, turn a function into a metering region, remove function metering, display/reset collectors, show active metering state, and reset or disable the utility. The Metering Interface uses this substrate to construct its standard run types.
Function-call metering calibrates entry and exit overhead. The first interface selection computes repeated “fudge factors” so this overhead can be subtracted and an error estimate displayed. The source default on VLM is to ignore inconsistent trials rather than prompt, while the recovered general documentation describes the interactive Retry once, Retry, and Ignore choices. That machine-conditional source behavior is another reason not to generalize hardware instructions to Open Genera without qualification.
3. The optional Metering Interface
Loading system METERING loads METERING-SUBSTRATE and then the Dynamic Windows interface. The site system file deliberately maps the name METERING to the interface system, while METERING-SUBSTRATE maps to the lower layer. After loading, the program's Select key is %.
The source layout has a title, an interactor, a command menu, a History of Metering Runs pane, a separate field-header pane, and a Metering Results pane. Runs remain in the Lisp world until explicitly deleted or a cold boot. The six top command-menu items, in source order, are:
| Row | Menu items |
|---|---|
| 1 | Meter Form, Meter in Process, Re-Meter, Set Display Options, Show Metering Run, Help |
Metering Interface run types and creation options
| Run type | Collection and indexing | Availability |
|---|---|---|
| Function Call | records every function entry/exit and indexes merged data by function | form or process |
| Call Tree | records every function entry/exit and indexes by complete calling path | form or process |
| Page Fault | records paging-system events and indexes by page-fault event | form or process |
| Statistical Function Call | periodically samples the metered process's current function | form or process |
| Statistical Call Tree | periodically samples the metered process's stack trace | form or process |
| Statistical Program Counter | microcode/interrupt PC samples with iterative range expansion; exclusive time only | form only, and only when PC metering is supported |
For either creation command, What to meter is one of Everything, Only When Enabled, or Within Functions. The second choice restricts collection to the dynamic scope of MI:WITH-METERING-ENABLED; the third asks for a sequence of function specs and installs metering regions around them.
Complete Meter Form arguments
| Argument | Applies to | Meaning/default |
|---|---|---|
| form | all | expression to execute and meter |
| metering type | all | one of the six types above |
| what to meter | all | Everything, Only When Enabled, or Within Functions |
:METERED-FUNCTIONS |
Within Functions | sequence of defined function specs |
:NAME |
all | optional history/display name |
:COUNT |
all | number of trials; only the last is collected; default 1 |
:WITHOUT-INTERRUPTS |
Function Call, Call Tree, Page Fault, Statistical Program Counter | execute the measured extent without scheduler preemption; default No and potentially dangerous |
:INITIALLY-FLUSH-ALL-PAGES |
Page Fault | flush before collecting; default No |
:SAMPLING-INTERVAL |
Statistical Function Call, Statistical Call Tree, and PC sampling when the architecture supports rate control | approximate seconds between samples; source default 1/30 second for process samplers |
:RESOLUTION-PERCENTAGE |
Statistical Program Counter | recursively expand peaks above this share; default 0.5 percent |
The documentation-440 command page does not list :SAMPLING-INTERVAL, but the inspected 8.5 source accepts it. It is therefore labeled source-visible in the later component rather than retroactively inserted into the older dictionary.
Before the collected trial, the implementation executes the form COUNT - 1 times. It compiles forms whose operator or arguments cannot safely be applied directly and asks whether to continue if compilation produced warnings.
Complete Meter in Process arguments and controls
| Argument | Meaning/default |
|---|---|
| process | process whose activity is sampled/instrumented |
| metering type | any type except Statistical Program Counter |
what to meter and :METERED-FUNCTIONS |
same scope choices as Meter Form |
:NAME |
optional run name |
:START-AND-STOP |
Until End chosen (default) or Function keys |
:MODE-LOCK-P |
collect only while the Mode Lock key is down; default No and polled rather than immediate |
:INITIALLY-FLUSH-ALL-PAGES |
Page Fault only |
:SAMPLING-INTERVAL |
Statistical Function Call and Statistical Call Tree |
With Function keys, Function-( starts and Function-) finishes the run. Mode Lock can gate either start/stop scheme; with Function keys both conditions must be true. With the default scheme, the current source presents a completion choice in the Metering Interface. Installed help additionally says the END key ends the run. Runtime verification of the exact Open Genera key path remains pending below.
Starting or stopping in the middle of a function has visible consequences. A Call Tree run can show multiple apparent roots because the real root was entered before recording. A Function Call run counts only completed entry/exit pairs; an incomplete final invocation can be invisible as such after earlier completed calls have already contributed data.
Complete command inventory
The installed documentation-440 dictionary contains 27 named commands. The table is exhaustive for that dictionary; source-only additions follow it.
| Group | Documented commands |
|---|---|
| Create/repeat/show | Meter Form, Meter in Process, Show Metering Run, Re-Meter |
| Run lifecycle | Describe Metering Run, Delete Metering Run |
| Display state | Set Display Options, Lock Results Display, Unlock Results Display |
| Major fields | Add Output Field, Delete Output Field, Move Output Field, Describe Output Field, Expand Field |
| Subfields/defaults | Add Output Subfield, Delete Output Subfield, Set Default Output Fields for Type, Set Output Fields of Run From Defaults |
| Call-tree navigation | Hoist Node, Dehoist, Hide Node Children, Show Node Children, Show All Node Descendants, Hide All But Path to This Node, Hide Node, Set Indentation Depth |
| Help | Metering Interface Help |
The 8.5 source defines these additional interface-local commands or distinct subfield variants:
| Source-visible command | Visibility/effect |
|---|---|
| Clear Output History, Copy Output History | command-table operations adapted from general Dynamic Windows tools |
| Scroll Window | common internal target for four dedicated scroll accelerators |
| Wipe Text | pushes marked results text to the kill ring |
| Move Output Subfield, Describe Output Subfield | distinct source commands where documentation groups the operation with the major-field command |
| Open Ladder Below Node | recursively opens descendants whose selected component exceeds a percentage of the parent; default 80 percent |
| Open Sub Faults | toggles subevents for a main Page Fault event by clicking it |
An old Display Page Fault Meters command remains inside a block comment and is not counted as live. The program also explicitly installs the standard commands Edit Definition, Report Bug, Set Window Options, Show Callers, Show Compiled Code, and Show Function Arguments, in addition to inherited Help Program and Standard Arguments command tables.
Show Metering Run normally makes a run current. With an output destination it can render to a buffer, window, or printer; installed help excludes direct file and stream destinations. A buffer can subsequently be saved to a file.
Complete dedicated keyboard and mouse interface
Symbolics notation uses c for Control, m for Meta, s for Super, and sh for Shift.
Keyboard accelerators and asynchronous controls
| Key | Command or effect |
|---|---|
Select-% |
select the Metering Interface |
c-sh-D |
Describe Metering Run for the current run |
c-m-R |
Re-Meter the current run |
c-m-U |
Dehoist one level; positive numeric argument chooses levels, zero or an infinite argument goes all the way |
Scroll |
vertical forward scroll; numeric argument changes screen/line/end behavior |
m-Scroll |
vertical backward scroll |
s-Scroll |
horizontal forward scroll |
m-s-Scroll |
horizontal backward scroll |
s-W or m-W |
Wipe Text from the results pane into the kill ring |
Function-( / Function-) |
asynchronously start/finish a process run when that start/stop method was selected |
| Mode Lock | synchronously gates collection when :MODE-LOCK-P is Yes; the source polls every 0.5 seconds |
Mouse gestures by presentation
| Gesture | Run/menu/field behavior | Call-tree/Page Fault behavior |
|---|---|---|
| Left | invoke a command-menu item; show a run | toggle node children; toggle Page Fault subevents in current source |
| Middle | describe run, command, field, or subfield; expand data | describe/expand the selected presentation |
| Right | context menu | node/event context menu where supplied |
sh-Middle (:delete) |
delete run, field, or subfield | hide a node and descendants |
c-m-Left |
add a major field from a run or a subfield from a field | — |
c-m-Middle |
move a field or subfield | — |
s-Middle |
Re-Meter a run | — |
m-Left |
Set Display Options on a run | hide all but the path to a call-tree node |
sh-Left |
— | hide visible node children |
s-m-Left |
— | hoist a node, or dehoist if it is already the root |
s-m-Middle |
— | make the selected node's depth the zero-indentation depth |
s-c-Left |
— | show all descendants in the inspected 8.5 source |
s-Left |
— | source-only Open Ladder Below Node, defaulting to descendants over 80 percent of their parent's selected component |
There is a direct help/source disagreement. Documentation system 440 assigns Show All Node Descendants to s-Left. The component-444 source assigns that command s-c-Left and uses s-Left for the undocumented thresholded ladder. Both facts are preserved; runtime must determine which bindings are installed in the specific world used by the harness.
Reports, output fields, and display choices
The interface stores collector data independently of its view. Major output fields can be added, removed, moved, or reset to per-run-type defaults; subfields choose numerical totals, averages, percentages, bar graphs, histograms, or error estimates. Clicking Middle on expandable data displays its collector details, including extrema, average, standard deviation, and one or more histogram modes.
Complete major fields and visible subfield families
| Run type | Available major fields and source-defined subfields | Default major fields |
|---|---|---|
| Function Call | Calls (Count, Incl Count); Incl Time (Total, %Run, Avg, RAvg, Dist, WDist, /Run, Error, Avg Error, Error%, Error/); Incl Process Time (same family); Excl Time (Total, %Run, %Process, %Incl, Avg, RAvg, Dist, WDist, /Run, /Process, /Incl, four error views); Excl Consing (Total, Avg); PFs (#, Avg); Incl PS time and Excl PS time (Total, Avg, Dist, WDist, percentage/bar relative to inclusive or exclusive time); Function |
Calls, Incl Process Time, Excl Time, Excl Consing, PFs, Excl PS time, Function |
| Call Tree | Calls; Incl Time and Incl Process Time (totals/averages, run/root shares, distributions, errors, plus process/inclusive shares where applicable); Excl Time (run/root/inclusive/process shares, distributions, errors); Excl Consing, Incl Consing; PFs; Excl PS time, Incl PS time; Function | Calls, Incl Process Time, Excl Time, Incl PS time, Function |
| Statistical Function Call | Excl Time (Total, %Run, /Run); Excl Process Time (run/exclusive shares); PFs; PS time (process and total-exclusive shares); Samples; Function |
Excl Time, Excl Process Time, PFs, PS time, Function |
| Statistical Call Tree | Incl Time, Incl Process Time (run/root/inclusive shares); Incl PFs; Incl PS time (run/root/inclusive and total-run/root shares); Incl Consing; Samples; Function | Incl Process Time, Incl Time, Incl PFs, Incl PS time, Function |
| Page Fault | Start (Time); Total (Time); Fault Type (Name); VMA (Address, Page, Area Name, Space, Rep); Function/Object (PC, Object) |
all five major fields |
| Statistical Program Counter | Excl Time (%Run, /Run); Function |
both fields |
Time is wall-clock time and can include other processes. Process Time counts only time in the metered process. Incl includes callees or descendants; Excl does not. Slash-prefixed subfields are bar graphs, while percent-prefixed subfields are numeric percentages. RAvg is the average of the main histogram mode, a heuristic noise filter rather than a guaranteed corrected value.
Complete display-parameter choices
| Run family | Sorting choices | Filtering/options |
|---|---|---|
| Function Call | total/average Inclusive Process time; total/average Inclusive time; total/average Exclusive time; total/average Exclusive Page Fault time; total/average Exclusive Consing; function name; total calls | filter by the same or another sorting component; percentage threshold; absolute integer threshold |
| Call Tree | total/average Inclusive Process time; total/average Inclusive time; total/average Inclusive Paging System time; total Inclusive Consing | filter component; percentage of caller (default 80); percentage of total (default 20); maximum depth; substring sequence of function names |
| Statistical Function Call | Exclusive time; Exclusive Process time; Exclusive Process Page Fault time; function name | component, percentage threshold, absolute threshold |
| Statistical Call Tree | total Inclusive Process time; total Inclusive time; total Inclusive Process Consing; total Inclusive Process Paging System time; total Inclusive Process Page Faults | same call-tree thresholds/depth/function matching |
| Page Fault | start time; duration; function name | minimum duration; selected page-event types; whether to retain events whose subevents were all filtered |
| Statistical Program Counter | Exclusive time; function name | minimum percentage |
The 12 Page Fault event-type choices are Replace, Write, Fetch, Prefetch, Prefetch Mark, Fetch Load, Prefetch Load, Prefetch Load Mark, Create Page, Flushable Page Fault, Prefetched Page Fault, and Flush.
Call-tree filtering ORs the two node thresholds and function-name matches, then ANDs that result with maximum depth. A displayed matching descendant retains its calling path. Hoisting changes the display root without losing the run's whole-run totals; /Root and %Root subfields make the distinction explicit.
Measurement caveats represented by the interface
- Percentages can exceed 100 when overlapping inclusive values are summed or a denominator represents a different scope.
- Deterministic entry/exit metering adds substantial overhead; calibrated fudge factors and Error subfields estimate, but cannot eliminate, uncertainty.
- Statistical results require enough samples and are not expected to be exactly repeatable.
- Statistical Function Call and Statistical Call Tree sampling runs in another process, so it cannot sample code while scheduling is inhibited. Statistical Program Counter sampling is lower-level and can observe such code.
- Metering code and collectors enlarge the working set, so the act of measuring can increase paging.
- Paging-system time is based on a coarsely ticking clock; small sample counts have correspondingly large uncertainty.
- “Within Functions” uses encapsulation. On very short runs, its own boundary functions and several hundred microseconds of overhead can become visible.
Short-form metering macros
The installed dictionary documents four macros for repeatedly measuring a short compiled form and comparing it with an empty timing loop:
| Macro | Distinct role |
|---|---|
METERING:WITH-PART-OF-FORM-MEASURED |
repeats the body but times only subforms wrapped by its local FORM-TO-MEASURE macro; the wrapped subform's values are discarded |
METERING:WITH-FORM-MEASURED |
times the whole body |
METERING:DEFINE-METERING-FUNCTION |
compiles and returns/names a reusable measurement function, adding unspecified metering keywords to its arglist |
METERING:MEASURE-TIME-OF-FORM |
compiles a temporary measurement function, invokes it once, and does not retain it |
All accept :NO-INTS, :VERBOSE, :VALUES, :TIME-LIMIT, and :COUNT-LIMIT. Time and count limits are mutually exclusive and cannot both be nil; the usual time limit is one second. :NO-INTS defaults true and prompts before a predicted five-minute scheduler lockout. :VERBOSE prints full histograms. :VALUES suppresses output and returns average time, the form-time histogram, and the empty-loop histogram.
Default output shows average time and average clock overhead as expandable presentations. A further warning appears when two clock-overhead measurements differ beyond *TOLERABLE-CLOCK-VARIATION*; the inspected default is 0.05.
The source also defines the more general, undocumented-in-these-records WITH-FORM-METERED, MEASURE-PERFORMANCE-OF-FORM, and DEFINE-PERFORMANCE-METERING-FUNCTION. They accept generator descriptions in :DATA and can collect measurements other than elapsed time through the same trigger/collector substrate. An older incompatible MEASURE-TIME-OF-FORM implementation is retained only inside a block comment and is not live.
Runtime and screenshot status
The fresh Genera run reached a release-media boundary, not the Metering Interface. No interface screenshot is substituted for that failed load.
- The museum does not currently have a compatible System 46 load band in the CADR harness, so LMETER and PTRAC could not be exercised in their named historical environment.
- The maintained System 303 tool is textual and requires a
METRpartition. A fresh harness check must verify that the private System 303 disk supplies that partition before attempting even a smallMETER:TEST; no current screenshot is claimed. - The Metering Interface remains optional and was not resident in the fresh Genera 8.5 world. The bounded runtime attempt below could not load it without configuring access to the licensed release tree, which was deliberately outside the exercise.
Genera runtime observation: optional system not resident
A fresh isolated session named d15-metering-genera-20260718, generation 1, booted the known Genera 8.5 VLOD and reached Dynamic Lisp Listener 1. The exact command intent Load System Metering was dispatched there. The Command Processor said that METERING was unknown, searched the site pathname DIS-SYS-HOST:>sys>site>metering.system.newest, and requested a login. This is positive runtime evidence that the optional system was neither known to this fresh world nor reachable through its unconfigured site/file-service context; it is not evidence that the purchased archive lacks the source, which the static audit above directly inspected. A subsequent Select-% attempt did not open a Metering Interface frame.
No host file service, site configuration, or credential was added merely to make the screen reachable. Consequently the six menu items, live field layout, fudge-factor interaction, and the disputed Super-Left bindings remain unverified in this world. The ignored capture build/genera-computer-use/d15-metering-genera-20260718/screenshots/0002-load-metering.png records the minimal blocker at 1,200 by 900 pixels (PNG SHA-256 3c9a5c3c24363f7700adf37cd1de0f31ede50c6e0fa2506e9391793b624ae98b, pixel SHA-256 b1dac302e707cef17c2eed22a32bda4385ce43515d9d0781c9708296bfdb458d). It is not curated into the museum: it shows a failed load in the Listener, not the visible application this article is about. This explicit blocker therefore stands in place of an application screenshot under the repository policy.
The generation record retains the full harness provenance. In portable form:
| Evidence | Recorded value |
|---|---|
| Purchased archive | 206,213,430 bytes; SHA-256 89fb3e76b91d612834f565834dea950b603acf8f9dbacacdd0b1c3c284a2d36e |
| Base/private VLOD at start | 54,804,480 bytes; SHA-256 a8ee5e86cc7e322f7385af3e0cd579d7650d4dcfc3ce328acbf8b25515dd0672; private copy matched base |
| Debugger and VLM | debugger SHA-256 2db918cfe8f35f52c7ff4b7695b0ecd3bb85e41a3327ea5a94874edf05edb54a; executed VLM SHA-256 9f5e18d5770f973879716182b6856ef5a8ee9d3b2bb907476ea0cf35986aa4c7 |
| Compatibility inputs | ifconfig preload SHA-256 f45f45461622975996ab41138f64bb84a4b17c51fba0dbb649208914898c26b7; X preload SHA-256 acd71dbcb948f05b7fd2730b2b4706c08f16f46d792bd9aa6aa64370e855e4b1; configuration SHA-256 5ce6509f5adf2cf2d054d34eb4ba777ce462285b8cd9b01bc071bf819139e086 |
| Isolation and X checks | separate user, mount, network, PID, IPC, and hostname namespaces; no default/external route or host file service; MIT-SHM live-verified absent; both exact X-protocol substitutions observed |
| Selected window | Genera on DIS-LOCAL-HOST; main client 1,200 by 900 at X=72, Y=55; X window identifier 4194310 |
| Ordered guest input | type Load System Metering and Return; bounded Abort/Control-Z/Control-] probes at the resulting login request; blank Return; Select-% probe; all 12 intent/outcome action records retained with ledger SHA-256 f21283570ea91d1dbc1aff37b0ad6c6fdcf7102e4e8c57a550c8eb33e4a6b77f |
| Toolchain | Guix channel commit 230aa373f315f247852ee07dff34146e9b480aec; manifest SHA-256 3adae999bbe420182f22adc2499fcc82449a46eaf580a362de9c0e718fa6b37d; Python 3.11.14 |
| Shutdown and persistence | prompt seen, confirmation sent and accepted, cleanup progress seen, then the known bounded VLM stall forced; forced_after_confirmed_shutdown_stall, forced_stop, and state_may_be_incomplete true; host shutdown not orderly; all recorded processes gone; base and private world unchanged; no harness Save World or process checkpoint, while in-guest Save World and guest checkpoint remain unverified rather than inferred |
The one-shot RFC 868 responder also completed successfully, with responder evidence SHA-256 095a9399505c0f38ec9df869e2f1227e8d9e3b0d7551c2a80ac2fe5ee5739645 and completion-record SHA-256 4cb87fe34076cc7d91b468e722fabb44ca82f3892220a29cff85b3b82e84b792.
TODO: after a separately authorized, isolated, and reproducible way to expose the licensed Metering system to the private world exists, load it, select %, wait for fudge-factor work to settle, verify the six-item command menu and the actual Super-Left/Super-Control-Left call-tree bindings, and capture one sparse initial interface state. Review that exact image and use under the repository's screenshot policy before embedding it. Do not capture a full Help chapter or a bulk command sequence.
TODO: when the CADR harness is available, inspect the System 303 disk label for METR. If present, run a harmless small form through METER:TEST, display both summary and :LIST-EVENTS output, resume GC, and capture only the minimal report needed to establish actual behavior. If absent, record that exact runtime blocker rather than mutating the preservation disk layout.
What is established, inferred, and still open
Established by source: LMETER is a counter-delta tool; System 46 PTRAC is a page trace; LM-3 METER is a disk-backed microcode event recorder with tree and event analyzers; Genera's PC Meter, Metering Substrate, and Metering Interface are separate layers; and the command, option, field, and gesture inventories above match the inspected revisions.
Established by manuals and recovered help: intended workflows, the six Genera run types, the 27-command documentation-440 dictionary, interpretation guidance, and the statement that the graphical interface was introduced after the older PC Meter.
Interpretation: LM-3 METER is the architectural bridge between System 46's special-purpose page trace and Genera's general event-collector substrate. It combines lower-level event recording with higher-level function reports, but its fixed disk format and analyzer tables remain much narrower than Genera's trigger/generator/collector composition model.
Open: the specific Open Genera world's installed call-tree mouse bindings and initial visible state remain blocked because its fresh VLOD neither knows nor can reach the optional system in the isolated, unconfigured site context. The availability of a safe METR partition in the System 303 harness is also open. These remain runtime TODOs, not facts inferred from source.
Sources
- MIT CADR System 46, pinned files and manual-planning notes linked in the evidence section above.
- LM-3 project, pinned System 303
METERsource, rough notes, user manual, and subsystem manual. - Symbolics, Program Development Utilities, Genera 8, Metering Interface and PC Metering chapters.
- Symbolics, Genera 8.3 Software Installation Guide for the NXP1000, optional Metering system loading instruction.
- Local purchased Genera 8.5 source and recovered installed help identified by portable path, evacuated version, byte length, and SHA-256 above; not redistributed.
Last verified: 2026-07-18.