PNOMA - A vSAN Troubleshooting Framework
Diagnostic only — nothing here changes state. Every command on this page only looks.
98% of vSAN issues are diagnosed in the Physical and Network layers. Diagnosis flows UP the stack: start at P, clear each layer, move up only when it's clean.
Framework: Brad Mott. Expansion: Daniel Barnes.
No customer specifics, no internals.
Version 1.5. Verified-against date: 2026-10-28.
Triage
Symptom?
98% of vSAN issues are diagnosed in the Physical and Network layers. Diagnosis flows UP the stack: start at P, clear each layer, move up only when it's clean.
Scope?
- P — Physical: the hardware and storage devices themselves.
- N — Network: host-to-host transport; if it can't talk, it can't cluster.
- O — Object: are the pieces of the data present, healthy, and placed per policy?
- M — Management: when things get weird — tasks, limits, and the settings nobody remembers changing.
- A — Application: what the client shows vs what the hosts know.
Recent change?
M2 — Did somebody change a setting?
Management: when things get weird — tasks, limits, and the settings nobody remembers changing.
I'm seeing…
Start from what is on your screen. Find the line that matches and take the door — each one lands where the diagnosis actually starts, which is not always the layer the symptom shows up in.
Disk Issues
- A disk shows failed / red in the UI
- A whole drive vanished — the host doesn't see the device P2-absent → P5 identify → Stop-escalate. P3 is not a gate on this path.
- A disk is flagged absent, missing, or decommissioned
- vSAN won't claim a disk
- The drive itself reports errors (SMART, sense codes)
- An entire disk group is offline / unmounted — the host's capacity is gone (OSA) DDH logs + IsPDL=0 → Stop-escalate.
- Health is red on HCL — the HCL DB is out of date, or hardware is not on the VCG
Network & Witness
Object/Datastore Health, Stuck Resyncs
- Resync has run for hours — is it moving at all?
- Host won't go into maintenance mode
- 'There is no more space for virtual disk' — a VMDK can't expand
- Capacity health warning — 'what if the most consumed host fails'
- Objects in reduced availability, or non-compliant
- Performance graphs missing or incomplete — perf service / stats object
- Leftover advanced setting after maintenance (a knob found left on, or set on some hosts but not others) Check all hosts for the leftover pattern — a knob left on one host is a cluster story, not a host story.
Performance & vCenter
P — Physical
The hardware and storage devices themselves. This is the layer where data traverses and resides within the vSAN file system. Architecture split: OSA carries disk groups with a cache tier; ESA is a single-tier storage pool — the checks below cover both (P3 carries the split).
Verified-against date: 2026-10-22. Captures: ESXi 9.1.1, vSAN ESA.
What lives here. Host Hardware, Storage Controllers, Physical Disks, LSOM. Key components: LSOM, Cache Tier drives, Capacity Tier drives.
- Host Hardware — the physical server box and its guts (CPU, memory, NICs, etc.)
- Storage Controllers — the card or chip that talks to the drives and presents them to the host
- Physical Disks — the actual spinning rust or SSDs installed in the server
- LSOM — the local software layer that manages the disks and cache on each host
- Cache Tier drives (OSA) — the fast SSD(s) used as the write buffer and read cache in the original vSAN architecture
- Capacity Tier drives (OSA) — the bulk storage drives (HDD or SSD) that hold the actual data in the original vSAN architecture
Doctrine (DDH). An unmounted or evacuated disk is NOT presumed dead. Dying Disk / Device Handling — the vSAN Device Monitor, vsandevicemonitord — proactively pulls disks showing persistent high latency (enhanced in 9.0: ESA latency monitoring with automatic corrective action; proactive cache-drive failure handling in OSA). First question on an unmounted disk: did DDH act on it? Check vmkernel.log / vobd.log for device-monitor actions before condemning the hardware or reaching for an RMA. This doctrine hangs over P4 and P5 below.
An I'm-seeing door overrides this list: when a door routes elsewhere, follow the door, not the list. P1 is not mandatory when the door routes elsewhere.
If seeing this issue, see this KB:
- If a disk sits Detached/Unmounted or Ineligible, see KB 391244 ("vSAN disk in 'Detached/Unmounted' Operation State and 'Ineligible' Claimable State").
- If disk groups show as unmounted because DDH acted, see KB 315559 ('vSAN Disk Groups show as unmounted in the vSphere Web Client due to Dying Disk Handling (DDH)').
P1 — Is this host in the cluster it thinks it's in? Start here
The node's own view of itself: cluster identity, membership size, and maintenance state.
esxcli vsan cluster get
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22
Cluster Information
Enabled: true
Current Local Time: 2026-10-22T14:22:51Z
Local Node UUID: 6f4a2c8e-91bd-4e57-a3c0-7d5b9e1f2046
Local Node Type: NORMAL
Local Node State: MASTER
Local Node Health State: HEALTHY
Sub-Cluster Master UUID: 6f4a2c8e-91bd-4e57-a3c0-7d5b9e1f2046
Sub-Cluster Backup UUID: 3d8b7a19-5c2e-4f60-b4a9-1e6d8c3f5a72
Sub-Cluster UUID: 5e2f8b41-6a9d-4c37-8e1a-9b3d7f5c2e68
Sub-Cluster Membership Entry Revision: 1
Sub-Cluster Member Count: 3
Sub-Cluster Member UUIDs: 6f4a2c8e-91bd-4e57-a3c0-7d5b9e1f2046, 3d8b7a19-5c2e-4f60-b4a9-1e6d8c3f5a72, 9a5e1d73-8b4c-4a2f-a6d1-4f7b2e9a8d05
Sub-Cluster Member HostNames: esxi01.lab.local, esxi02.lab.local, esxi03.lab.local
Sub-Cluster Membership UUID: 8c1d4f69-2b7a-4e95-a8c3-6d9f1b5e4a27
Unicast Mode Enabled: true
Maintenance Mode State: OFF
Config Generation: 7a3f5c81-9e2b-4d64-b7a5-1c9e4f6d2b83 35 2026-10-21T12:37:00.476
Mode: REGULAR
vSAN ESA Enabled: true
vSAN Max Client Network Enabled: false
Look for
| Healthy | Member count matches the cluster's real size; the Sub-Cluster UUID matches what the other hosts report; Maintenance mode agrees with what you know about the host. |
|---|---|
| Suspicious | Member count lower than the real cluster -> this host can't see everyone (keep going in P for the local side, then take it to N). Maintenance Mode State disagreeing with the host's actual state is an M-layer signature (see M) — note it and route it there. |
| Stop-escalate | the host reports a different Sub-Cluster UUID from its peers — you are looking at a partition, not a sick disk; work N before touching P hardware. |
Cross-refs: this command is also the instrument for N's membership-churn signature (N9) and M's DECOM reading.
What build is this host running? The exact vSphere build — readings and driver expectations are version-shaped; pin the version before trusting either.
vmware -vl
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22
DEPRECATION WARNING: `vmware -v / --version` are deprecated as of ESX 9.0, and will be removed in a future release.
VMware ESXi 9.1.1 build-25782009
DEPRECATION WARNING: `vmware -l / --level` are deprecated as of ESX 9.0, and will be removed in a future release.
VMware ESXi 9.0 Update 1
Note (from the 2026-10-22 capture): the command prints a deprecation warning on this build — vmware -v and vmware -l are deprecated as of ESX 9.0 and will be removed in a future release.
P2 — Does the host see its storage controllers?
Which controllers are installed, and which driver name and version each is running.
esxcli vsan debug controller list
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22
Device Name: vmhba0
Device Display Name: Samsung Electronics Co Ltd NVMe SSD Controller PM9C1a (DRAM-less)
Used By VSAN: true
PCI ID: 144d/a80d/144d/a801
Driver Name: nvme_pcie
Driver Version: 1.4.0.8-2vmw.911.0.25714478
Max Supported Queue Depth: 2046
Firmware Version: N/A
Device Name: vmhba1
Device Display Name: Samsung Electronics Co Ltd NVMe SSD Controller PM9C1a (DRAM-less)
Used By VSAN: false
PCI ID: 144d/a80d/144d/a801
Driver Name: nvme_pcie
Driver Version: 1.4.0.8-2vmw.911.0.25714478
Max Supported Queue Depth: 2046
Firmware Version: N/A
Look for
| Healthy | every expected controller present, with the driver name/version you expect for the build (P1 gives you the build). |
|---|---|
| Suspicious | a controller missing from the list, or an unexpected driver version -> the disks behind it are about to be a P5 problem — vdq -iH shows the mappings: what is missing, what is there, and what is healthy. Identify the affected disks before anything else. |
| Stop-escalate | Missing disk, HBA present vs HBA missing: if the controller is listed but the disk is gone, the trail is a disk story; if the controller itself is gone (vmhba absent), the trail is an adapter story. Either way, identify at P5 and stop — do not run IsPDL on a disk the host cannot see. |
P3 — What disks does vSAN claim on this host?
The disks vSAN is using here, and whether vSAN is still talking to each of them.
esxcli vsan storage list
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 — tail of the output: the host's single ESA disk entry
t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________5F1E000000000001
Device: t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________5F1E000000000001
Display Name: t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________5F1E000000000001
vSAN UUID: 4b7e3a92-5d1c-48f6-9a2e-8c5d1f7b3e94
Used by this host: true
In CMMDS: true
On-disk format version: 24
Checksum: 6823358492999446998
Checksum Ok: true
Is Mounted: true
Is Encrypted: true
Disk Type: singleTier
Creation Time: Sat Dec 28 00:19:05 2024
READ THIS — SAMPLE OUTPUT OSA example (from a support log bundle; identifiers changed — two capacity-tier disks)
naa.5000c29a1b2c3d4e01
Device: naa.5000c29a1b2c3d4e01
Display Name: naa.5000c29a1b2c3d4e01
Is SSD: true
VSAN UUID: 52c81f4a-3d7e-4b9a-a5c2-6e1d8f3b9a04
VSAN Disk Group UUID: 52f6b3e9-8a4d-4c7f-9e1b-3d5a8c6f2e47
VSAN Disk Group Name: naa.5000c29a1b2c3d4e00
Used by this host: true
In CMMDS: true
On-disk format version: 20
Deduplication: true
Compression: true
Checksum: 6292486903516222788
Checksum OK: true
Is Capacity Tier: true
Encryption Metadata Checksum OK: true
Encryption: false
DiskKeyLoaded: false
Is Mounted: true
Creation Time: Wed Oct 7 20:39:00 2020
naa.5000c29a1b2c3d4e02
Device: naa.5000c29a1b2c3d4e02
Display Name: naa.5000c29a1b2c3d4e02
Is SSD: true
VSAN UUID: 52a94d7c-6e1b-4f3a-8d5c-9b2e7a4f6c18
VSAN Disk Group UUID: 52f6b3e9-8a4d-4c7f-9e1b-3d5a8c6f2e47
VSAN Disk Group Name: naa.5000c29a1b2c3d4e00
Used by this host: true
In CMMDS: true
On-disk format version: 20
Deduplication: true
Compression: true
Checksum: 81241688920798380
Checksum OK: true
Is Capacity Tier: true
Encryption Metadata Checksum OK: true
Encryption: false
DiskKeyLoaded: false
Is Mounted: true
Creation Time: Wed Oct 7 20:39:00 2020
ESA instead of OSA? Run the ESA counterpart — the single-tier pool view.
esxcli vsan storagepool list
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22
t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________5F1E000000000001
Device: t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________5F1E000000000001
Display Name: t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________5F1E000000000001
vSAN UUID: 4b7e3a92-5d1c-48f6-9a2e-8c5d1f7b3e94
Used by this host: true
In CMMDS: true
On-disk format version: 24
Checksum: 6823358492999446998
Checksum Ok: true
Is Mounted: true
Is Encrypted: true
Disk Type: singleTier
Creation Time: Sat Dec 28 00:19:05 2024
Look for
| Healthy | every expected disk listed, In CMMDS true. |
|---|---|
| Suspicious | In CMMDS false on a disk = vSAN has lost comms with it. That is flag one of the two-flag verdict in P5 — pair it with IsPDL before calling the disk dead or alive. |
| Stop-escalate | a disk is absent from the list entirely — check P2 (controller) and P5's group mappings (vdq -iH shows missing disks) before condemning it. No device ⇒ no IsPDL: MISSING MEMBER is enough to stop. |
P4 — What is the status of the vSAN disks?
The debug view of vSAN disk status on this host.
esxcli vsan debug disk list
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 — the host's single ESA disk
UUID: 4b7e3a92-5d1c-48f6-9a2e-8c5d1f7b3e94
Name: t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________5F1E000000000001
Owner: esxi01.lab.local
Version: 24
Disk Group: N/A
Disk Tier: singleTier
SSD: true
In Cmmds: true
In Vsi: true
Fault Domain: N/A
Model: Samsung SSD 990 EVO Plus 4TB
Encryption: true
Compression: false
Deduplication: false
Dedup Ratio: N/A
Overall Health: green
Metadata Health: green
Operational Health: green
Congestion Health:
State: green
Congestion Value: 0
Congestion Area: none
All Congestion Fields:
Space Health:
State: green
Capacity: 3725.96 GB
Used: 2034.52 GB
Reserved: 0.00 GB
READ THIS — SAMPLE OUTPUT OSA form (trimmed) — group states, contrasted
DiskGroup[0]: State: Mounted
DiskGroup[1]: State: Unmounted
Mounted is in service; Unmounted is out of service. An Unmounted group reads under the DDH doctrine in the Look-for below — do not read it as a dead disk on sight.
Look for
| Healthy | disks reporting healthy status across the host. |
|---|---|
| Suspicious | any disk flagged otherwise — and before calling it hardware, apply the DDH doctrine: an unmounted or evacuated disk may be the Device Monitor's deliberate act (persistent high latency), not a failure. The proof either way is in vmkernel.log / vobd.log. |
Cache latency can unmount a whole group (OSA): when the cache device stalls, DDH may unmount the entire disk group, not just the slow disk. Read the group state, not a single disk, before concluding.
(This check also serves M — it is filed there too.)
P5 — Is this disk eligible, missing, or really dead?
Disk eligibility and the two-flag death verdict. vdq is the eligibility reader; no single flag condemns a disk.
vdq -qH
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 — both disks the host reports
DiskResults:
DiskResult[0]:
Name: t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________5F1E000000000001
VSANUUID: 4b7e3a92-5d1c-48f6-9a2e-8c5d1f7b3e94
State: Ineligible for use by VSAN
Reason: Disk in use by storage pool
StoragePoolState: In-use for Storage Pool
StoragePoolReason: None
IsSSD?: 1
IsCapacityFlash?: N/A
IsPDL?: 0
Size(MB): 3815447
FormatType: 512e
IsVsanDirectDisk?: 0
DiskResult[1]:
Name: t10.NVMe____Samsung_SSD_990_EVO_1TB____________2C11000000000002
VSANUUID: (empty)
State: Ineligible for use by VSAN
Reason: Has partitions
StoragePoolState: Ineligible for use by Storage Pool
StoragePoolReason: Has partitions
IsSSD?: 1
IsCapacityFlash?: 0
IsPDL?: 0
Size(MB): 953869
FormatType: 512e
IsVsanDirectDisk?: 0
Reason "Has partitions" beside IsPDL 0: the disk carries partitions vSAN did not place — it explains ineligibility, not death. IsPDL 0 still rules out permanent device loss.
vdq -q -d <DEVICE>
Replace: <DEVICE> with the device name (from P3). One disk only.
vdq -iH
Group mappings:
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22
SingleTierDisks:
"singleTier": [
"t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________5F1E000000000001"
]
(ESA fills this slot with the single-tier pool membership; on OSA the same slot is the cache -> capacity mappings, and where missing disks show.)
READ THIS — SAMPLE OUTPUT OSA form (trimmed) — cache -> capacity mappings; a disk the host no longer sees shows as MISSING MEMBER
DiskGroups:
"diskGroup": [
{
"cache": "t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________5F1E000000000001",
"capacity": [
"t10.NVMe____Samsung_SSD_990_EVO_1TB____________2C11000000000002"
]
}
]
MISSING MEMBER:
"missing": [
"t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________9A22000000000003"
]
A MISSING MEMBER entry tied to a missing vmhba (see P2) is a vanished disk, not a dead one — identify it here, then stop (see the vanished-drive door one-liner).
vdq -iq
Combined query (JSON).
Look for
| Healthy | disks eligible, IsPDL 0. |
|---|---|
| Suspicious | IsPDL 1 = permanent device loss — that flag is the real death certificate. The verdict is two-flag: read IsPDL together with In CMMDS from P3. In CMMDS false alone means vSAN lost comms with the disk — a comms story (work it here, then N), not automatically a corpse. |
| Stop-escalate | a disk shows unmounted/evacuated with no PDL — run the DDH doctrine first (P4): check vmkernel.log / vobd.log for vsandevicemonitord actions before any RMA language reaches the customer. |
No device, no IsPDL. If vdq -qH has no row for the disk and P2 shows its controller missing, do not run an IsPDL determination — the MISSING MEMBER reading is enough to stop. IsPDL answers whether a present disk is dead; it cannot answer for a disk the host cannot see.
If seeing this issue, see this KB:
- If the two-flag verdict says the disk is really dead, see KB 390534 ('vSAN - troubleshooting disk failure issues').
- If the failure is permanent, see KB 391710 ('Permanent disk failure in vSAN').
P6 — What does the device itself report?
The disk's own error counters — the device's testimony, not vSAN's opinion of it.
esxcli storage core device smart get -d <DEVICE>
Replace: <DEVICE> with the suspect disk (from P3).
esxcli nvme device log smart get -A vmhba1
NVMe instead: the NVMe-side SMART readout; check the Volatile Memory Backup Device Failure field.
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 — both runs
SMART get (the 4 TB device):
Parameter Value Threshold Worst Raw
Health Status OK N/A N/A N/A
Power-on Hours 15323 N/A N/A N/A
Power Cycle Count 39 N/A N/A N/A
Reallocated Sector Count 0 90 N/A N/A
Drive Temperature 51 81 N/A N/A
NVMe SMART log (-A vmhba1):
SMART And Health Info:
Available Spare Space Below Threshold: false
Temperature Warning: false
NVM Subsystem Reliability Degradation: false
Read Only Mode: false
Volatile Memory Backup Device Failure: false
Composite Temperature: 329 K
Available Spare: 100 %
Available Spare Threshold: 10 %
Percentage Used: 0 %
Data Units Read: 0x89a3fb8
Data Units Written: 0xab1ff6
Host Read Commands: 0x3b911501
Host Write Commands: 0x3115813e
Controller Busy Time: 0xa28
Power Cycles: 0x41
Power On Hours: 0x3ea6
Unsafe Shutdowns: 0x28
Media Errors: 0x0
Number of Error Info Log Entries: 0x0
Warning Composite Temperature Time: 0 Mins
Critical Composite Temperature Time: 0 Mins
Temperature Sensor 1: 348 K
Temperature Sensor 2: 329 K
Temperature Sensor 3: 0 K
Temperature Sensor 4: 0 K
Temperature Sensor 5: 0 K
Temperature Sensor 6: 0 K
Temperature Sensor 7: 0 K
Temperature Sensor 8: 0 K
Look for
| Healthy | error counters flat / zero on the suspect disk. |
|---|---|
| Suspicious | climbing error counters, or the NVMe Volatile Memory Backup Device Failure field tripped -> the device is indicting itself; now the hardware conversation is evidence-based. |
P7 — Is the latency real, and where does it live?
Live storage latency at the device, split by who owns the wait.
esxtop
then press u (disk device view)
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 — point-in-time monitor views; values are the instant of the capture, not stored output
Device view (u):
2:26:11pm up 4 days 16:29, 2155 worlds, 3 VMs, 10 vCPUs; CPU load average: 0.14, 0.15, 0.15
DEVICE | PATH/WORLD/PARTITION | DQLEN | WQLEN | ACTV | QUED | %USD | LOAD | CMDS/s | READS/s | WRITES/s | MBREAD/s | MBWRTN/s | DAVG/cmd | KAVG/cmd | GAVG/cmd | QAVG/cmd
t10.NVMe____Samsung_SSD_990_EVO_1TB_ | - | 32 | - | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00
t10.NVMe____Samsung_SSD_990_EVO_Plus | - | 2046 | - | 0 | 0 | 0 | 0.00 | 205.99 | 91.55 | 114.44 | 41.98 | 2.46 | 0.25 | 0.01 | 0.26 | 0.00
(device names as esxtop truncates them in its column)
Adapter view (d):
ADAPTR | PATH | NPTH | CMDS/s | READS/s | WRITES/s | MBREAD/s | MBWRTN/s | DAVG/cmd | KAVG/cmd | GAVG/cmd | QAVG/cmd
vmhba0 | - | 1 | 249.09 | 86.47 | 162.76 | 36.26 | 1.13 | 0.22 | 0.02 | 0.23 | 0.00
vmhba1 | - | 1 | 5.09 | 5.09 | 0.00 | 0.02 | 0.00 | 0.37 | 0.02 | 0.39 | 0.00 Bonus: press `d` for the disk adapter view.
Look for
| Healthy | latency low and steady across devices. |
|---|---|
| Suspicious | one device's latency standing out from its siblings -> the suspect is physical (stay in P, take the disk to P5/P6). Latency everywhere at once is rarely one disk — think congestion (a Look-for at this layer) and take the pattern to N before blaming media. |
STOP — boundary of the sheet.
A disk the host unmounted on its own is a symptom, and this layer's job is reading the evidence — the counters, the log lines, the pattern across hosts. Mounting, unmounting, or condemning a disk is the fix, and the fix happens after diagnosis, supervised. It is never a step toward one.
Read this (P logs)
- vmkernel.log
- vobd.log
Hands off to: N — the hardware reads clean but hosts still can't see each other: membership and partitions continue at N1 and N9. O — what a sick disk did to the objects living on it is read in Object health.
N — Network
Host-to-host transport; if it can't talk, it can't cluster. Diagnosis flows UP from P, and this is the second of the two layers where 98% of issues are diagnosed. Architecture split: OSA clusters carry multicast settings; ESA is unicast — N3/N4 carry the split.
Verified-against date: 2026-10-22. Captures: ESXi 9.1.1, vSAN ESA.
What lives here. RDT, Networking.
- RDT (Reliable Datagram Transport) — the protocol vSAN uses for communication between hosts over the vSAN VMkernel ports (commands, I/O flow) — optimized to move large amounts of data.
- Networking — the NICs and switches that move vSAN traffic between hosts so the cluster can stay in sync
Out of scope for this layer: deep performance diagnostics (Humbug, Grafana dashboards) are not cheat-sheet material. Basic esxtop statistics only.
N1 — What physical NICs does the host see? Start here
The physical NIC inventory — the bottom of the transport stack.
esxcli network nic list
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22
Name | PCI Device | Driver | Admin Status | Link Status | Speed | Duplex | MAC Address | MTU | Description
vmnic0 | 0000:02:00.0 | i40en | Up | Up | 10000 | Full | 58:47:ca:11:22:31 | 9000 | Intel(R) Ethernet Controller X710 for 10GbE SFP+
vmnic1 | 0000:02:00.1 | i40en | Up | Up | 10000 | Full | 58:47:ca:11:22:32 | 9000 | Intel(R) Ethernet Controller X710 for 10GbE SFP+
vmnic2 | 0000:57:00.0 | cndi_igc | Up | Up | 2500 | Full | 58:47:ca:11:22:33 | 1700 | Intel Corporation Ethernet Controller I226-V
vmnic3 | 0000:59:00.0 | cndi_igc | Up | Up | 2500 | Full | 58:47:ca:11:22:34 | 1700 | Intel Corporation Ethernet Controller I226-LM
Look for
| Healthy | every expected vmnic present. |
|---|---|
| Suspicious | a vmnic missing or down -> the fault is at the physical path before it is anywhere else; pair with N6's port-localization reading (a dropping vmnic port points at cable, optic, or switch port). |
N2 — How are the VMkernel interfaces addressed?
Every VMK's IP, subnet, and gateway — the addressing the vSAN VMK (N3) has to live on.
esxcli network ip interface ipv4 get
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22
Name | IPv4 Address | IPv4 Netmask | IPv4 Broadcast | Address Type | Gateway | DHCP DNS
vmk0 | 10.20.15.11 | 255.255.240.0 | 10.20.15.255 | STATIC | 10.20.0.1 | false
vmk1 | 10.20.17.11 | 255.255.240.0 | 10.20.17.255 | STATIC | 10.20.17.1 | false
vmk10 | 10.20.13.10 | 255.255.240.0 | 10.20.15.255 | STATIC | 10.20.0.1 | false
vmk50 | 169.254.1.1 | 255.255.0.0 | 169.254.255.255 | STATIC | 0.0.0.0 | false
vmk2 | 10.20.18.11 | 255.255.240.0 | 10.20.15.255 | STATIC | 10.20.0.1 | false
Look for
| Healthy | the vSAN VMK addressed on the expected subnet, consistent with its peers. |
|---|---|
| Suspicious | an addressing or subnet mismatch on the vSAN VMK -> hosts that can see some peers and not others (and a membership story — see N9) without anything being physically down. |
STOP — boundary of the sheet.
This sheet checks MTU; it never sets it. Do not re-tag a VMkernel adapter, and do not change MTU on a host or a switch from anything you read here — an MTU change, on the master especially, can take down the entire cluster. If the two sides disagree, capture both readings — then form a deliberate action plan to correct it, with full customer awareness and approval.
N3 — Which VMK carries vSAN, and how is it set up?
vSAN's own view of its transport: the vSAN VMK, multicast settings, and port info.
esxcli vsan network list
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22
Interface
VmkNic Name: vmk1
IP Protocol: TCP(0)
Interface UUID: 2e6a9c15-7d3b-4f81-b5a9-3c8e2d6f1a47
Agent Group Multicast Address: 224.2.3.4
Agent Group IPv6 Multicast Address: ff19::2:3:4
Agent Group Multicast Port: 23451
Master Group Multicast Address: 224.1.2.3
Master Group IPv6 Multicast Address: ff19::1:2:3
Master Group Multicast Port: 12345
Host Unicast Channel Bound Port: 12321
Data-in-Transit Encryption Key Exchange Port: 12443
Multicast TTL: 5
Traffic Type: vsan
(A second capture from the same host in the same sitting shows an additional witness-tagged interface on vmk0 in a fuller listing.)
Look for
| Healthy | the expected VMK bound to vSAN traffic; on OSA, multicast settings as configured for the cluster. |
|---|---|
| Suspicious | the wrong VMK carrying vSAN, or multicast settings (OSA) that differ between hosts -> a cluster that forms partially, or not at all, with every ping in N5 potentially still passing. |
Witness traffic uses the vSAN-tagged VMkernel unless an adapter carries the explicit witness tag. The tag exists for segregated stretched clusters — ROBO especially — where the vSAN adapters have no layer-3 path to the witness and another adapter has to carry the traffic. It belongs on data nodes only: the witness itself never gets it, and needs no tag but vSAN. Broken witness flows? Check whether a tag is diverting traffic that should ride vSAN, or missing where the vSAN adapters cannot reach.
N4 — Does this host know the unicast table?
The vSAN unicast table — who this host believes its cluster peers are, address by address. (The ESA-era membership phone book; OSA leans on N3's multicast.)
esxcli vsan cluster unicastagent list
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22
(The capture crops the top of the table — most column headers are cut off; SubClusterUuid and Traffic Type are the legible ones, so the rows below are transcribed in column order as captured, without asserting the cropped header names. The two visible rows are the remote agents: the list shows the OTHER cluster members from this host's view — the local host does not appear in its own table.)
9a5e1d73-8b4c-4a2f-a6d1-4f7b2e9a8d05 | 0 | true | 10.20.17.13 | 12321 | 3F:7A:91:C4:0D:58:E2:6B:14:A9:D7:03:8C:F5:29:61:BE:47:9A:20:5D:E8:13:76:CB:04:92:AD:68:F1:35:7E | 5e2f8b41-6a9d-4c37-8e1a-9b3d7f5c2e68 | vsan
3d8b7a19-5c2e-4f60-b4a9-1e6d8c3f5a72 | 0 | true | 10.20.17.12 | 12321 | A6:2D:84:F9:51:CB:07:9E:38:D4:6A:B5:20:7F:E1:49:93:5C:A8:16:DA:62:0B:F4:87:3E:C9:55:7D:21:9A:04 | 5e2f8b41-6a9d-4c37-8e1a-9b3d7f5c2e68 | vsan
Look for
| Healthy | the table carries the cluster's member hosts. |
|---|---|
| Suspicious | missing or stale entries -> this host will flap or partition against specific peers; correlate with N9's revision reading before blaming the fabric. Unicast row ≠ same UUID / Member Hosts: a peer present in the table but omitted from Member Hosts is a membership story, not a fabric story. |
Membership can also desync with nothing broken in this layer: if a host's /VSAN/IgnoreClusterMemberListUpdates advanced setting sits at 1 — a leftover from a cluster move or a vCenter replacement — it ignores the member list vCenter publishes, and the 'vCenter state is authoritative' health check fires. Confirming that setting's value on each host is the diagnosis. The command lives under M2; the narrative lives here.
Is data-in-transit encryption on, and the same everywhere? Confirm whether data-in-transit (DIT) encryption is on for this host/cluster, and its rekey interval — the first question when DIT is suspected in a comms break.
esxcli vsan network security get
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22
Sub-Cluster UUID: 5e2f8b41-6a9d-4c37-8e1a-9b3d7f5c2e68
Data-in-Transit Encryption status: true
Rekey Interval (in minutes): 1440
Remote DIT Encryption: None
Remote Cluster Type: None
Run security get on every node when a partition persists — including when N1–N3 and the unicast table look fine. A single host's DIT status is not the cluster's; the mismatch hides on the host you did not check.
Look for
| Healthy | status true and CONSISTENT across hosts; rekey interval 1440. |
|---|---|
| Suspicious | status disagrees between hosts — especially after certificate or thumbprint changes. DIT key exchange then fails and vSAN comms break even though every L3/L4 check in this layer passes. Different Sub-Cluster UUIDs on the data hosts with a broken witness view: the hosts are not in the same sub-cluster the witness sees — correlate with the witness view before blaming the witness host. |
| Stop-escalate | hosts disagree on DIT status and comms are down. Restoring comms by changing DIT state is a deliberate, state-changing procedure. Confirm status per host here; the change itself is supervised work. |
STOP — boundary of the sheet.
If the cluster is partitioned, DIT is the suspect, and vCenter is down, DIT can be turned off from the command line. Work it supervised.
If seeing this issue, see this KB:
- If the 'vCenter state is authoritative' health check fires, see KB 326957 ('vSAN Health Service — Cluster health: vCenter state is authoritative').
- If the cluster is partitioned, DIT is the suspect, and vCenter is down, see KB 373324 ('Data-in-transit encryption is disabled on this cluster but enabled on this host').
- If the unicast table is incomplete, stale, or empty and the normal vCenter path cannot fix it, see KB 326427 ('Configuring vSAN Unicast networking from the command line').
N5 — Can this host actually reach a peer, end to end?
L3 proof over a specific VMK — first plain, then at full frame size. The MTU end-to-end test is the second run, not an afterthought.
vmkping -I <VSAN-VMK> <PEER-IP>
vmkping -I <VSAN-VMK> -s 8972 <PEER-IP> -d
Replace: <VSAN-VMK> with the vSAN VMkernel interface (from N3); <PEER-IP> with the peer host's vSAN VMK address (from N2's table, on the peer).
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 — both runs, to peer 10.20.17.13 over vmk1
Plain run (vmkping -I vmk1 10.20.17.13):
PING 10.20.17.13 (10.20.17.13): 56 data bytes
64 bytes from 10.20.17.13: icmp_seq=0 ttl=64 time=0.135 ms
64 bytes from 10.20.17.13: icmp_seq=1 ttl=64 time=0.141 ms
64 bytes from 10.20.17.13: icmp_seq=2 ttl=64 time=0.106 ms
--- 10.20.17.13 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.106/0.127/0.141 ms
Jumbo run (vmkping -I vmk1 10.20.17.13 -s 8972 -d):
PING 10.20.17.13 (10.20.17.13): 8972 data bytes
8980 bytes from 10.20.17.13: icmp_seq=0 ttl=64 time=0.226 ms
8980 bytes from 10.20.17.13: icmp_seq=1 ttl=64 time=0.264 ms
8980 bytes from 10.20.17.13: icmp_seq=2 ttl=64 time=0.155 ms
--- 10.20.17.13 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.155/0.215/0.264 ms
READ THIS — SAMPLE OUTPUT Jumbo fail modes — same command, vmkping -I vmk1 <PEER-IP> -s 8972 -d
Plain run:
3 packets transmitted, 0 packets received, 100% packet loss
Capped host:
sendto() failed (Message too long)
Two jumbo failures, two meanings. Plain 100% packet loss means the packet left the host and died downstream or went unanswered — nothing special in the output; look off-host. "sendto() failed (Message too long)" means the sending host itself is set below the test size (a host at 1500 cannot send an 8972 test), so the packet never left — check the local nic/interface MTU first. Small pings pass + jumbo fails is the split that IS the diagnosis.
Note on the second run: 8972 payload + headers = 9000 MTU — it only passes if the whole path (VMK, vSwitch, physical fabric) is jumbo-clean.
Look for
| Healthy | both runs answer. |
|---|---|
| Suspicious | plain ping passes, jumbo fails -> an MTU mismatch somewhere on the path (a layer Look-for). Small frames walk through; vSAN's real traffic doesn't. That split IS the diagnosis. If host MTU matches 9000 but jumbo fails, the mismatch is off-host — capture the fabric / intermediate-hop MTU (ask the network team for the segment MTU); stop before changing anything. Point to the nic/interface MTU from N5: read the interface MTU on the path, not just the vmk. |
| Stop-escalate | even the plain run fails to a peer the cluster insists is a member — stop pinging and go to N9; you may be watching membership churn, not a dead path. |
If seeing this issue, see this KB:
- If plain ping passes but jumbo fails, see KB 391812 ('vSAN MTU Check (Ping with Large Packet Size) Skyline Health Errors').
- If the cluster is partitioned by an MTU or VLAN mismatch, see KB 391883 ('vSAN Cluster Partition due to MTU Mismatch or Network Misconfiguration').
N6 — Where are packets dying: physical or virtual?
Live drop and throughput reading, with the localization that tells you which side of the host to blame.
esxtop
Then press n (network view).
esxcli network nic stats get -n <VMNIC>
Replace: <VMNIC> with the uplink under suspicion (from N1). Cross-check.
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 — the esxtop view is a point-in-time monitor view; values are the instant of the capture, not stored output
Network view (n):
2:33:10pm up 4 days 16:58, 2155 worlds, 3 VMs, 10 vCPUs; CPU load average: 0.19, 0.10, 0.10
PORT-ID | USED-BY | TEAM-PNIC | DNAME | PKTTX/s | MbTX/s | PSZTX | PKTRX/s | MbRX/s | PSZRX | %DRPTX | %DRPRX
67108870 | Management | n/a | DvsPortset-0 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00
67108873 | Shadow of vmnic2 | n/a | DvsPortset-0 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00
67108875 | Shadow of vmnic3 | n/a | DvsPortset-0 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00
67108880 | vmk0 | vmnic2 | DvsPortset-0 | 104.63 | 0.23 | 289.00 | 43.60 | 0.07 | 208.00 | 0.00 | 0.00
67108883 | vmk10 | vmnic2 | DvsPortset-0 | 0.00 | 0.00 | 0.00 | 4.36 | 0.00 | 60.00 | 0.00 | 0.00
67108884 | vmk50 | void | DvsPortset-0 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00
67108885 | vdr-vdrPort | vmnic2 | DvsPortset-0 | 0.00 | 0.00 | 0.00 | 4.36 | 0.00 | 60.00 | 0.00 | 0.00
[further VM port rows omitted]
100663303 | Management | n/a | DvsPortset-1 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00
100663308 | Shadow of vmnic0 | n/a | DvsPortset-1 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00
100663311 | Shadow of vmnic1 | n/a | DvsPortset-1 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00
100663313 | vmk1 | vmnic0 | DvsPortset-1 | 1120.43 | 9.74 | 1139.00 | 1185.83 | 25.61 | 2830.00 | 0.00 | 0.00
100663314 | vmk2 | vmnic1 | DvsPortset-1 | 0.00 | 0.00 | 0.00 | 4.36 | 0.00 | 60.00 | 0.00 | 0.00
2214592520 | vmnic2 | - | DvsPortset-0 | 113.35 | 0.24 | 272.00 | 52.32 | 0.07 | 186.00 | 0.00 | 0.00
2214592522 | vmnic3 | - | DvsPortset-0 | 0.00 | 0.00 | 0.00 | 4.36 | 0.00 | 60.00 | 0.00 | 0.00
2248146956 | vmnic0 | - | DvsPortset-1 | 1142.23 | 9.75 | 1118.00 | 1190.19 | 25.60 | 2819.00 | 0.00 | 0.00
2248146958 | vmnic1 | - | DvsPortset-1 | 0.00 | 0.00 | 0.00 | 8.72 | 0.00 | 60.00 | 0.00 | 0.00
Cross-check (esxcli network nic stats get -n vmnic0):
NIC statistics for vmnic0
Packets received: 314388720
Packets sent: 296789063
Bytes received: 1182890032615
Bytes sent: 643179955812
Receive packets dropped: 0
Transmit packets dropped: 0
Multicast packets received: 1163983
Broadcast packets received: 1960209
Multicast packets sent: 16810
Broadcast packets sent: 1408
Total receive errors: 0
Receive length errors: 0
Receive over errors: 0
Receive CRC errors: 0
Receive frame errors: 0
Receive FIFO errors: 0
Receive missed errors: 0
Total transmit errors: 0
Transmit aborted errors: 0
Transmit carrier errors: 0
Transmit FIFO errors: 0
Transmit heartbeat errors: 0
Transmit window errors: 0
Look for
| Healthy | %DRPRX / %DRPTX at 0.00; throughput nowhere near line rate unless the workload explains it. |
|---|---|
| Suspicious | any sustained non-zero %DRPRX / %DRPTX is a finding. Which port drops localizes the fault: drops on the vmnic port = the physical path (cable, optic, switch port); drops on a VM/VMK port = the virtual side (vSwitch, teaming, config). MbTX/s pinned at line rate = saturation impersonating a storage problem. |
| CRC split | The CRC split (from the cross-check): drops WITH CRC errors = physical layer; drops with clean CRCs = congestion / buffers. Same drop counter, two different owners — this reading is how you tell them apart. |
N8 — Port evidence: probe what you can reach, watch what you can't
nc can only test endpoints reachable over the host's routed stacks, and it cannot designate the vSAN VMK path — so the sheet probes exactly one port with nc and proves the inter-host legs by observing their real traffic with tcpdump-uw.
nc -zv <KMS_IP_Address> 5696
Replace: <KMS_IP_Address> with the KMS / key provider address. Run A (KMS probe).
READ THIS — SAMPLE OUTPUT Read A. The failure line is the 2026-10-22 capture. The success line is the standard nc -zv counterpart and is not a capture.
nc: connect to <KMS_IP_Address> port 5696 (tcp) failed: Connection timed out
nc: connect to <KMS_IP_Address> port 5696 (tcp) succeeded!
First line: captured failure. Second line: standard success counterpart, not a capture.
A successful nc to a KMS host is not witness proof. KMS connectivity and witness connectivity are different peers on different paths — a KMS nc that answers says nothing about the witness. Prove the witness with the witness checks, never with a KMS probe.
tcpdump-uw -i vmkX | grep 12321
tcpdump-uw -i vmkX | grep <peer IP/FQDN>
Replace: vmkX with the vSAN VMK; <peer IP/FQDN> with the other host or witness address. Run the first form on the witness appliance, and the second on the Primary and Backup nodes (per Broadcom KB 326958). The examples are verbatim from that KB. Run B (inter-host observation).
Read B: connectivity is verified by observing BIDIRECTIONAL traffic over port 12321 on both sides. In witness topologies, only the Primary and Backup nodes originate traffic to the witness.
DIT: status first via N4 (esxcli vsan network security get); the same tcpdump pattern with 12443 in place of 12321 watches DIT key-exchange traffic between hosts.
Look for
| Healthy | the KMS probe succeeds, and 12321 traffic flows in both directions between the hosts that should be talking. |
|---|---|
| Suspicious | no 12321 traffic in one or both directions -> the leg is blocked or mistagged; route back to the N1–N3 readings (VMK binding, addressing, tagging) and work it there. Traffic present but membership still churning -> leave N; the problem is above the wire. |
N9 — SIGNATURE: is a host flapping in and out?
Catch the intermittent fault that every point-in-time check passes. Membership churn is this layer's signature: the evidence lives in CMMDS, the root cause is almost always here.
esxcli vsan cluster get
Repeatedly, across time, not once. The instrument is P1's; this reading is N's.
READ THIS — SAMPLE OUTPUT Healthy example. Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 — the P1 capture from this same sitting
Sub-Cluster Membership Entry Revision: 1
Sub-Cluster Member Count: 3
Healthy is a LOW, STABLE number — equal to the number of hosts in the cluster, or just 1 — unchanged across resamples.
READ THIS — SAMPLE OUTPUT Unhealthy example. Illustrative — not a capture
(first sample)
Sub-Cluster Membership Entry Revision: 312
(resample, minutes later)
Sub-Cluster Membership Entry Revision: 319
A revision high in general (300+) is a sign of an unstable cluster; a revision actively incrementing across samples means membership is churning NOW — route to the N-layer cause hunt (the flapping host's path readings in N1–N6). (The same churn also shows in CMMDS entries via cmmds-tool find -t HOSTNAME; that tool is filed in O as deep-end kit — know the door exists.)
Look for
| Healthy | the revision sits still across samples. |
|---|---|
| Suspicious | the revision climbs — rapidly OR steadily — means a host is flapping in and out of the cluster. Hunt the cause in this layer: that host's network path — link flaps, MTU, congestion dropping heartbeats. Do not let anyone sell you a storage explanation for a climbing revision. Count may stay full while Revision climbs = churn: a steady Member Count of 3 with a climbing Revision is membership churn, not stability. A high number that does not move is history; a number that climbs across timed samples is an event in progress. Timestamp each revision sample. Capture fail and recover timestamps together: an N9 timeline needs both edges, not just the fail. Flap entry (N9 from a flapping host) vs resync-stall entry (N9 from O5/O6): same N9 mechanics, different doors — the entry door names the story; do not merge the two timelines. |
| Stop-escalate | the revision is climbing and the path checks (N5, N6) all pass in the moment — capture timestamps of the revision at each sample for the case notes; intermittent faults are proven with a timeline, not a snapshot. Clean N5/N6 with a climbing Revision hands off toward networking/switch — do not stay in P. The handoff destination is a pointer, not a fix: the sheet stops here. |
Read this (N logs)
- vmkernel.log
- vobd.log
- vpxa.log
Hands off to: P — CRC and link errors are born physical: cabling, optics, NICs (P4, P5). O — resync and placement symptoms surface in Object.
O — Object
The placement layer: why objects went inaccessible, stuck resyncs, object recoverability, and what-if analysis before touching anything.
Verified-against date: 2026-10-22. Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 — identifiers pseudonymized per the sheet's disclosure; readings as captured. Samples marked (trimmed) are shortened under the sheet's trimming rule; the elision is labelled inside the sample.
What lives here. CLOM, DOM, CMMDS — the object life-cycle layer: these components create objects with the configuration defined through SPBM, validate the configuration can be satisfied, and publish the object's type, owner, policy/layout, and child components to all hosts.
- CLOM — the placement brain: decides which hosts and disks an object's components land on, and whether a policy can be satisfied at all
- DOM — the object manager on each host: creates and distributes the components that make up objects, tracks object ownership and state, and coordinates I/O and resyncs for the objects it owns
- CMMDS — the cluster's shared directory: who is in the cluster, what devices and networks exist, and the metadata (policies, RAID layout, ownership) for every object, published to every host
The 100-object trap. debug object list and overview show at most 100 objects by default. In a cluster with thousands of objects, "not in the output" usually means "not in the first 100" — NOT "doesn't exist." --all (or filtering, or --max-number) is how you search the whole cluster. This burns people constantly. It hangs over O2 and O3 below.
O1 — Are the objects healthy, in one shot?
Health summary of all objects — the 30-second verdict for this layer.
esxcli vsan debug object health summary get
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22. The healthy row holds all 64 objects; every problem category is at 0.
Health Status Number Of Objects
remoteAccessible 0
inaccessible 0
reduced-availability-with-no-rebuild 0
reduced-availability-with-no-rebuild-delay-timer 0
reducedavailabilitywithpolicypending 0
reducedavailabilitywithpolicypendingfailed 0
reduced-availability-with-active-rebuild 0
reducedavailabilitywithpausedrebuild 0
data-move 0
nonavailability-related-reconfig 0
nonavailabilityrelatedincompliancewithpolicypending 0
nonavailabilityrelatedincompliancewithpolicypendingfailed 0
nonavailability-related-incompliance 0
nonavailabilityrelatedincompliancewithpausedrebuild 0
healthy 64
The healthy row holds the count and every problem category answers 0 — that IS the healthy read: the table names every way an object can be unwell, and on a healthy cluster none of them have anything in them.
Look for
| Healthy | the healthy row holds the full object count; every problem category at 0. |
|---|---|
| Suspicious | any object counted in a non-healthy category -> go to O2 to name the specific objects; do not stop at the summary count. |
| Stop-escalate | objects are inaccessible — name them in O3 with --health=inaccessible before theorising about cause; cause may still live in P or N. |
If seeing this issue, see this KB:
- If the summary counts objects in a non-healthy category, see KB 326929 ('vSAN Health Service - Data Health – vSAN Object Health').
O2 — What objects are there, at a glance?
Overview of all objects.
esxcli vsan debug object overview
Replace: none — but note the caps: --all, --max-number; default shows at most 100 (see the layer's 100-object trap).
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22. 3 of the cluster's objects shown.
Object UUID Group UUID Version Size Used Effective Used Snapshot Usage Snapshot Count SPBM Profile Healthy Components
06b3d06a-da71-7839-8bf2-5847ca78dc88 06b3d06a-da71-7839-8bf2-5847ca78dc88 24 255.00 GB 0.06 GB 0.04 GB 0.00 GB 0 vSAN-ESA - Optimal Datastore Default Policy - AutoRAID 8 of 8
07b3d06a-521a-853f-ac46-5847ca78dc88 06b3d06a-da71-7839-8bf2-5847ca78dc88 24 256.00 GB 120.04 GB 80.03 GB 116.78 GB 1 vSAN-ESA - Optimal Datastore Default Policy - AutoRAID 14 of 14
baf6d36a-2ec1-147e-eab6-5847ca78e6b8 06b3d06a-da71-7839-8bf2-5847ca78dc88 24 16.00 GB 0.00 GB 0.00 GB 0.00 GB 0 vSAN-ESA - Optimal Datastore Default Policy - AutoRAID 8 of 8
Look for
| Healthy | the object set you expect, in healthy states. |
|---|---|
| Suspicious | an object missing from a capped listing is NOT evidence it is gone — rerun with --all or a filter (O3) before concluding anything. |
One object needs opening up — its components, its policy, where it is damaged: that anatomy is O3. Pick the object from this list and take it there.
O3 — The deep readout on an object
Per-object health, owner, policy, and every component's state (ACTIVE / ABSENT / DEGRADED), disk UUID and host. This is where an object diagnosis is actually made: component states inside an object ARE the diagnosis, not a detail.
esxcli vsan debug object list
Replace: filters as needed — --health=inaccessible (only the objects that are down; also: healthy, reduced-availability, etc.) --uuid / -u <OBJECT-UUID> — one object --vm-name <VM-NAME> — one VM's objects --disk-uuid <DISK-UUID> — everything with components on a disk (the P-layer handoff: sick disk -> which objects bleed) --comp-owner, --guuid / -g, --policy, --sort / -a, --all, --max-number (default cap 100 objects — see 100-object trap)
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 (trimmed). The RAID_1 leg and the first RAID_5 stripe in full; the remaining two stripes elided. 8 components total, all ACTIVE.
Object UUID: 32f72769-00b2-a603-805a-5847ca78dc88
Version: 24
Health: healthy
Owner: esxi03.lab.local
Size: 100.00 GB
Used: 46.80 GB
Effective Used: 31.20 GB
Snapshot Usage: 0.00 GB
Snapshot Count: 0
Used 4K Blocks: N/A
Policy:
spbmProfileId: 0212ed07-2dca-45d4-8262-c5cab4c30ac1
spbmProfileGenerationNumber: 1
objectVersion: 24
CSN: 27346
SCSN: 27239
spbmProfileName: vSAN-ESA - Optimal Datastore Default Policy - AutoRAID
autoManagedRAID: 1
autoRAIDLevel: 5
Configuration:
Concatenation
RAID_1
Component: 32f72769-9bb6-6f05-7016-5847ca78dc88
Component State: ACTIVE, Address Space(B): 273804165120 (255.00GB), Disk UUID: 52e7cb41-fb2c-7ca4-2a5b-ed3f0af8cabd, Disk Name: t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________941E000000000001:2
Votes: 1, Capacity Used(B): 29765632 (0.03GB), Physical Capacity Used(B): 29765632 (0.03GB), Host Name: esxi02.lab.local
Component: d9d4106a-36de-d8c0-aa54-5847ca78dc88
Component State: ACTIVE, Address Space(B): 273804165120 (255.00GB), Disk UUID: 524dbda3-1a2b-6364-d4bf-456798c68e4c, Disk Name: t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________8B1E000000000002:2
Votes: 1, Capacity Used(B): 32382976 (0.03GB), Physical Capacity Used(B): 32382976 (0.03GB), Host Name: esxi03.lab.local
RAID_5
RAID_0
Component: d9d4106a-8c1d-dbc0-0581-5847ca78dc88
Component State: ACTIVE, Address Space(B): 205353123840 (191.25GB), Disk UUID: 524dbda3-1a2b-6364-d4bf-456798c68e4c, Disk Name: t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________8B1E000000000002:2
Votes: 1, Capacity Used(B): 8390574848 (7.81GB), Physical Capacity Used(B): 9508356096 (8.86GB), Host Name: esxi03.lab.local
Component: d9d4106a-82d0-dbc0-88a8-5847ca78dc88
Component State: ACTIVE, Address Space(B): 205353123840 (191.25GB), Disk UUID: 524dbda3-1a2b-6364-d4bf-456798c68e4c, Disk Name: t10.NVMe____Samsung_SSD_990_EVO_Plus_4TB____________8B1E000000000002:2
Votes: 1, Capacity Used(B): 8390574848 (7.81GB), Physical Capacity Used(B): 9508356096 (8.86GB), Host Name: esxi03.lab.local
(two more RAID_0 stripes elided — same shape, on esxi02.lab.local and esxi01.lab.local)
Type: vdisk
Path: /vmfs/volumes/vsan:528bd398cf7f9ffb-40c234e1ea584113/fff62769-2a45-0551-498e-5847ca78dc88/VCSA_11.vmdk (Exists)
Group UUID: fff62769-2a45-0551-498e-5847ca78dc88
Directory Name: N/A
/etc/init.d/epd status
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-23. ESA only: epd persists DOM's object-metadata entries.
epd is running
Look for
| Healthy | components ACTIVE, policy satisfiable with the current placement. |
|---|---|
| Suspicious | ABSENT vs DEGRADED components — read the state, not just the object's headline health; objects whose policy can't be satisfied with the surviving placement. |
| Suspicious | on ESA, object reads that look frozen or inconsistent across hosts, with epd not running -> DOM's metadata is not persisting; distrust the readout until epd is back. |
| Stop-escalate | debug object list cannot identify the object at all -> O4 (Objtool reads below DOM). |
ABSENT → P3/P5 before more object/resync work: an ABSENT component is a physical story first — read the disk (P3) and the eligibility (P5) before spending more time in O. Do not linger in O, and do not reach for O5 while the component is ABSENT — O5 measures resync, and there is nothing resyncing yet.
O4 — Name a damaged object DOM can't identify
The below-DOM reader: when an object is too damaged, or its metadata too broken, for debug object list to identify it, Objtool reads the object's own attributes directly — name, path, policy. The damaged-object identifier. (Its policy use lives in M4.)
/usr/lib/vmware/osfs/bin/objtool getattr -u <OBJECT-UUID>
Replace: <OBJECT-UUID> with the object's UUID. Flags that matter: -c <COMPONENT-UUID> — reverse lookup: given a component, identify the object it belongs to (how you name an object from its active components). --bypassDOM — skip DOM entirely and read the object straight from disk; the move when DOM's own metadata is what's broken.
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22. The same getattr capture that fills M4.
Object Path: /vmfs/volumes/vsan:528bd398cf7f9ffb-40c234e1ea584113/fff62769-2a45-0551-498e-5847ca78dc88/VCSA_14.vmdk
Disk UUID: N/A
Group UUID: fff62769-2a45-0551-498e-5847ca78dc88
Version: 24
Object type: NATIVE_SNAPSHOT
Object size: 5368709120
Object policy:
spbmProfileId = 0212ed07-2dca-45d4-8262-c5cab4c30ac1
spbmProfileName = vSAN-ESA - Optimal Datastore Default Policy - AutoRAID
autoManagedRAID = i1
autoRAIDLevel = i5
objectVersion = i24
CSN = l2819
SCSN = l2817
Look for
- The object's own name/path/policy as it carries them, independent of what DOM or vCenter believes.
O5 — Is resync moving?
Is resync moving, how much, how long.
esxcli vsan debug resync summary get
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22. Idle.
Total Number Of Resyncing Objects: 0
Total Bytes Left To Resync: 0
Total GB Left To Resync: 0.00
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22. Mid-reconfiguration, two samples from one deliberate policy change, in order. Sample 1.
Total Number Of Resyncing Objects: 19
Total Bytes Left To Resync: 205372403356
Total GB Left To Resync: 191.27
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22. Mid-reconfiguration, sample 2 of the same policy change.
Total Number Of Resyncing Objects: 17
Total Bytes Left To Resync: 240023112176
Total GB Left To Resync: 223.54
/etc/init.d/clomd status
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-23
clomd is running
O5 usually points at a disk — but a stalled resync can stall when P is green. A clean P does not clear O5; when P reads clean and resync still does not move, the stall lives elsewhere — take the N9 timeline (see N9), then the handoff.
Look for
| Healthy | resync progressing; remaining work shrinking across samples. During a planned reconfiguration the totals can RISE first: objects enter the work queue faster than the earliest finish, so bytes-left grows while the queue loads. Judge the trend after the peak — object count draining and bytes falling across later samples. |
|---|---|
| Suspicious | resync that isn't progressing — judge it from summary get ACROSS TIME, not once. A single reading proves nothing either way; the same objects at the same bytes-left, sample after sample with no planned change loading the queue, is stuck. |
| Suspicious | the resync summary is frozen AND clomd is not running -> the placement brain is off. Nothing will move until it is; the stall is a daemon, not a disk. |
| Stop-escalate | summary says stuck -> O6 names the per-object detail, then work the layer the stuck object points at (see the fence). |
Verify P yourself even if storage was already poked: a reported-clean P is not a checked P. Run the P reads before moving to N.
If resync is confirmed not moving, stop digging in this layer — a stuck resync is almost never an object-layer problem. Underneath it there is usually a device in trouble: medium errors (sense key 0x11) or checksum failures on a disk in the path. Go back to P. P6 reads what the device itself reports; P4 shows the state of the disks. The resync is the symptom — find the physical cause first.
Evacuation stalled with little or no resync activity? Before blaming the data path, check what is still powered on on this host. The usual pins are vCLS VMs and anti-affinity rules holding a VM in place — maintenance mode cannot finish while something refuses to leave.
When the maintenance itself runs, it opens with the evacuation precheck (esxcli vsan debug evacuation precheck) — the read that says what would become inaccessible and how much data would move. That read belongs to the work, not to diagnosis, so it is cited here, not sectioned.
STOP — boundary of the sheet.
A resync that isn't moving is not a waiting game — stuck almost always has an address in an earlier layer: a disk going bad, a link dropping, a host struggling. Take the stuck object from O6, read its components in O3, and go work that layer. Do your homework before you assume it finishes eventually.
If seeing this issue, see this KB:
- If a host cannot enter maintenance mode, see KB 394849 ('Unable to place vSAN node into maintenance mode').
- If resync is not progressing and a host sits in a decommission state, see KB 420266 ('Resync is not progressing on vSAN cluster during the vSAN cluster activity').
- If maintenance mode sticks at 99% on stalled resync, see KB 391607 ('vSAN Maintenance Mode stuck at 99% due to stalled resyncing objects and skyline health reports error: "Object Health"').
O6 — Which object's resync is stuck?
Per-object resync detail — the stuck-resync investigation.
esxcli vsan debug resync list
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 (trimmed). Same reconfiguration as O5's active samples. Two objects in full, the rest elided. Every row Intent: Compliance.
Group UUID Object UUID Component UUID To Host GB Left To Resync Intent
fff62769-2a45-0551-498e-5847ca78dc88 32f72769-00b2-a603-805a-5847ca78dc88 6f90da6a-e254-a7cb-364f-5847ca78dc88 esxi01.lab.local 0.02 GB Compliance
fff62769-2a45-0551-498e-5847ca78dc88 32f72769-00b2-a603-805a-5847ca78dc88 6f90da6a-838b-aacb-4c83-5847ca78dc88 esxi03.lab.local 8.85 GB Compliance
fff62769-2a45-0551-498e-5847ca78dc88 32f72769-00b2-a603-805a-5847ca78dc88 6f90da6a-6ce9-abcb-9623-5847ca78dc88 esxi03.lab.local 8.85 GB Compliance
fff62769-2a45-0551-498e-5847ca78dc88 32f72769-00b2-a603-805a-5847ca78dc88 6f90da6a-83ea-accb-8d6f-5847ca78dc88 esxi02.lab.local 0.00 GB Compliance
fff62769-2a45-0551-498e-5847ca78dc88 32f72769-00b2-a603-805a-5847ca78dc88 6f90da6a-5c21-aecb-3f9b-5847ca78dc88 esxi02.lab.local 0.00 GB Compliance
fff62769-2a45-0551-498e-5847ca78dc88 32f72769-00b2-a603-805a-5847ca78dc88 6f90da6a-f72a-afcb-2761-5847ca78dc88 esxi01.lab.local 0.00 GB Compliance
fff62769-2a45-0551-498e-5847ca78dc88 32f72769-00b2-a603-805a-5847ca78dc88 6f90da6a-da5d-b0cb-824b-5847ca78dc88 esxi01.lab.local 0.00 GB Compliance
* (all 7 components) — 17.72 GB
Group UUID Object UUID Component UUID To Host GB Left To Resync Intent
fff62769-2a45-0551-498e-5847ca78dc88 2bf72769-b60e-ad87-f90e-5847ca78dc88 6e90da6a-fc20-923f-f307-5847ca78dc88 esxi03.lab.local 0.05 GB Compliance
fff62769-2a45-0551-498e-5847ca78dc88 2bf72769-b60e-ad87-f90e-5847ca78dc88 6e90da6a-dbe7-973f-43ed-5847ca78dc88 esxi02.lab.local 13.19 GB Compliance
fff62769-2a45-0551-498e-5847ca78dc88 2bf72769-b60e-ad87-f90e-5847ca78dc88 6e90da6a-d318-9b3f-b8fa-5847ca78dc88 esxi02.lab.local 13.20 GB Compliance
fff62769-2a45-0551-498e-5847ca78dc88 2bf72769-b60e-ad87-f90e-5847ca78dc88 6e90da6a-d0cf-9d3f-b056-5847ca78dc88 esxi03.lab.local 13.21 GB Compliance
fff62769-2a45-0551-498e-5847ca78dc88 2bf72769-b60e-ad87-f90e-5847ca78dc88 6e90da6a-8e30-a03f-1f73-5847ca78dc88 esxi03.lab.local 13.20 GB Compliance
fff62769-2a45-0551-498e-5847ca78dc88 2bf72769-b60e-ad87-f90e-5847ca78dc88 6e90da6a-05a7-ce3f-b0fd-5847ca78dc88 esxi01.lab.local 13.21 GB Compliance
fff62769-2a45-0551-498e-5847ca78dc88 2bf72769-b60e-ad87-f90e-5847ca78dc88 6e90da6a-0104-d43f-c86c-5847ca78dc88 esxi01.lab.local 13.20 GB Compliance
* (all 7 components) — 79.27 GB
(17 more objects elided — same shape)
* (all 19 objects) * (all 113 components) — 208.80 GB
The first object is the object from O3's readout, mid-move.
Look for
- The specific object(s) not advancing, then take that UUID back to O3 for its component states.
Naming the stuck object is not the finish — the reason it will not move usually lives in P (see O5).
O6 names one host; test that peer in N after a clean P. One-host To Host means one peer to prove — take that peer, not the whole cluster, into N5/N9.
O8 — Drill-down: the 9.1+ ESA global dedup corner
9.1+ ESA ONLY. Enabling global dedup (cluster-wide toggle) creates ONE dedup store for the cluster — a real backend object with its own UUID, holding chunk objects (deduplicated data) and hash objects (fingerprint index). All read-only:
esxcli vsan dedup dedupstore get
The store view; the ONLY place its UUID shows (the Virtual Objects UI hides it — documented 9.1 Known Issue).
esxcli vsan dedup dedupstore distribution get
-c chunk / -x hash.
READ THIS — SAMPLE OUTPUT Read 1 — feature off. Captured 2026-10-21, dedup-off cluster. Both dedupstore get and distribution get answer this line. Empty output is a reading.
Global dedup is not enabled on current host.
READ THIS — SAMPLE OUTPUT Read 2 — Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 (trimmed). Dedup on. The two object lists are trimmed to their totals.
Dedup Store Information
Dedup Service Enabled: true
Dedup Service Paused: false
Default Dedup Store Uuid: a2f8e762-ce67-11f1-8353-005056a62fca
Default Number Of Chunk Objects: 32
Default Number Of Hash Objects: 32
Dedup Store View List:
Dedup Store View
Dedup Store Uuid: a2f8e762-ce67-11f1-8353-005056a62fca
Dedup Store Manager Object Uuid: 8a8dda6a-702c-3ae8-eeb0-5847ca78e6b0
Default Dedup Store: true
Number Of Chunk Objects: 32
Number Of Hash Objects: 32
Chunk Object List: 8a8dda6a-7a1a-7cf1-6453-5847ca78e6b0, 8a8dda6a-7506-d409-2ca6-5847ca78e6b0, 8b8dda6a-f1c3-5e21-4b66-5847ca78e6b0, ... (32 total)
Hash Object List: 8e8dda6a-8a41-d2d4-1471-5847ca78e6b0, 8e8dda6a-461d-79eb-bc40-5847ca78e6b0, 8e8dda6a-9863-9d01-c98c-5847ca78e6b0, ... (32 total)
READ THIS — SAMPLE OUTPUT Read 3 — Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 (trimmed). Object lists trimmed to the first UUID and the count. The same dedup store UUID on every row is the reading.
Host Name Host UUID Dedup Store UUID Object Type Object Count Object List
esxi01.lab.local 6f4a2c8e-91bd-4e57-a3c0-7d5b9e1f2046 a2f8e762-ce67-11f1-8353-005056a62fca chunk 10 8b8dda6a-f1c3-5e21-4b66-5847ca78e6b0, ... (10 total)
esxi01.lab.local 6f4a2c8e-91bd-4e57-a3c0-7d5b9e1f2046 a2f8e762-ce67-11f1-8353-005056a62fca hash 10 8e8dda6a-9863-9d01-c98c-5847ca78e6b0, ... (10 total)
esxi02.lab.local 3d8b7a19-5c2e-4f60-b4a9-1e6d8c3f5a72 a2f8e762-ce67-11f1-8353-005056a62fca chunk 11 8a8dda6a-7506-d409-2ca6-5847ca78e6b0, ... (11 total)
esxi02.lab.local 3d8b7a19-5c2e-4f60-b4a9-1e6d8c3f5a72 a2f8e762-ce67-11f1-8353-005056a62fca hash 11 8e8dda6a-461d-79eb-bc40-5847ca78e6b0, ... (11 total)
esxi03.lab.local 9a5e1d73-8b4c-4a2f-a6d1-4f7b2e9a8d05 a2f8e762-ce67-11f1-8353-005056a62fca chunk 11 8a8dda6a-7a1a-7cf1-6453-5847ca78e6b0, ... (11 total)
esxi03.lab.local 9a5e1d73-8b4c-4a2f-a6d1-4f7b2e9a8d05 a2f8e762-ce67-11f1-8353-005056a62fca hash 11 8e8dda6a-8a41-d2d4-1471-5847ca78e6b0, ... (11 total)
esxcli vsan dedup dedupstore resync list
esxcli vsan dedup dedupstore resync summary get
READ THIS — SAMPLE OUTPUT Read 4 — Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22. Captured during the O5/O6 reconfiguration: the cluster resyncing 200+ GB of VM objects while the dedup pair sat at zero. The zeros and the empty list are the whole reading.
Summary Of Resyncing Dedup Objects
Total Number Of Dedup Objects: 64
Total Number Of Resyncing Dedup Objects: 0
Total Number Of Resyncing Chunk Objects: 0
Total Number Of Resyncing Hash Objects: 0
Total Bytes Left To Sync: 0
Total GB Left To Sync: 0
dedupstore resync list returned NO output at all.
esxcli vsan debug object list --dedup-obj-type
chunk / hash / dmo / all — the object-level drill-down into those store objects; they're excluded from --all by design.
READ THIS — SAMPLE OUTPUT Read 5 — Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 (trimmed). Captured via --dedup-obj-type all. RAID_1 leg and the first RAID_5 stripe described; the rest elided.
Object UUID: 8e8dda6a-9863-9d01-c98c-5847ca78e6b0
Version: 24
Health: healthy
Owner: esxi01.lab.local
Size: 0.00 GB
Used: 0.00 GB
Effective Used: 0.00 GB
Snapshot Usage: 0.00 GB
Snapshot Count: 0
Used 4K Blocks: N/A
Policy:
CSN: 4
zdomObject: 3
dedupObjID: 3
autoRAIDLevel: 5
Configuration: Concatenation — RAID_1 (2 components,
ACTIVE, on esxi03.lab.local and esxi01.lab.local) +
RAID_5 (3 RAID_0 stripes; first stripe: 2 components,
ACTIVE, on esxi03.lab.local; two stripes elided —
same shape; 8 components total, all ACTIVE)
Type: Deduplication hash
Path: N/A
Group UUID: N/A
Directory Name: N/A
This object's UUID is the first entry in esxi01's hash list in Read 3 — the drill-down path, end to end: store -> distribution -> object. Chunk objects read the same way: Type: Deduplication chunk, with real capacity figures in place of the hash object's zeros.
Look for
- Empty output is a READING, not an error: no store exists, dedup is off; and a quiet dedup resync (Read 4) during a busy cluster resync means the store simply isn't part of that work. (Verified empirically on Daniel's 9.1.1 lab in both states, Oct 21–22.) An empty dedup output is not a failed command.
Deep End — cmmds-tool. Know it exists; don't live there.
Deep End — cmmds-tool
Advanced, last-resort tooling; Daniel rarely touches it outside very advanced troubleshooting. Know it exists; don't live there. Two doors only:
cmmds-tool find -t DOM_OBJECT -u <OBJECT-UUID>
An object's raw CMMDS entry and owner.
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 (trimmed). Trimmed to the owner line and the content opening. Host UUIDs render per the committed file's fabrications, on this owner line as on the HOSTNAME read.
owner=9a5e1d73-8b4c-4a2f-a6d1-4f7b2e9a8d05(Health: Healthy) uuid=44f72769-b1be-0bfd-e57d-5847ca78dc88 type=DOM_OBJECT rev=1237 minHostVer=3
content: (("Configuration" (("UUID" "44f72769-b1be-0bfd-e57d-5847ca78dc88") ... (trimmed — the entry carries the object's full configuration, CSN, and component/disk map)
This object is the M4/O4 getattr object — the same object, read at three depths.
cmmds-tool find -t HOSTNAME
Membership entries.
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22. One membership entry shown.
owner=6f4a2c8e-91bd-4e57-a3c0-7d5b9e1f2046(Health: Healthy) uuid=6f4a2c8e-91bd-4e57-a3c0-7d5b9e1f2046 type=HOSTNAME rev=...
content: ("esxi01.lab.local")
Signature — checksum errors
"by the time checksum surfaces the P is usually long past." A checksum mismatch surfaces on an OBJECT (read fails verification, vSAN repairs from a good replica) but the culprit is the component's disk — dying media that has usually been dying for a while. The trail, per Broadcom KB 405199, "vSAN detected and fixed a medium or checksum error": the event names the COMPONENT; the host's kernel log names the DEVICE with a Medium Error. Trail: checksum errors in vmkernel -> the object's components via O3 (debug object list) -> that disk in P (Checksum / Checksum OK fields in esxcli vsan storage list). Same cross-layer shape as N's membership churn.
Read this (O logs)
- clomd.log — CLOM's own log: placement decisions, repair/resync reasoning, why an object couldn't be placed or rebuilt. Plus hostd.log, and vmkernel.log / vobd.log — "they're always important," in every layer.
Hands off to: P — checksum errors are born on a disk: the event names the component, the kernel log names the device with a Medium Error, and both trails end at that disk in P (Broadcom KB 405199, "vSAN detected and fixed a medium or checksum error"). N — objects don't go absent on healthy networks; membership and partitions live at N1 and N9. M — placement failures with healthy objects are policy and limits (M1, M3).
M — Management
Management is when things get weird.
Verified-against date: 2026-10-21.
The task plane: vCenter-driven operations landing on hosts, and the host-side readings you take when vCenter is down or the task itself is the problem.
What lives here. vSANVPD, OSFSD, DISKLIB, SPBM — the host libraries and daemons invoked when a vSAN task lands.
Key distinction. An SPBM profile is only the friendly NAME of a policy. The object's ACTUAL policy is the raw capability spec it carries — and that spec can be READ from the host command line (Objtool, check M4). Changing it is supervised, post-diagnosis work and is NOT on this sheet.
The non-default trap. Non-default does not mean wrong — platform personalities set several advanced options by design. The readings start questions; they don't answer them.
M1 — Am I out of room to place things?
Check the cluster's placement headroom: component limits and free disk space.
esxcli vsan debug limit get
READ THIS — SAMPLE OUTPUT SAMPLE, small test cluster
Component Limit Health: green
Max Components: 562
Free Components: 561
Disk Free Space Health: green
Lowest Free Disk Space: 99 %
Look for
| Healthy | both health lines green; Free Components comfortably above zero; lowest free disk space healthy. |
|---|---|
| Suspicious | Free Components near zero, or one disk far fuller than the rest -> objects can't place or rebalance; the problem is capacity maths, not a fault. Stay in M for the numbers, then take the placement symptom to O. |
| Stop-escalate | limits are green and placement still fails -> go to O (object view) with the object's UUID. |
M2 — Did somebody change a setting?
List every advanced vSAN option carrying a non-default value, in one shot.
esxcli vsan debug advcfg list
READ THIS — SAMPLE OUTPUT Daniel's lab, real output
VSAN.ClomBgProRebalanceEnabled 1 (default 0)
VSAN.GuestUnmap 1 (default 0)
VSAN.Vsan2DeltaComponent 1 (default 0)
VSAN.Vsan2DeltaComponentUnplanned 1 (default 0)
VSAN.Vsan2DomMetadataEncryption 1 (default 0)
VSAN.DOMNetworkSchedulerThrottleComponent 1 (default 0)
VSAN.VsanPersonalityConfigured 2 (default 0)
(several of these are set by the platform personality —
expected on ESA, not a finding by themselves)
The two names worth grepping by name:
esxcli vsan debug advcfg list | grep -iE 'IgnoreClusterMemberListUpdates|DomPauseAllCCPs'
READ THIS — SAMPLE OUTPUT The lab's own reading, captured 2026-10-22. IgnoreClusterMemberListUpdates at 1 is this host's armed state. DomPauseAllCCPs does not appear in the output; on this host it is not in the debug list, so it sits at default. One row is the whole reading.
VSAN.IgnoreClusterMemberListUpdates 1 0 false
Look for
| Healthy | neither name appears (both at default 0), or IgnoreClusterMemberListUpdates is explained by an in-progress recovery procedure you already know about. |
|---|---|
| Suspicious | IgnoreClusterMemberListUpdates = 1 with no live procedure -> the host is ignoring membership updates; expect phantom-partition symptoms (see N). DomPauseAllCCPs = 1 -> ALL component reconfigurations are paused; objects will silently not repair or rebuild (see O). Both are set-for-a-procedure knobs whose failure mode is being left on. Compare against the N4 unicast table: a unicast row is not the same as the same UUID / Member Hosts — a peer can appear in the table yet be omitted from Member Hosts. Check all hosts for the leftover pattern: a non-default knob on one host, or set on some hosts but not others, is the pattern — a single-host read is not the check. |
| Stop-escalate | either is set and nobody owns why. |
STOP — boundary of the sheet.
A non-default value for IgnoreClusterMemberListUpdates or DomPauseAllCCPs starts questions — it is never permission to change it from a cheat sheet. These knobs get turned on deliberately during supervised work, and turning them back off is supervised work too.
If seeing this issue, see this KB:
- If the knobs are found left on after a shutdown and restart, see KB 393357 ('After a vSAN Cluster Shutdown & Restart, VMs/objects are inaccessible').
- If the Cluster Configuration Consistency check fires on non-default knob values, see KB 378307 ('vSAN Healthcheck -- vSAN cluster configuration consistency - Network configuration is out of sync').
M3 — Are the management services starved?
vSAN's memory footprint on the host (userworld + kernel). Starved management services make tasks go weird.
esxcli vsan debug memory list
READ THIS — SAMPLE OUTPUT SAMPLE
Kernel Usage 106.82 MB
User World Usage 270.11 MB
Total Usage 376.93 MB (Max 3442.36 MB)
/etc/init.d/vsanmgmtd status
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-23. The status answers under the vsanperfsvc name — that IS vsanmgmtd reporting; a missing "vsanmgmtd is running" line is not a failure.
vsanperfsvc is running
Look for
| Healthy | total usage well below max. |
|---|---|
| Healthy | vsanmgmtd status answers (as vsanperfsvc): running — the host's vSAN management daemon is staffed; perf and management views have someone home to serve them. |
| Suspicious | usage riding at/near max alongside failing or hanging tasks -> resource pressure on the management plane; correlate with hostd/vpxa (see A). |
If seeing this issue, see this KB:
- If performance graphs are missing or incomplete, see KB 326464 ('vSAN health Performance data collection fails').
Deeper checks — M4, Read this (M logs)
M4 — What is this object's REAL policy?
Read an object's actual policy spec — not the profile name vCenter shows.
/usr/lib/vmware/osfs/bin/objtool getattr -u <OBJECT-UUID> | grep -i policy
Replace: <OBJECT-UUID> with the object's UUID (from O's debug object list).
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-22 — the policy block of the O4 getattr capture.
Object policy:
spbmProfileId = 0212ed07-2dca-45d4-8262-c5cab4c30ac1
spbmProfileName = vSAN-ESA - Optimal Datastore Default Policy - AutoRAID
autoManagedRAID = i1
autoRAIDLevel = i5
objectVersion = i24
CSN = l2819
SCSN = l2817
Look for
- The capability values themselves (failures to tolerate, striping, etc.) — this is the ground truth the object was built with, whatever the profile is called today.
- Objtool's identification uses (damaged objects, the -c reverse lookup, --bypassDOM) live in O.
Read this (M logs)
- vsanmgmt.log (the vSAN management service)
- hostd.log
- vpxa.log
Hands off to: O — policy and compliance land as object health. P and N — when management disagrees with the hosts, the host layers are the truth; start again at P1.
A — Application
What the client shows vs what the hosts know.
Captured on esxi01.lab.local and the VCSA (ESXi 9.1.1 / vCenter 9.1.1, vSAN ESA), 2026-10-23 — identifiers pseudonymized per the sheet's disclosure; readings as captured. Samples marked (trimmed) are shortened under the sheet's trimming rule; the elision is labelled inside the sample.
What lives here. VPXD (vCenter Server, incl. the vSAN Health service), VPXA (the vCenter agent on each host), HOSTD (the host management service). Every user-initiated vSAN task — VM/VMDK create/delete, policy create/modify, feature enablement, health monitoring, disk-group and fault-domain creation — flows: web client or RVC -> vCenter API (VPXD) -> VPXA on the host -> HOSTD -> the M-layer libraries that do the work.
- VPXD — vCenter Server and its vSAN Health service.
- VPXA — the vCenter agent on each host.
- HOSTD — the host management service.
RVC: an A-layer tool, cited not sectioned: Broadcom KB 326527, "Using Ruby vSphere Console (RVC) for vSAN".
Start here. A1, A2, A3 — the three status reads, one per hop.
A1 — Is HOSTD alive?
HOSTD status only. No restarts on this sheet.
/etc/init.d/hostd status
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-23
hostd is running.
Look for
| Healthy | hostd reports running. |
|---|---|
| Suspicious | hostd not running, or esxcli itself stops answering — that symptom points back at this layer; try A4's bypass to prove it. |
| Stop-escalate | hostd down and A4's localcli bypass also silent -> the fault is below A, on the host itself. Stop working the management chain and go to P. |
A2 — Is VPXA alive?
VPXA status only. No restarts on this sheet.
/etc/init.d/vpxa status
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-23
vpxa is running
Look for
| Healthy | vpxa reports running — the vCenter-to-host hop is staffed. |
|---|---|
| Suspicious | vpxa down while hostd is up -> the host may be fine and vCenter's view of it stale; that is an A diagnosis, not a host fault. |
| Stop-escalate | vpxa down and the host-side reads from P/N/O stay healthy -> believe the host reads. The chain is broken at this hop; nothing the client shows about this host is current. |
A3 — Are vCenter's own services up?
vCenter service status, including the vSAN Health service, on the VCSA.
service-control --status
Replace: run on the VCSA, not on a host.
READ THIS — SAMPLE OUTPUT Captured on the VCSA (vCenter 9.1.1), 2026-10-23 (trimmed). The full Running list holds 40 services; the sample keeps the decisive names. The Stopped names shown are the expected-off set (no VCHA configured, no image builder, no netdumper) — stopped is their healthy state.
Running:
… vmware-vmon vmware-vpostgres vmware-vpxd
vmware-vpxd-svcs vmware-vsan-health vmware-vsm
vsphere-ui vstats wcp (trimmed — 40 services running in the full read)
Stopped:
vc-salt vmcam vmware-imagebuilder vmware-netdumper
vmware-rbd-watchdog vmware-vcha (trimmed)
Look for
| Healthy | VPXD and the vSAN Health service running. |
|---|---|
| Suspicious | Health service down -> health data that never refreshed is a service problem, not a cluster finding. |
| Stop-escalate | vmware-vpxd itself stopped -> the client has nothing true to show. Every UI reading is void until the chain is staffed again; work from host commands only. |
A4 — The hostd bypass
localcli runs the same vSAN namespaces without going through HOSTD. When esxcli stops answering, that symptom itself points back at A — the bypass both proves the hop and keeps diagnosis moving.
localcli vsan cluster get
Replace: localcli takes the same vsan namespaces as esxcli — swap in the read you would have run.
READ THIS — SAMPLE OUTPUT Captured on esxi01.lab.local (ESXi 9.1.1, vSAN ESA), 2026-10-23 (trimmed). The same reading P1 takes through esxcli — taken here through localcli, with HOSTD out of the path.
Cluster Information:
Enabled: true
Local Node UUID: 6f4a2c8e-91bd-4e57-a3c0-7d5b9e1f2046
Local Node Type: NORMAL
Local Node State: MASTER
Local Node Health State: HEALTHY
Sub-Cluster Master UUID: 6f4a2c8e-91bd-4e57-a3c0-7d5b9e1f2046
Sub-Cluster Backup UUID: 3d8b7a19-5c2e-4f60-b4a9-1e6d8c3f5a72
Sub-Cluster UUID: 528bd398-cf7f-9ffb-40c2-34e1ea584113
Sub-Cluster Membership Entry Revision: 1
Sub-Cluster Member Count: 3
Sub-Cluster Member UUIDs: 6f4a2c8e-91bd-4e57-a3c0-7d5b9e1f2046, 3d8b7a19-5c2e-4f60-b4a9-1e6d8c3f5a72, 9a5e1d73-8b4c-4a2f-a6d1-4f7b2e9a8d05
Sub-Cluster Member HostNames: esxi01.lab.local, esxi02.lab.local, esxi03.lab.local
Unicast Mode Enabled: true
Maintenance Mode State: OFF
Mode: REGULAR
vSAN ESA Enabled: true
(trimmed)
Look for
| Healthy | localcli answers with the cluster picture — the bypass works and the vSAN readings underneath remain trustworthy. |
|---|---|
| Suspicious | localcli answers while esxcli does not -> HOSTD is the lying hop; the vSAN readings themselves remain trustworthy. |
| Stop-escalate | localcli also fails -> this is not an A problem. The host's own vSAN stack is not answering locally; go down to P and work the host. |
Read this (A logs)
- vpxd.log on vCenter; vpxa.log and hostd.log on the host.
Look for (the layer's signature)
UI vs reality divergence. The client shows what VPXD believes. When that disagrees with the host-side truth from P/N/O/M, believe the host commands and diagnose the chain: stale inventory, a task that died at one hop, or health data that never refreshed.
Hands-off: nothing in this layer gets restarted from this sheet. A dead hop is the diagnosis — restarting hostd, vpxa, or a vCenter service is a remediation decision, made off-sheet, after the chain is proven.