Escalation bridge call: five InfiniBand tickets
S5·E3Ten minutes on a bridge with forty people listening · Bridge call from your kitchen table, 02:10, third night of a stalled training run
Builds on: ibdiagnet: the command you run before escalating, Proving the fabric: perftest and nccl-tests
Before you read: what do you already know?
3 quick questions. Wrong answers are fine and expected; trying first makes the lesson stick.
After this lesson you can
- Order the checks for five common InfiniBand tickets so the cheapest decisive test always runs first.
- Judge from a symptom whether the fault is physical, subnet-manager, partition, routing or application.
- Name the exact artefact to request from a customer for each ticket instead of guessing at a cause.
- Defend a triage decision on a live bridge call using the file or field that proves it.
Episode 3 - Ten minutes on a bridge with forty people listening
Forty people on the bridge and one sentence of symptom: jobs hang. Acceptance is Friday and the training team has not moved in six hours. The Dell SE is awake, coffee cold on principle, spreadsheet open to the row that says this fabric trains this week. The night-shift operator is in the row and can read you any label you want; he printed all of them. Every port anyone can see says Active, and someone has just proposed raising a second subnet manager’s priority “to see what happens.”
That proposal is why you are on the call. You say no, and why: an InfiniBand HCA port state may be changed locally without the knowledge of the subnet manager, so a change made to test a theory becomes a second fault nobody told the SM about.[15] Then you ask for an artefact instead of a description, because ibdiagnet writes the same files on their fabric as on yours, and -f/--load_from_file reloads their capture so you can re-run the analysis without touching anything of theirs.[4][7]
Those tools exist because InfiniBand faults are indistinguishable from where the application sits: a cable, a missing subnet manager, a partition, a routing decision and an application bug all present as the same hung job. They were built to make one layer at a time falsifiable rather than to guess at causes.
At two in the morning, run the cheapest decisive check, not the most likely cause.
You ask the three questions - since when, which nodes, what changed - then open the pkey file.[4]
1How the first ten minutes work
An InfiniBand escalation is a layer-selection problem. The customer’s symptom - the job is slow, the job hangs, the port is down - is compatible with a cable, a subnet manager, a partition, a routing decision and an application bug, and your only advantage is that some checks eliminate an entire layer for free.
Three rules make the call go well. First, run the cheapest decisive check before the likeliest one. Second, ask for artefacts rather than descriptions: ibdiagnet writes the same files on their fabric as on yours - ibdiagnet2.log, ibdiagnet2.db_csv, ibdiagnet2.pkey, ibdiagnet2.sm, ibdiagnet2.net_dump_ext - and -f/--load_from_file reloads a customer’s db_csv so you can re-run the analysis without touching their fabric.[4][7] Third, change nothing on a live fabric to test a theory. The ibportstate man page states the reason: “InfiniBand HCA port state may be changed locally without the knowledge of the Subnet Manager.”[15]
Ask three questions before any command runs. Since when, because counters are cumulative from the last clear. Which node or nodes, because a fault on one rail and a fault on one node are different problems. And what changed, because a maintenance window is the most common answer and nobody volunteers it.
Dell platform: POST, iDRAC, vSphere, firmware
2Ticket 1 and ticket 2: the port and the hang
Ticket 1 - a port will not go Active. Read ibstat first: it “displays basic information obtained from the local IB driver. Output includes LID, SMLID, port state, link width active, and port physical state.”[2] If the physical state is not LinkUp, this is the physical layer - seating, module support, PHY data. If physical is LinkUp and the logical state is Initializing, no SM has programmed the port; check sminfo, which “Issues and dumps the output of an sminfo query in human readable format”, then start opensm on a node or enable the switch SM.[12][1][9] If the state is Active but the rate is low, the link negotiated down: ibportstate ... query “also validates port characteristics (link width, speed, espeed, and fdr10) based on the peer port” when the queried port is a switch port, iblinkinfo shows widths and speeds fabric-wide, and ibdiagnet --ls and --lw assert an expected speed and width across the whole fabric.[15][3][7]
And one Dell-specific stop: if iDRAC shows a ConnectX-7 InfiniBand card at “Single Data Rate (SDR)” while the OS shows the real rate, the answer is Dell KB 000221452 - “This is expected behavior and is cosmetic in the iDRAC. This can be safely ignored as the card functions at and reflects Next Data Rate (NDR) speeds within the operating system.”[8] Send the KB and the ibstat output together and the ticket closes in one reply.
Ticket 2 - the fabric is up and the application hangs. Everything is Active, nothing communicates. Read ibdiagnet2.pkey before you theorise: partition membership is the most common cause, and the pkey tables are the ground truth rather than the partitions file someone believes is in effect.[4] Then ibdiagnet -r --r_opt check_sl, which validates that “all SL2VL mappings don’t route to VL15” - a service level mapped to VL15 is silently dropped.[5] Then ibdiagnet -r for credit loops, whose success string is -I- no credit loops found.[5] Then ibqueryerrors --data -r, remembering that “The default threshold is zero (0)” and that -r/--report-port adds LID, port, link speed setting and the remote node description to every line.[6] PortXmitDiscards concentrated on one switch port is congestion or routing, not a cable.[6] Finally ib_write_bw between exactly the two hosts that hang: if it runs at rate, the fabric path works and the ticket moves up the stack.[13]
3Ticket 3 and ticket 4: the subnet manager misbehaving
Ticket 3 - two SMs, or a failover that went wrong. Start with sminfo from a node, but know its limit: it reports “The target SM is the one listed in the local port info”, so it tells you which SM your port is pointing at, not how many exist.[12] The proof is ibdiagnet2.sm, the file that lists every subnet manager seen in the fabric.[4] Mastership is decided by priority then GUID: opensm’s -p/--priority runs “from 0 (default and lowest priority) to 15 (highest)” and “This will effect the handover cases, where master is chosen by priority and GUID.”[1] A managed switch joins the same election with ib smnode <name> sm-priority <priority>, and its embedded SM is disabled by default until ib smnode <name> enable.[9] After any handover, confirm SUBNET UP in /var/log/opensm.log on the new master - the log line that means the fabric was actually configured, not merely that a process started.[1]
Two facts turn this ticket from a debate into a decision. The MLNX-OS embedded SM does not support adaptive routing, fault routing, congestion control or SHARP, and is documented for fabrics “up to 2048 nodes on x86 based systems”.[9] And the upstream default priority is 0 while UFM ships its SM at a different value - always read the running configuration rather than assuming a default.[1]
Ticket 4 - repeated heavy sweeps. A heavy sweep runs when a trap arrives or a topology change is detected, and SIGHUP triggers one manually “as if a trap was received or a topology change was found”.[1] So recurring heavy sweeps in opensm.log mean the topology keeps changing. The cause is a flapping link or a rebooting node, and the sweeps are the symptom. Confirm with iblinkinfo -d, which prints “only nodes which have a port in the ‘Down’ state”, and with ibdiagnet --get_phy_info, which queries “all ports for phy information” and feeds ibdiagnet2.net_dump_ext with FEC, BER and PHY data per link.[3][14][4]
You can mitigate churn with -A/--ucast_cache, which “prevents routing recalculation (which is a heavy task in a large cluster) when there was no topology change detected during the heavy sweep” and explicitly handles the host-reboot case.[1] Say the word mitigate out loud on the call: the cache reduces the cost of the churn and does not stop the link flapping.
4Ticket 5: SHARP is not working
This ticket is a preconditions ticket, and the order is fixed because each step is cheaper than the next.
First, the routing engine. NVIDIA’s requirement list is explicit: “Tree based topologies: updn, ar_updn, ftree, ar_ftree; DragonFly+ topology: dfp; Hypercube topologies: dor routing engine with dor_hyper_cube_mode enabled.”[10] Any other engine and no aggregation trees are built at all.
Second, who runs the SM. The MLNX-OS embedded SM lists SHARP among its unsupported features, so a SHARP customer needs UFM or a host SM stack that supports it.[9] The SHARP prerequisites say the same thing from the other side: “Make sure onboard Subnet Manager is disabled in the managed switches”, and the Aggregation Manager “is a central entity running on a dedicated server with a master Subnet Manager. This dedicated server cannot serve as a compute node.”[10]
Third, IPoIB. NVIDIA requires an “Enabled IPoIB interface in compute servers in order to enable using UD multicast for result distribution in SHARP.”[10] A fabric with no IPoIB broadcast group has no result-distribution path, and the symptom is a job that creates and then stalls.
Only then run the smoke test: sharp_hello -d mlx5_0:1 -v 3, which “Verifies that a SHARP client can communicate with sharp_am and successfully create a SHARP job” and prints a tree_info line naming an LLT tree followed by Test Passed.[11] Setting SHARP_COLL_ENABLE_SAT=1 adds a streaming-aggregation tree line.[11]
And the sentence that ends the argument, quoted verbatim from NVIDIA: “While ibdiagnet can be used to check for general fabric errors, it does not verify communication between libsharp and sharp_am, nor whether SHARP jobs can be successfully created.”[11] A clean ibdiagnet is not evidence that SHARP works. The fabric-side view you can still use is ibdiagnet --sharp, which collects SHARP configuration into ibdiagnet2.sharp.[7][4]
5The reply, and the evidence bundle
Your written reply has three parts and they belong in this order: what the evidence shows, what you conclude, and what you need next. Not the other way round - a conclusion first invites a debate about your conclusion instead of about the evidence.
The bundle you request is the same for four of the five tickets, which is why it is worth having as a saved snippet: run ibdiagnet and send the whole output directory; send ibstat and ibstatus from the affected hosts; send sminfo from any node; and state when counters were last cleared.[7][2][12] From that one directory you get the partition tables, the SM list, the per-link PHY and BER data, the counters and the discovered topology - and -f/--load_from_file lets you re-analyse it offline as many times as you like.[4][7]
For ticket 5 add two things the bundle does not contain: the SM’s routing engine setting, and the output of sharp_hello -d <dev>:1 -v 3 from one compute node.[10][11]
Two habits separate a good bridge call from a long one. Name the artefact, never the theory - “send me ibdiagnet2.pkey” beats “I think it is a partition problem”, because the first ends in a fact and the second ends in an argument. And write down the check you did not run and why; on the second call, the list of eliminated layers is the most valuable thing you own.
Brief — Customer's R760 with a BlueField-3 B3220 (DPU mode) lost the DPU after a BIOS update. Host sees nothing. They are about to reflash the DPU firmware "to be safe".
Dell L2 support engineer, bridge call with the customer: We are about to reflash the DPU firmware from the host — go ahead?
Ticket 3, worked end to end. Customer message: “After we rebooted the management server on Saturday, jobs sometimes take a different amount of time on the same data. Nothing else changed.”
- Question first: what runs the SM, and did anything about it change on Saturday? Their answer - the management server runs
opensmand the switches are managed QM9700s - is already the finding in outline.[1][9] - Cheapest decisive check:
sminfofrom two nodes in different racks. If the two answers name different SMs, there are two masters.[12] - Proof:
ibdiagnetand readibdiagnet2.sm, which lists every SM in the fabric.[4] - Cause: the embedded SM on a managed switch is disabled by default and someone enabled it during the outage; with
opensmback up, election is by priority then GUID and the intended master is not winning.[9][1] - Fix, in a window and not on the call: decide which SM should own the fabric, set priorities accordingly -
opensm -p0 to 15 with 15 highest, orib smnode <name> sm-priorityon the switch - and disable the other.[1][9] - Confirm:
SUBNET UPin/var/log/opensm.logon the intended master, and one master fromsminfoon both racks again.[1] - Reply: evidence, then conclusion, then the one thing you need - a maintenance window. Add the note that the embedded SM cannot provide adaptive routing, SHIELD, congestion control or SHARP, so if any of those are in the design the switch SM must not be the winner.[9]
Ticket 2, faded. Customer: “All 32 nodes show Active. MPI initialises and then hangs on the first collective. This worked last week.”
- First question to the customer: ____
- First command, and what it eliminates: ____
- The ibdiagnet file you read before forming any theory: ____
- If that file looks correct, the next check and the failure it detects: ____
- The counter you look at next, and what its concentration on one port would mean: ____
- The single test that separates fabric from application, and its own precondition: ____
- One sentence of reply to the customer, evidence first: ____
Work all five tickets from artefacts only, timed. You have an ibdiagnet output directory, an opensm.log excerpt, an ibstat capture from two hosts, and a customer email per ticket. One ticket contains a false symptom that a colleague injected.
For each ticket produce: the first question to the customer, the first command with its expected output, the artefact you would request, the layer you can eliminate first, and a one-paragraph reply written evidence-first.
Acceptance: no ticket’s first command changes any state; every artefact you request is named as a file or a command output rather than a description; you identify which ticket carries the false symptom and name the check that exposed it; and for at least one ticket you say explicitly which layer you have eliminated and which you have not.
What went into the written reply
The partition tables settle it in one read, and the reply goes out in the order that keeps the argument on the evidence: what the capture shows, what you conclude, what you need next.[4] Nothing on the production fabric was changed at two in the morning, and the layer you eliminated is written down with the file that proves it.[15] The sentence the on-call pastes into the incident record: “Send the whole ibdiagnet output directory and tell me when counters were last cleared, and I will tell you which layer this is not.”[7] Five hours later, no sleep, your manager sets down two coffees in a hotel lobby and asks what the account review is about to ask: are you certified on this?
Lab
Stage two tickets for real on the Dell lab. Pre-flight inventory first, all read-only: ibstat, ibstatus, sminfo, iblinkinfo, ibdiagnet into a fresh directory, and systemctl is-active opensm. Save every output - this is both your baseline and your rollback reference.
- Ticket 1, staged. Mutating step: stop the subnet manager with
systemctl stop opensmon the host running it, then force one test link to re-train - unseat and reseat that cable, or bounce the port from the switch side. Expected:ibstatshows that port at physical stateLinkUpand logical stateInitializing, because no SM is there to assign it a LID; every other port staysActive. That is the point - opensm(8) says of--oncethat OpenSM configures the subnet then exits and “Ports remain in the ACTIVE state”, which is exactly why a dead SM stays invisible until something re-trains.[2][1] Rollback:systemctl start opensm, confirmSUBNET UPin/var/log/opensm.log, then re-runibstatand compare against the pre-flight capture.[1] - With the SM still stopped, run
ibstatandsminfoand record exactly what a customer would see. This is the transcript you will recognise on a real call.[2][12] - Restart the SM and confirm recovery before continuing. Do not proceed with a fabric in a degraded state.
- Ticket 4, staged. Mutating step: flap one lab port in a loop from the switch side or by unseating and reseating a cable on a link that carries no other work. Expected: repeated heavy sweeps in
/var/log/opensm.logcorrelating withiblinkinfo -dshowing that node’s port Down.[1][3] Rollback: stop the loop, reseat the cable, confirm the port returns toActiveand that the sweeps stop. - Capture the evidence bundle exactly as you would ask a customer to: the full
ibdiagnetoutput directory,ibstatandibstatusfrom both hosts,sminfo, and a note of when counters were last cleared.[7][2][12] Addibdiagnet --get_phy_infoand keepibdiagnet2.net_dump_extfor the flap.[14][4] - Do not attempt ticket 3 by enabling a second SM on a shared lab fabric. Optional, in a customer or partner lab with an isolated subnet: bring up a switch-embedded SM alongside a host SM, prove two masters from
ibdiagnet2.sm, and resolve it by priority - then set the switch SM back to disabled, which is its default.[9][4]
Artefacts only. No fabric required.
- Obtain or reuse an
ibdiagnet2.db_csvcapture and re-analyse it offline:ibdiagnet -f <path-to-ibdiagnet2.db_csv>. Expected: the analysis stages run with no fabric access.[7] If the file is from a different ibdiagnet generation, note the--back_compat_dboption exists and move on.[7] - From the output directory, open
ibdiagnet2.pkey,ibdiagnet2.smandibdiagnet2.net_dump_extand write one sentence each on what question that file answers.[4] Expected: partition membership, subnet managers, and per-link FEC or BER data. - Read an
opensm.logexcerpt and mark everySUBNET UPand every heavy sweep. Expected: oneSUBNET UPat start; repeated heavy sweeps mean a changing topology, not an SM fault.[1] - Time yourself on all five tickets using only the artefacts. For each, write the first question, the first command, the artefact to request, and the one-paragraph reply. Target: under six minutes per ticket.
- Have a peer inject one false symptom into one ticket - a rate that does not match the cable, a counter that was never cleared, an iDRAC screenshot showing SDR - and check whether you still ran step 1 of that ticket’s tree before reacting.[8]
- Write the saved snippet you will actually paste into a customer email requesting the evidence bundle, and keep it under six lines.
Retrieval check
10 questions from memory. Answer before looking anything up; misses become flashcards.
Explain it to a Dell SE
Explain to a Dell L2 engineer, in five sentences, how you run the first ten minutes of an InfiniBand bridge call so the fix is found rather than guessed.
Sources
Facts in this lesson were checked against infiniband-diags man pages (rdma-core master), opensm(8), IBUtils2 2.24/2.26 ibdiagnet pages, MLNX-OS v3.12.6200 LTS, SHARP 3.8 and 3.16, Dell KB 000221452 - source set as fetched 2026-09-07. Dates are when each page was fetched.
- opensm(8) man page source - linux-rdma/opensm master · fetched 2026-09-07
- ibstat(8) man page source - rdma-core master · fetched 2026-09-07
- iblinkinfo(8) man page source - rdma-core master · fetched 2026-09-07
- ibdiagnet Dump Files - IBUtils2 Utility Documentation · fetched 2026-09-07
- Routing Validation - IBUtils2 2.26.0 · fetched 2026-09-07
- ibqueryerrors(8) man page source - rdma-core master · fetched 2026-09-07
- ibdiagnet Basic Commands - IBUtils2 Utility Documentation · fetched 2026-09-07
- Dell KB 000221452: ConnectX-7 InfiniBand link speed shows as SDR in iDRAC · fetched 2026-09-07
- Subnet Manager - NVIDIA MLNX-OS User Manual v3.12.6200 LTS · fetched 2026-09-07
- NVIDIA SHARP 3.8.0: Setting up NVIDIA SHARP Environment · fetched 2026-09-07
- NVIDIA SHARP 3.16.0: NVIDIA SHARP Installation · fetched 2026-09-07
- InfiniBand Fabric Utilities - MLNX_OFED 23.07-0.5.1.2 · fetched 2026-09-07
- perftest README - linux-rdma/perftest master · fetched 2026-09-07
- Phy Diagnostic Plugin - IBUtils2 Utility Documentation · fetched 2026-09-07
- ibportstate(8) man page source - rdma-core master · fetched 2026-09-07
The same idea elsewhere
Other lessons that cover this ground, sometimes from another course's angle.