Skip to main content
This page lists the records a simulation writes for the Scala MRC NIC, when each is written, what turns it on, and what one row holds. The records show the behavior the other pages describe: Transport for packets, acknowledgements, retransmissions, and completions; Multipath for the entropy values; Congestion control for the congestion window and round-trip times; and Buffers and PCIe for the buffers. Configuration lists the attributes that turn the records on and off.

Records a simulation writes

With the defaults, a simulation writes these records for every Scala MRC NIC. Each file is named after the record, in the form {simulation}-{record}-{shard-index}.csv, as Simulation output files describes. When a simulation runs as several simulator processes, each process writes its own shard. These records are written only when turned on (Records turned on by attributes): mrc-transport-stats writes its first row one TransportStatsReportInterval into the simulation, 1 ms by default, and a row every interval after that. nd-stats writes its first row at StartTime + ClientStartOffset + NDStatsReportInterval of simulation time, 0.001 + 0.001 + 0.001 = 0.003 s with the platform’s defaults, and a row every interval after that. TransportStatsReportInterval is an attribute of the NIC. NDStatsReportInterval, StartTime, ClientStartOffset, and EnableNetDeviceStatLogging are global simulation parameters, not attributes of this model. They sit in the configuration’s SimulationParameters and are changed with PATCH /api/v1/configurations/{config_id}/parameters; NDStatsReportInterval is a double in seconds (default 0.001).

Getting the records

GET /api/v1/simulations/{sim_id}/results lists a simulation’s result files, among them every record on this page; its type query parameter filters by file type, for example csv. GET /api/v1/simulations/{sim_id}/results/download-url, with the fileName query parameter set to a file’s name, returns a link to download that file. The Simulations API reference lists both endpoints’ parameters. Set SIM_ID to the simulation’s ID and FILE_NAME to a name from the list:

Identifying a NIC and a queue pair

A NIC is identified by its node id in the simulation, the node_id column of every record on this page, with its component name in component_name. FilterNodeId takes the same number. In a Chakra workload simulation, the NicNodeID column of chakra-mapping gives the node id of each rank’s NIC (Placement records). A queue pair (QP) connects two NICs, with an end on each: the sending end, which the host opens for a message, and the receiving end, which the receiving NIC opens when the first data packet of the message arrives (Queue pairs and messages). Each end has its own QP id and is named by its NIC’s IPv4 address and that id. mrc-events and mrc-monitor show the end on the NIC that wrote the row as local_addr and local_qp_id, and the other end as remote_addr and remote_qp_id. The monitor’s endpoint filters write an end as <IPv4 address>:<QP id>.
  • The receiving NIC assigns its QP ids from 32,769 to 65,535, and takes an id back when its QP is closed, so an id names a QP only while that QP is open.
  • The Chakra workload assigns the sending end’s ids from 1 to 32,767, and opens a new QP for each message.
  • On the sending end, remote_qp_id reads 0 until the sender learns the receiving end’s id from its first SACK or NACK.

mrc-transport-stats

mrc-transport-stats has one row for each Scala MRC NIC whose EnableTransportStats is true, every TransportStatsReportInterval. A row combines every queue pair and every congestion window on the NIC: the record has no row for a single queue pair or destination. Each simulator process writes one file for all its NICs. A row has 112 columns. Columns that start with ivl_ cover the interval since the previous row; the matching columns without the prefix cover the simulation so far, so the first row’s ivl_ columns cover everything before it. The part of the run after the last full interval has no row, and a run shorter than one interval writes no file. The counters: The record also has the counters total_bytes_acked, total_ecn_marked_tx, total_ecn_marked_rx, and total_md_count. Every counter has an ivl_total_ twin, for example ivl_total_rtx_pkts. A packet the NIC sends is counted when it has finished going out on the wire. A packet it receives is counted once the receive buffer has admitted it and the NIC has found its queue pair; a packet the receive buffer drops is not counted here. The samples come in blocks. In each column’s name, min, mean, or max says whether the column holds the least, the mean, or the greatest sample, over the interval for an ivl_ column and over the simulation so far for the others: ivl_calc_max_rtt_ns is the greatest RTT sampled in the interval. The record also has the block calc_mean_rcvr_cwnd_pen, calc_max_rcvr_cwnd_pen, ivl_calc_min_rcvr_cwnd_pen, ivl_calc_mean_rcvr_cwnd_pen, and ivl_calc_max_rcvr_cwnd_pen. A mean is taken over every sample from every congestion window on the NIC, not per queue pair. An interval with no samples writes 0. With PassThrough set to true, the congestion window columns keep moving although the window holds back no packet (Turning congestion control off).

nd-stats

With the defaults, nd-stats has a row for the NIC’s network port every NDStatsReportInterval, with tier 3. Its byte counts include the Ethernet header. rx_drops includes the received packets the NIC discards, among them those the receive buffer could not hold (Receive buffer), data packets for a queue pair the NIC does not have, and data packets beyond the receiving end’s PSN window (NACKs). Network Device Statistics lists the columns.

Records turned on by attributes

mrc-events

With EnableEventLogging set to true on the NIC, mrc-events has one row for each queue pair or work-request event on that NIC, written as the event happens. Each simulator process writes one file for all its NICs, from its first event. In a Chakra workload simulation each message has its own queue pair, so QP_CREATED and QP_DESTROYED come once per message on each NIC.

mrc-monitor

mrc-monitor logs individual packets of the queue pairs it selects: data packets, cumulative ACKs, SACKs, NACKs, and reliability probes. Each simulator process writes one file, from its first row. The monitor’s settings take effect once per simulator process: give every Scala MRC NIC in a configuration the same EnableMonitor and monitor settings (ScalaMrcMonitor). Filters. With EnableMonitor set to true, the filters select queue pairs. Each filter is All, which matches every queue pair, or a comma-separated list, which a queue pair matches when it matches any entry. A queue pair is selected when it matches every filter that is not All; with every filter at All, the default, every queue pair is selected.
  • FilterNodeId: the node id of the NIC the queue pair is on, in decimal.
  • FilterLocalAddr, FilterRemoteAddr, and FilterEitherAddr: an IPv4 address in dotted form, matched against the queue pair’s local address, its remote address, or either.
  • FilterLocalEndpoint, FilterRemoteEndpoint, and FilterEitherEndpoint: a queue pair end, <IPv4 address>:<QP id>, matched against the queue pair’s local end, its remote end, or either (Identifying a NIC and a queue pair). The remote end’s QP id reads 0 until the NIC learns it.
Triggers. MonitorTriggers lists events that select a queue pair from the moment they happen: trim when the NIC receives a trimmed data packet (from a sender with the default RTTTimestampMode), nack when it receives a NACK, qp_error when a queue pair enters the error state, and rto when a retransmission timer expires. A trigger selects only the queue pair the event happened on, on that NIC: the packets before the event are not logged. The NACK that fires nack is logged; the trimmed packet that fires trim is not. Triggers work only with EnableMonitor true, and matter only when the filters leave queue pairs out. With EnableMonitorTriggerQpCap true, the triggers select at most MonitorTriggerQpCap queue pairs in each simulator process. Packets. In a selected queue pair, a packet is logged when the toggle for its type and the toggle for its direction are both true:
  • Type: LogWrite for data packets, LogAck for cumulative ACKs, LogSack for SACKs, LogNack for NACKs, and LogProbe for reliability probes. A received NACK also needs the toggle for its code: LogNackTrimmed, LogNackTrimmedLastHop, LogNackPsnOor, or LogNackUnexp.
  • Direction: LogRtx for a retransmission or a completion re-request, LogTx for any other packet the NIC sends, and LogRx for a packet the NIC receives.
When rows are written. A packet the NIC sends is logged when it has finished going out on the wire, so a packet that never finishes sending is never logged. A packet it receives is logged when the NIC processes it. Trimmed data packets, data packets beyond the PSN window, probes, and probe responses that the NIC receives are not logged, and neither are packets the receive buffer drops. With EnableMonitorRowCap true, a simulator process writes at most MonitorRowCap rows, sent and received, over all its NICs, and the monitor then logs nothing more for the rest of the run. Columns. A row has 32 columns. A column that does not apply to a row’s packet reads 0 or is empty. The row also has the columns ecn_marked, m_flag, and rcvr_cwnd_pen.