TUI reference

View Source

The terminal UI shows a live, line-oriented view of one BEAM node. Type a shortcut and press Enter; an empty line means Enter by itself.

Quick start

Build the escript, then use the explicit tui command. This example uses the cookie already available to the controller:

rebar3 escriptize
./_build/default/bin/observer_cli tui app@host

Press D for the built-in shortcut page and q to quit. The old bare observer_cli NODE [COOKIE REFRESH_MS] form is not supported.

Observer CLI Home page showing the VM summary, memory and IO statistics, and
processes ranked by memory

Start forms

From the generated escript:

observer_cli tui NODE [COOKIE REFRESH_MS]

REFRESH_MS defaults to 1500 and must be at least 1000. Supplying a cookie also requires the refresh value. The escript starts a hidden controller, loads a compatible TUI bundle into the target when needed, and starts the UI there. Auto-load requires the controller and target to use the same OTP major release; a compatible bundle already installed on the target is used without auto-load.

From an Erlang shell:

observer_cli:start().
observer_cli:start(2000).
observer_cli:start(RemoteNode).
observer_cli:start(RemoteNode, Cookie).
observer_cli:start(RemoteNode, [{cookie, Cookie}, {interval, 2000}]).

The integer form sets the refresh interval for most local pages; App keeps its default. The options form is for a remote node.

Main pages

PageKeyContents
HomeHVM summary, memory and GC deltas, optional scheduler utilization, and ranked processes
NetworkNVM I/O totals and legacy inet Port counters
PortsONon-inet Erlang Port metadata and counters
SocketsKOTP socket registry summary, counters, and socket details
SystemSSystem/architecture facts, allocators, cache rates, and distribution state
ETSEETS table metadata
MnesiaMLocal Mnesia table metadata; the menu entry appears only while the schema table exists
AppAProcess resources grouped by application
DocDBuilt-in shortcut summary
PluginPConfigured plugin sheets
flowchart TB
    NAV["Main pages · global shortcuts<br/>H Home · N Network · O Ports · K Sockets · S System<br/>E ETS · M Mnesia · A App · D Doc · P Plugins"]

    PICK_PROCESS["Choose a process<br/>Home ranking · plugin PID row"]
    PICK_PORT["Choose a port<br/>Network row · Ports row"]
    PICK_SOCKET["Choose a socket<br/>Sockets row"]

    PROCESS["Process detail<br/>Return: H · B to source page"]
    PORT["Port detail<br/>Return: N · O · H"]
    SOCKET["Socket detail<br/>Return: K · H"]

    NAV --> PICK_PROCESS --> PROCESS
    NAV --> PICK_PORT --> PORT
    NAV --> PICK_SOCKET --> SOCKET

The diagram separates two navigation mechanisms: global shortcuts among peer main pages, then context-specific row drill-down. Pages without a row-detail transition appear only in the global shortcut set. The tables below are authoritative for all shortcuts and behavior.

The Home, Network, Ports, Sockets, ETS, Mnesia, App, and Plugin lists use terminal height to choose the visible row count. If terminal geometry is unavailable, default_row_size defaults to 30 rows.

How to read values

The field tables below describe the labels rendered by the current TUI. The Source column identifies the source API and key where the value is fixed. Relevant API references are the Erlang/OTP erlang, persistent_term, inet, socket, ets, and mnesia modules, plus recon and recon_alloc.

  • Values passed through the byte formatter use B, KiB, MiB, or GiB. Byte-valued exceptions rendered as raw integers, plus raw counts and words, are identified below.
  • A total is cumulative for the VM or resource. An increment or delta is the current sample minus the preceding sample; it is not a per-second rate.
  • A Recon count is a point-in-time ranking. A Recon window is the difference between two samples separated by the configured interval.
  • dead means that a resource disappeared. unavailable means a required capability is missing. undefined marks an unsupported or absent property. - can represent an empty state or an endpoint that is not connected. Socket counters and options can vary with the OTP release, operating system, domain, type, and protocol.

Shared input

Most built-in main and list pages use the shared input parser below. A page ignores actions it does not implement; detail and plugin views document their own inputs later in this reference.

InputAction
H, N, O, K, S, E, M, A, D, PSwitch main page
q or QQuit the TUI
F, pd, or PDNext page
B, pu, or PUPrevious page; page 1 is the lower bound
Integer at least 1000Set the active page's refresh interval in milliseconds
Positive integer below 1000Select that row on pages with row drill-down; otherwise ignored
EnterOpen the remembered row on Home and Network; otherwise page-specific

Pages that accept interval changes retain their own value while you navigate.

Home

The Home ranking has two collection modes:

The first redraw after entering a window mode still uses proc_count; later redraws use proc_window.

InputRanking
r / rrReductions, count/window
m / mmMemory, count/window
b / bbReferenced binary memory, count/window
t / ttTotal heap size, count/window
mq / mmqMessage queue length, count/window
pPause or resume Home redraw
`Enable or disable scheduler wall-time utilization rows
Row numberOpen that ranked process
EnterOpen the remembered ranked process
Full PID, for example <0.43.0>Open a local process even if it is not ranked
<431 or >431Open <0.431.0>

Enabling scheduler utilization changes the node-wide scheduler_wall_time system flag while the view is active. observer_cli restores the preceding setting when it cleans up the Home view.

VM and OS fields

FieldMeaning and unitSamplingSource
HeaderERTS system version, node name, and VM uptimeVersion/name are stable; uptime is currentsystem_info(system_version), node(), statistics(wall_clock)
Proc CountExisting processes / process limit; red above 85%Currentsystem_info(process_count), system_info(process_limit)
Port CountExisting Ports / Port limit; red above 85%Currentsystem_info(port_count), system_info(port_limit)
Atom CountExisting atoms / atom limit; red above 85%Currentsystem_info(atom_count), system_info(atom_limit)
Ets LimitETS table limit, shown instead of Atom Count when atom_limit is unsupportedStablesystem_info(ets_limit)
VersionOTP releaseStablesystem_info(otp_release)
ps -o pcpuCPU percentage reported by the host ps command for the BEAM OS processCurrentps -o pcpu PID
ps -o pmemMemory percentage reported by the host ps command for the BEAM OS processCurrentps -o pmem PID
Active TaskActive processes and Ports ready or running on normal and dirty-CPU schedulers; dirty IO is excludedCurrentstatistics(total_active_tasks)
Context SwitchVM context-switch countTotalstatistics(context_switches)
Reds(Total/SinceLastCall)Total reductions / reductions since this API was last calledTotal / API-call incrementstatistics(reductions)

ps fields display -- when observer_cli cannot parse the command output.

Memory, IO, and GC fields

FieldMeaning and unitSamplingSource
TotalTotal memory allocated by the VM, bytes; always 100%Currentmemory() key total
ProcessMemory currently used by processes, bytes and percent of TotalCurrentmemory() key processes_used
AtomMemory currently used by atoms, bytes and percent of TotalCurrentmemory() key atom_used
BinaryMemory for binaries, bytes and percent of TotalCurrentmemory() key binary
CodeMemory for loaded code, bytes and percent of TotalCurrentmemory() key code
Ets/NETS memory, bytes and percent of Total; N is the current table countCurrentmemory() key ets, length(ets:all())
Persistent Terms/NPersistent-term memory in bytes; N is the term countCurrentpersistent_term:info() keys memory, count
RunQueueRunnable normal and dirty-CPU workCurrentstatistics(run_queue)
RunQueue/ErrorLoggerQueueRun queue / error_logger mailbox length, when that registered process existsCurrentstatistics(run_queue), process_info(Pid, message_queue_len)
IO/GC:(Nms), Total/IncrementsN is the configured refresh interval; following values show totals and prior-sample differences, not exact-period ratesConfigured interval / sampled valuesPage state
IO Input, IO OutputTotal bytes through VM Ports / bytes added since the preceding Home sampleTotal / refresh incrementstatistics(io)
Gc CountGarbage collections / collections added since the preceding Home sampleTotal / refresh incrementstatistics(garbage_collection)
Gc Words ReclaimedReclaimed heap words / words added since the preceding Home sampleTotal / refresh incrementstatistics(garbage_collection)

Scheduler utilization

Each scheduler row shows its scheduler ID and active-time percentage between two statistics(scheduler_wall_time) samples. The rows cover the normal and dirty CPU scheduler IDs returned by OTP, not dirty IO schedulers. observer_cli uses recon_lib:scheduler_usage_diff/2; values at or above 80% are red.

Top-N process fields

FieldMeaning and unitSamplingSource
No, PidDisplay row and local process identifierCurrentRanked result
Name|>Label|>Initial CallRegistered name, otherwise OTP 27+ process label, otherwise translated initial callCurrentregistered_name, proc_lib:get_label/1, proc_lib:translate_initial_call/1
Current FunctionCurrently executing MFACurrentprocess_info(Pid, current_function)
MemoryProcess memory, bytesCount: current; window: changerecon:proc_count/2 or recon:proc_window/3 with memory
BinMemoryReferenced binary memory, bytesCount: current; window: changeRecon binary_memory attribute
ReductionsProcess reductionsCount: total; window: incrementRecon reductions attribute
TotalHeapSizeProcess total heap words multiplied by VM word size, bytesCount: current; window: changeRecon total_heap_size attribute
MsgQueuePending message countCount: current; window: changeRecon message_queue_len attribute

Only the selected ranking field uses the count or window value. The companion Memory, Reductions, and MsgQueue columns are current point-in-time reads. Window changes are second sample minus first and can be negative. A process present in only one sample retains that sample's absolute value. A reduction is a VM scheduling work unit, not elapsed CPU time.

Network

InputAction
icUse recon:inet_count/2
iwUse a Recon-backed window sample with the page interval
rcSort by received packet count
roSort by received octets
scSort by sent packet count
soSort by sent octets
cntSort by total packet count
octSort by total octets
Row number or EnterOpen the corresponding Port detail

The page also displays VM input/output deltas from erlang:statistics(io). Ranked rows cover legacy inet Ports, not every host connection or the OTP socket registry.

Displayed fields

FieldMeaning and unitSamplingSource
Byte Input, Byte OutputBytes added since the preceding Network redrawRefresh deltastatistics(io)
Total Input, Total OutputCumulative bytes through VM PortsTotalstatistics(io)
NO, PortDisplay row and legacy inet Port identifierCurrentRecon count or window sampling
recv_cnt, send_cnt, cntReceived, sent, and combined packet countsCount: total; window: deltainet:getstat/2 through Recon
recv_oct, send_oct, octReceived, sent, and combined bytesCount: total; window: deltainet:getstat/2 through Recon
output, inputCumulative bytes written to and read from the Port driverTotalrecon:port_info(Port, io)
queuesizeBytes currently queued by the Port driver, rendered as a raw integerCurrentrecon:port_info(Port, memory_used) key queue_size
memoryRuntime memory allocated for the Port, bytesCurrentrecon:port_info(Port, memory_used) key memory
Peername(ip:port)Remote endpoint or formatted socket errorCurrentinet:peername/1

The first iw redraw uses count mode; later redraws use the configured window. For Ports present in both samples, all ranked metric columns use deltas from the same window. A Port present in only one sample retains that sample's absolute values. One-direction modes remain sorted by the selected direction. Port input and output totals appear under their matching headings.

Ports

The Ports page excludes inet Ports already represented on Network.

InputAction
qsSort by queue size
mSort by memory
Row numberOpen Port detail

In Port detail, H opens Home, N opens Network, O returns to Ports, P keeps the current detail, and an integer at least 1000 changes the refresh interval.

Ports list fields

FieldMeaning and unitSource
NODisplay rowCurrent page
IdRuntime Port indexport_info(Port, id)
ConnectedProcess connected to and controlling the Portport_info(Port, connected)
NamePort driver nameport_info(Port, name)
ControlsDriver control name, falling back to Nameport_info(Port, controls)
SlotRuntime Port-table slot; undefined when unsupportedport_info(Port, slot)
QueueCurrent queued bytes, rendered as a raw integerport_info(Port, queue_size)
MemoryCurrent runtime memory for the Port, bytesport_info(Port, memory)
ParallelWhether the Port uses parallelismport_info(Port, parallelism)
LockingLocking mode, such as port_level or driver_levelport_info(Port, locking)
Mon/ByCount of outbound monitors held by the Port / count of entities monitoring the Portport_info(Port, monitors), port_info(Port, monitored_by)

The list is a current snapshot of erlang:ports/0 and excludes Ports whose name or control name is tcp_inet, udp_inet, or sctp_inet.

Port detail fields

FieldMeaning and unitSource
port, id, namePort term, runtime index, and driver namerecon:port_info/1
queue_sizeCurrent queued bytes, rendered as a raw integer; red when nonzerorecon:port_info/1 category memory_used
input, outputCumulative bytes read from and written to the Portrecon:port_info/1 category io
connectedControlling processrecon:port_info/1 category signals
memoryRuntime memory allocated for the Port, bytesrecon:port_info/1 category memory_used
os_pidAssociated external OS process ID, when one existsrecon:port_info/1 category meta
controlsRuntime control name, falling back to the Port nameport_info(Port, controls)
slot, parallelism, lockingRuntime-specific Port properties; unsupported properties are undefinedport_info/2
Links(N), Monitors(N), Monitored by(N)Full link, outbound-monitor, and inbound-monitor counts; at most the first 30 valuesRecon signals plus port_info(Port, monitored_by)
sockname, peernameLocal and remote legacy-inet endpointsrecon:port_info/1 category type

Legacy-inet detail adds current statistics from inet:getstat/1 through Recon. Transfer counters and packet-size aggregates are cumulative; send_pend is a current gauge.

FieldMeaning and unit
recv_cnt, send_cntPackets received and sent
recv_oct, send_octBytes received and sent
recv_max, send_maxLargest received and sent packet, bytes
recv_avg, send_avgAverage received and sent packet size, bytes
recv_dviAverage received-packet-size deviation, bytes
send_pendBytes currently pending send; rendered as a raw integer

The Options block attempts a fixed inet:getopts/2 allowlist: active, broadcast, buffer, bind_to_device, delay_send, deliver, dontroute, exit_on_close, header, high_msgq_watermark, high_watermark, low_msgq_watermark, low_watermark, ipv6_v6only, keepalive, linger, mode, netns, nodelay, packet, packet_size, priority, read_packets, recbuf, reuseaddr, send-timeout options send_timeout and send_timeout_close, show_econnreset, sndbuf, tos, and tclass. Unsupported options are shown explicitly.

Sockets

The Sockets page reads the OTP socket registry. A missing socket API produces an unavailable state.

InputSort key
ioRead plus write bytes
rbRead bytes
wbWrite bytes
pkPackets
wtWaits
flFailures
mxMaximum packet value
acAccept activity
idSocket ID
fdFile descriptor
owOwner
dmDomain
tpType
ptProtocol

A row number opens socket detail; K returns to the Sockets list. Counter sorting uses deltas after the first refresh. Identity sorting uses current metadata.

Sockets page showing registry totals, endpoints, socket states, and IO
counters

General socket fields

The General block comes from socket:info/0, with num_sockets and num_monitors taken from socket:number_of/0 and socket:number_of_monitors().

FieldMeaning
iov_maxMaximum number of IO vectors supported by the runtime
num_cnt_bitsWidth of the socket counter representation
num_sockets, num_monitorsRegistry-known socket and socket-monitor counts
num_dinet, num_dinet6, num_dlocalSocket counts by domain
num_tstreams, num_tdgrams, num_tseqpkgsSocket counts by type
num_pip, num_psctp, num_ptcp, num_pudpSocket counts by protocol

The page enumerates socket:which_sockets/0; sockets created with registry use disabled are not included.

Socket list fields

FieldMeaning and unitSamplingSource
NO, SocketDisplay row and socket:to_list(Socket) identifierCurrentSocket registry
Owner(ow)Controlling processCurrentsocket:info(Socket) key owner
EndpointLocal endpoint -> remote endpointCurrentsocket:sockname/1, socket:peername/1
Kinddomain/protocol/typeCurrentsocket:info(Socket)
StateRead and write state listsCurrentsocket:info(Socket) keys rstates, wstates
Read rbread_byte, bytesFirst redraw: total; later: deltaSocket counters
Write wbwrite_byte + sendfile_byte, bytesFirst redraw: total; later: deltaSocket counters
Pkt/AccRead + write + sendfile packet count / successful accept countFirst redraw: total; later: deltaSocket counters
WaitAccept + read + write + sendfile wait countFirst redraw: total; later: deltaSocket counters
FailAccept + read + write + sendfile failure countFirst redraw: total; later: deltaSocket counters
MaxPktLargest current read, write, or sendfile packet maximum, bytesCurrentSocket counters

Counter decreases are clamped to zero. Sorting by ac uses acc_success + acc_tries, while the visible acceptance value in Pkt/Acc is acc_success only. Changing the sort, interval, or page restarts the list worker, so the next redraw again shows cumulative counters before later redraws become deltas.

Socket detail fields

SectionFieldsSource and behavior
Overviewid, owner, fd, domain, type, protocol, read_state, write_state, monitored_byCurrent socket:info/1, socket:getopt(Socket, otp, fd), and socket:monitored_by(Socket)
Netlocal_address, remote_addressCurrent socket:sockname/1 and socket:peername/1
Countersacc_tries, acc_waits, acc_fails, acc_success, read_tries, read_waits, read_fails, read_byte, read_pkg, read_pkg_max, write_tries, write_waits, write_fails, write_byte, write_pkg, write_pkg_max, plus runtime additionsCurrent cumulative socket:info/1 counters, not list deltas
OptionsSupported socket, ip/ipv6, and matching tcp/udp/sctp optionsDynamic socket:supports/2 set read through socket:getopt/2

read_byte, write_byte, read_pkg_max, and write_pkg_max are byte-formatted; the other preferred counters are counts. Additional runtime counters follow alphabetically. Unsupported, disconnected, and unimplemented options are identified rather than omitted.

System

The System page is a current snapshot. Its refresh interval controls redraw; the page does not calculate interval deltas.

Runtime, OS, and memory fields

GroupFieldMeaning and unitSource
SystemSystem Version, Erts VersionOTP release and ERTS versionsystem_info(otp_release), system_info(version)
SystemEmulator Wordsize, Process WordsizeExternal and internal VM word sizes, bytessystem_info({wordsize, external/internal})
SystemThread Support, Async thread pool sizeThread support flag and async-thread countsystem_info(threads), system_info(thread_pool_size)
Systemcompiled forTarget system architecturesystem_info(system_architecture)
CPULogical CPU's, Online Logical CPU's, Available Logical CPU'sLogical processor countsCorresponding system_info/1 keys
CPUSchedulers, Online schedulersConfigured and online normal scheduler countssystem_info(schedulers), system_info(schedulers_online)
CPUAvailable schedulersOnline schedulers when multi-scheduling is enabled; otherwise 1system_info(multi_scheduling), system_info(schedulers_online)
MemoryTotal, Processes, Atoms, Binaries, Code, EtsBytes and percent of totalCorresponding memory() keys
Statisticsps -o pcpu, ps -o pmemHost ps CPU and memory percentages for the BEAM OS processps
Statisticsps -o rss, ps -o vszResident and virtual memory reported by ps, converted for byte displayps
StatisticsTotal IOIn, Total IOOutCumulative bytes through VM Portsstatistics(io)

System Processes and Atoms use the allocated-memory keys processes and atom; Home deliberately uses the used-memory keys processes_used and atom_used.

Runtime statistics and limits

FieldMeaning and unitSource
Processes, Ports, Atoms, ETSCurrent count / limit and percent usedCorresponding system_info/1 count and limit keys
Dirty CPU schedulers, Online dirty CPU schedulersConfigured and online dirty-CPU scheduler countssystem_info/1
Distribution buffer busy limitConfigured distribution busy limit in bytes, rendered as a raw integersystem_info(dist_buf_busy_limit)
ModulesLoaded module countlength(code:all_loaded())
Run QueueRunnable normal and dirty-CPU workstatistics(run_queue)

Allocator fields

Rows cover binary_alloc, driver_alloc, eheap_alloc, ets_alloc, fix_alloc, ll_alloc, sl_alloc, std_alloc, and temp_alloc.

FieldMeaning and unitSource
Allocator TypeAllocator familyFixed list above
Current Mbcs, Current SbcsCurrent average block size in multi- and single-block carriers, bytesrecon_alloc:average_block_sizes(current)
Max Mbcs, Max SbcsAverage block sizes derived from Recon's max block-count and block-size values, bytesrecon_alloc:average_block_sizes(max)
Current SbcsToMbcs, Max SbcsToMbcsDimensionless sums of numeric per-instance SBCS-to-MBCS ratios grouped by allocator familyrecon_alloc:sbcs_to_mbcs/1

Distribution fields

FieldMeaning and unitSource
Healthdown when state is not up; unknown without a queue value; warn at a computed ratio of at least 85%; otherwise okDerived
NodeConnected distributed nodenet_kernel:nodes_info()
Dist QueuePending-output value / dist_buf_busy_limitdist_get_stat/1, system_info(dist_buf_busy_limit)
PercentThe TUI's computed pending-output / busy-limit ratioDerived
AddressDistribution address and portnet_kernel:nodes_info()
In, OutCumulative distribution connection bytesnet_kernel:nodes_info()
Type, StateDistribution connection type and statenet_kernel:nodes_info()

On supported OTP 26–29 releases, the fourth dist_get_stat/1 value is pending output packets. It is not an output-queue byte count, even though the TUI compares it with dist_buf_busy_limit. Disabled distribution and no connected nodes produce explicit sentinel rows.

Allocator cache fields

FieldMeaningSource
Instance / INmseg_alloc cache instancerecon_alloc:cache_hit_rates/0
HitsMemory-segment cache hitsCurrent cumulative counter
CallsMemory-segment cache lookupsCurrent cumulative counter
Hit RateHits divided by callsrecon_alloc:cache_hit_rates/0

ETS and Mnesia

Both table pages accept:

InputAction
mSort by memory
sSort by object count
F / B or pd / puChange page

Mnesia also accepts hide to toggle system tables. These views report metadata only; they do not read table contents.

ETS fields

All values are current ets:all/0 and ets:info/1 metadata.

FieldMeaning and unitSource
Table NameTable name recorded by ETSets:info(Table, name)
SizeStored object countets:info(Table, size)
MemoryTable memory words multiplied by VM word size, displayed as bytesets:info(Table, memory), system_info(wordsize)
Typeset, ordered_set, bag, or duplicate_bagets:info(Table, type)
Protectionpublic, protected, or private access modeets:info(Table, protection)
KeyPosTuple element used as the keyets:info(Table, keypos)
Write/ReadWrite-concurrency / read-concurrency settingsets:info/1
Owner PidOwner PIDets:info(Table, owner)

If a table disappears between enumeration and metadata collection, the current renderer can fail that redraw. Sorting uses raw memory words or object count.

Mnesia fields

FieldMeaning and unitSource
NameTable nameTable ID from mnesia:system_info(tables)
MemoryTable memory in bytes; word-valued storage types are multiplied by VM word sizemnesia:table_info(Table, memory), system_info(wordsize)
SizeStored record countmnesia:table_info(Table, size)
TypeMnesia table typemnesia:table_info(Table, type)
StorageLocal storage type such as ram_copies, disc_copies, or disc_only_copiesmnesia:table_info(Table, storage_type)
OwnerOwner PID of the local schema ETS tableets:info(schema, owner)
IndexConfigured index positionsmnesia:table_info(Table, index)
Reg_nameRegistered name of the local schema ownerprocess_info(Owner, registered_name)

The schema table is always hidden; hide toggles an additional fixed list of legacy system tables. OTP reports memory in words for ram_copies and disc_copies, but in bytes for disc_only_copies; only the word-valued forms are multiplied by VM word size.

App

The App page aggregates process resources by application.

InputSort key
pProcess count
mMemory
rReductions
mqMessage queue length
F / BNext or previous page

Displayed fields

FieldMeaning and unitSampling and source
IdDisplay rowCurrent page
AppApplication name; no_group contains unmatched processesApplication set and running supervisors from application:info(); process association from process_info(Pid, group_leader)
ProcessCount(p)Processes associated with the applicationCurrent sum
Memory(m)Sum of process memory, bytesCurrent process_info(Pid, memory) values
Reductions(r)Sum of cumulative process reductionsCurrent process_info(Pid, reductions) values
MsgQ(mq)Sum of pending messagesCurrent process_info(Pid, message_queue_len) values
StatusLoading, Loaded, Starting, Started, StartPFalse, or Unknownapplication:info()
versionLoaded application version or unknownapplication:info()

Processes are associated through application group leaders. All values and sorts are current snapshots; the page does not calculate interval deltas.

Process detail

Home rows and plugin PID rows without a configured handler open Process detail.

ViewKeyContents
Process InfoPMetadata, signals, memory, and reduction history
MessagesMMessage list when queue length is at most 10,000
DictionaryDProcess dictionary
Current StackCUp to 30 current stack frames
StateSrecon:get_state(Pid, 2500) rendered through the configured formatter

H returns Home. B returns to the source page: Home or the plugin sheet. An integer at least 1000 changes the detail refresh interval. State is a static capture in the built-in pager.

Process Info page showing process metadata, memory, garbage collection,
links, and history

Process Info fields

The primary view requests only the displayed process_info/2 fields; it does not fetch the process dictionary or current stacktrace in the background.

FieldMeaning and unitSource
registered_namePID, followed by /name when registeredRecon meta
initial_callMFA that started the processRecon location
group_leaderProcess group leader PIDRecon meta
statusCurrent scheduler-visible process stateRecon meta
priorityProcess priorityprocess_info(Pid, priority)
catchlevelNumber of active catchesprocess_info(Pid, catchlevel)
suspendingTotal suspending entries and at most the first three valuesprocess_info(Pid, suspending)
error_handlerModule used for unresolved function callsprocess_info(Pid, error_handler)
msg_queue_lenPending message count; red when nonzeroRecon memory_used
heap_sizeCurrent heap words multiplied by VM word size, bytesRecon memory_used
total_heap_sizeTotal allocated heap words multiplied by VM word size, bytesRecon memory_used
trap_exitWhether exit signals are converted to messagesRecon signals
stack_sizeCurrent stack words multiplied by VM word size, bytesprocess_info(Pid, stack_size)
binary_refsReferenced-binary entry count / sum of referenced binary sizesprocess_info(Pid, binary)
min_bin_vheap_sizeMinimum virtual binary heap words multiplied by VM word size, bytesRecon garbage-collection data
min_heap_sizeMinimum heap words multiplied by VM word size, bytesRecon garbage-collection data
fullsweep_afterMinor collections allowed before a full-sweep collectionRecon garbage-collection data
minor_gcsMinor collections since the last full sweepRecon garbage-collection data

Process status is one of the states returned by OTP, including exiting, waiting, running, runnable, garbage_collecting, or suspended. Links(N), Monitors(N), and MonitoredBy(N) show the full relationship counts and at most the first 30 values. Links are bidirectional process/Port links; Monitors are monitors created by the process; MonitoredBy lists entities monitoring it. The Reductions and Memory histories hold up to 20 point-in-time samples; reductions are cumulative and memory is current bytes.

Other process views

ViewData source and boundary
MessagesReads message_queue_len first. An empty queue is not fetched; queues above 10,000 return too_large; otherwise messages come from recon:info(Pid, messages) and use the configured term formatter.
DictionaryReads the current process dictionary and entry count with process_info(Pid, dictionary) and uses the configured term formatter.
Current StackReads process_info(Pid, current_stacktrace) and shows at most 30 MFA plus file:line frames.
StateTakes one static recon:get_state(Pid, 2500) capture and uses the configured term formatter.

Messages, Dictionary, and State are collected and formatted in a monitored worker on the observed node. The worker has a five-second deadline and a 512 * 1024-word heap cap that includes shared binaries. Terms are refused above 64 KiB of external representation or structural depth 32. Formatter output is refused when the final rendered detail, including view prefixes, exceeds 65,536 characters or 64 KiB of UTF-8; every refusal displays too_large. These limits bound the helper and retained output, but the VM can still do transient work while copying a requested term, and a delivered system_get_state request can outlive its caller timeout.

Pager input is:

InputAction
F or jNext page
B or kPrevious page
q or QQuit the TUI from the process-state pager

When B is reserved for returning to a plugin, use k for the previous pager page.

Plugin page

Application configuration supplies the Plugin menu and column shortcuts. Built-in input is:

InputAction
Plugin shortcutSelect a plugin
Column shortcutSort by that column
Row numberSelect that row
EnterOpen the remembered row
F / BNext or previous page
Integer at least 1000Change plugin refresh interval
HReturn Home
qQuit

See TUI plugins for callback, configuration, sorting, pagination, row-handler, and formatter contracts.

Redraw behavior

Main views clear the screen once, then redraw from the cursor origin without accumulating output. A view schedules its next refresh after collection. Window modes first sample for the configured interval, so collection and rendering add to the wall-clock cycle.

Home pause stops collection until resumed. Process state does not auto-refresh. Port and socket detail views render a dead or unavailable state when the selected resource disappears. Process detail renders a dead notice, but a shorter redraw can leave older rows visible.