VSAN CVM 1.7.816.7724 (vSphere 8): node-wide I/O stalls with idle disk - hangedTaskExist, DistCs contention, nodes
Posted: Thu Oct 29, 2026 9:02 pm
Hi all,
We run a 3-node StarWind VSAN Free cluster (Linux CVM appliance) on vSphere 8 in production and have been chasing recurring node evictions for weeks. We ruled out the infrastructure side with measurements; the evidence now points inside the StarWind service. Right now all three HA devices are running on a single copy, because every resync attempt triggers a new stall. Any guidance from the StarWind team is very welcome.
A compact evidence file is attached. The full bundle (raw StarWind logs of four stall windows from all three nodes, per-second disk/CPU samples, thread stacks, ESXi events) is available on request.
Environment
Several times per day a node is evicted by its partner:
16 evictions on 10/29 before 17:00. ESXi sees VMFS heartbeat timeouts (1,051 in 22 h, all on the StarWind datastores), APD and path churn. After an eviction, the resync either aborts or completes and the node is evicted again a few minutes later (e.g. SW-0102 resync completed 17:24:39, evicted 17:27:52).
Best capture so far: 10/29 17:17, node cvm-03
cvm-02 was receiving two resyncs (SW-0102 from cvm-01, SW-0203 from cvm-03). SW-0103 was fully synchronized between cvm-01 and cvm-03 and not involved in any sync.
1) The first symptom on cvm-03 is mirrored writes to the resyncing partner (cvm-02) not completing:
These waits grow up to 85.8 seconds. cvm-02 at that moment had StarWindService pinned at about one core with light disk activity.
2) From 17:17:29 to about 17:18:45 the NVMe of cvm-03 is completely idle (0-8 completed ops per 2 s, nothing in flight), while StarWindService on cvm-03 holds about one core. The management port 3261 keeps answering. dmesg is clean.
3) The hot threads run in user space and wait on a futex - no kernel time:
4) The stall is node-wide. The healthy device on the same node hangs too:
followed by DistCs::enter retries (CSid = 0xCCC5), and at 17:18:44 SW-0103 on cvm-03 changes its own sync status to 3 (not synchronized). All 7 ESXi hosts lost the VMFS heartbeat on SW-0203 and SW-0103 for 60-90 seconds.
Our reading: during a resync, a partner that is busy (one thread pinned) responds slowly to mirrored writes, the source node blocks on those partner sends, and that blocks I/O for every device on the source node, including devices that are not involved.
Earlier the same day we saw the same pattern, with DistCs contention and evictions:
What we ruled out (with measurements)
We run a 3-node StarWind VSAN Free cluster (Linux CVM appliance) on vSphere 8 in production and have been chasing recurring node evictions for weeks. We ruled out the infrastructure side with measurements; the evidence now points inside the StarWind service. Right now all three HA devices are running on a single copy, because every resync attempt triggers a new stall. Any guidance from the StarWind team is very welcome.
A compact evidence file is attached. The full bundle (raw StarWind logs of four stall windows from all three nodes, per-second disk/CPU samples, thread stacks, ESXi events) is available on request.
Environment
- StarWind VSAN CVM v8.0.0 build 20089 / 1.7.816.7724 (Ubuntu 20.04.1, kernel 5.15.0-124), Free license, 3 nodes
- vSphere 8 (vCenter 8.0.3, ESXi 25067014 ), 7 ESXi hosts consume the LUNs via software iSCSI (Round Robin iops=1, ALUA SATP rule)
- Each CVM: 8 vCPU (reserved), 24 GB RAM (reserved), 4 GB swap, on a 2x EPYC 9654/9754 host
- Each CVM: 1x Micron 9300 15.36 TB NVMe in PCIe passthrough -> md0 -> LVM -> XFS (13.96 TiB)
- 3 HA devices, 2-way sync replication, thick, 6.5 TiB each: SW-0102 (cvm-01/02), SW-0103 (cvm-01/03), SW-0203 (cvm-02/03)
- Created with StarWindX: FailoverStrategy=0 (heartbeat on management network), SyncSessionCount=1, ALUAOptimized=true, CacheMode=none, BitmapStoreType=1, BitmapStrategy=1, MaxUnmap=128, SectorSize=512
- Network: 2x 10GbE per host (vDS), dedicated VLANs for iSCSI-A, iSCSI-B and sync (MTU 9000)
- Workload: 109 VMs on 3 VMFS6 datastores, Veeam backups (snapshots + hot-add), vSphere Replication (RPO 10 min) on 17 VMs
Several times per day a node is evicted by its partner:
Code: Select all
HA: HANode::onScsiOp_CustomControl_HeartbeatPingShutdown: Event: 'not restorable' flag is 0, shutdown reason 'timeout on local underlying storage device', async update header flag is 1.Best capture so far: 10/29 17:17, node cvm-03
cvm-02 was receiving two resyncs (SW-0102 from cvm-01, SW-0203 from cvm-03). SW-0103 was fully synchronized between cvm-01 and cvm-03 and not involved in any sync.
1) The first symptom on cvm-03 is mirrored writes to the resyncing partner (cvm-02) not completing:
Code: Select all
17:17:29 HA: Ssc_Request_Task::complete: Warning(Partner send): ... GeneralOpCode(0x8A) ... PartnerOpCode(0xF2), PartnerDiffTimeCompleteEXEC = 3676 ms ... Current target: '...53-sw-0203-n01-n03', Partner target: '...52-sw-0203-n01-n02'!2) From 17:17:29 to about 17:18:45 the NVMe of cvm-03 is completely idle (0-8 completed ops per 2 s, nothing in flight), while StarWindService on cvm-03 holds about one core. The management port 3261 keeps answering. dmesg is clean.
3) The hot threads run in user space and wait on a futex - no kernel time:
Code: Select all
17:17:35 TID=3660940 user=158 sys=0 (ticks/2s, 200 = 1 core) wchan=futex_wait_queue_me
17:17:46 TID=3379676 user=226 sys=0 wchan=0
stack: futex_wait_queue_me <- futex_wait <- do_futex <- __x64_sys_futexCode: Select all
17:17:48 Common: CStarWindStorageDevice::hangedTaskExist: Storage device hanged operation: location = C:\starwind\storage\mnt\md0\vol-nvme01\SW-0103-N01.img, ... cdb[0] = 0x8A / 0x88Our reading: during a resync, a partner that is busy (one thread pinned) responds slowly to mirrored writes, the source node blocks on those partner sends, and that blocks I/O for every device on the source node, including devices that are not involved.
Earlier the same day we saw the same pattern, with DistCs contention and evictions:
Code: Select all
15:53 cvm-02: DistCs::leaveOnTheDistributeSharersSide: (CSid = 0xCCC5) LEAVE command on dist sharer(Id = 0xD0) can't be complete. Sharer return BUSY.
15:54 cvm-02: DistCs::forceLeaveOnTheDistributeSharersSide: *WARNING* (CSid = 0xCCC5) FORCE LEAVE command on dist sharer(Id = 0xD0) refused.
16:43:44 cvm-02 SW-0203 resync completes -> 16:43:46 DistCs retries start -> 0x89 takes 11.8 s -> evicted 16:44:18- Memory: 24 GB reserved, about 50% used, swap 0 (an earlier incident with 16 GB and swap exhaustion was fixed).
- CPU contention: CVM CPU reserved, ESXi hosts at 7-13% CPU.
- VM snapshots on the CVMs: removed.
- NVMe / kernel / XFS: disk idle during stalls, SMART PASSED, dmesg clean, image files contiguous (2,363-5,553 extents per 6.5 TiB image), hot threads with sys=0.
- Network: sync VLAN jumbo ping OK, under 1 Gbit/s at event times.
- VMFS ATS heartbeat: disabled on all hosts per VMware KB 2113956. It reduced heartbeat timeouts, but the 17:17 stall happened with it disabled.
- Is this a known issue ? Is there a newer build that fixes it?
- Why does a slow partner during resync block all I/O on the source node, including a device that is not part of that resync? Can partner-send waits be bounded or isolated per device?
- Can resync traffic or priority be throttled so a resync does not saturate the target node?
- What does DistCs CSid 0xCCC5 protect, and what does "FORCE LEAVE ... refused" mean for the HA device?
- Recommended settings for ~100 VMs / 7 hosts per LUN: SyncSessionCount, number of heartbeat channels, CVM vCPU sizing (the hot thread caps at one core), ESXi iSCSI settings.
- How do we safely bring the three devices back to two copies without triggering the stall again (resync one device at a time, maintenance mode, a specific procedure)?
- What else should we collect (debug log level, support bundle, a dump of the hot thread)?
Code: Select all
StarWind VSAN CVM v8.0.0 build 20089 - KEY EVIDENCE - 2026-10-29 (local time UTC-3)
3 CVMs (8 vCPU reserved, 24 GB reserved, Micron 9300 NVMe passthrough, XFS), 3 HA devices 2-way,
7 ESXi 8 hosts via iSCSI, 109 VMs. Nodes: cvm-01 .51, cvm-02 .52, cvm-03 .53.
Devices: SW-0102 (cvm-01/cvm-02), SW-0103 (cvm-01/cvm-03), SW-0203 (cvm-02/cvm-03).
STATE AT 17:17: cvm-02 was receiving TWO resyncs (SW-0102 from cvm-01, SW-0203 from cvm-03).
SW-0103 was SYNCHRONIZED on cvm-01 and cvm-03 (no sync involved). ESXi ATS heartbeat already disabled.
[E1] cvm-03: first symptom = mirrored writes to the RESYNCING partner (cvm-02) not completing
17:17:29 HA: Ssc_Request_Task::complete: Warning(Partner send): ... GeneralOpCode(0x8A) buf_size(4096),
PartnerOpCode(0xF2), PartnerDiffTimeCompleteEXEC = 3676 ms ... Current target: '...53-sw-0203-n01-n03',
Partner target: '...52-sw-0203-n01-n02'!
Partner-send warnings on cvm-03, 17:17:20-17:19:10, by partner (count per 10 s):
to cvm-02 (SW-0203, resync target): 17:17:2x 25 | 3x 61 | 4x 17 | 18:0x 5 | 1x 10 | 2x 7 | 3x 18 | 4x 88 | 5x 61 max 85,836 ms
to cvm-01 (SW-0103, healthy): 17:17:3x 6 | 4x 24 | 5x 3 | 18:0x 2 | 4x 32 max 70,416 ms
cvm-01 was healthy at that time (disk busy 15-35k ops/2s, service 6-40% CPU), so the SW-0103 waits are
cvm-03 itself being stalled.
[E2] cvm-03: disk IDLE for ~75 s while StarWindService holds ~1 core (2-s samples, /proc/diskstats)
17:17:20 nvme ops+=14016 inflight=0 busy+=1360ms | sw=18.8% wine=6.2% | 3261=OK
17:17:24 nvme ops+=7601 inflight=0 busy+=624ms | sw=62.5% wine=6.2% | 3261=OK
17:17:29 nvme ops+=276 inflight=0 busy+=120ms | sw=106.2% wine=0% | 3261=OK
17:17:33 nvme ops+=8457 inflight=0 busy+=312ms | sw=100% wine=0% | 3261=OK
17:17:38 nvme ops+=64 inflight=0 busy+=76ms | sw=100% wine=0% | 3261=OK
17:17:42 nvme ops+=43 inflight=0 busy+=68ms | sw=100% wine=0% | 3261=OK
17:17:47 nvme ops+=73 inflight=0 busy+=16ms | sw=100% wine=0% | 3261=OK
17:17:52 nvme ops+=2 inflight=0 busy+=8ms | sw=94.1% wine=0% | 3261=OK
17:17:56 nvme ops+=0 inflight=0 busy+=0ms | sw=100% wine=0% | 3261=OK
17:18:01 nvme ops+=1 inflight=0 busy+=4ms | sw=100% wine=0% | 3261=OK
17:18:06 nvme ops+=1 inflight=0 busy+=4ms | sw=112.5% wine=0% | 3261=OK
17:18:20 nvme ops+=4 inflight=0 busy+=24ms | sw=112.5% wine=0% | 3261=OK
17:18:25 nvme ops+=4 inflight=0 busy+=16ms | sw=100% wine=0% | 3261=OK
17:18:29 nvme ops+=3 inflight=0 busy+=12ms | sw=100% wine=0% | 3261=OK
17:18:44 nvme ops+=245 inflight=0 busy+=84ms | sw=112.5% wine=0% | 3261=OK
17:18:48 nvme ops+=105 inflight=0 busy+=100ms | sw=100% wine=0% | 3261=OK
17:18:53 nvme ops+=696 inflight=0 busy+=372ms | sw=100% wine=0% | 3261=OK
17:18:57 nvme ops+=2018 inflight=0 busy+=476ms | sw=106.7% wine=0% | 3261=OK
(port 3261 answered on every sample; dmesg clean; no in-flight I/O on the NVMe)
[E3] cvm-03 hot thread during the stall (per-thread utime/stime delta, 200 ticks/2 s = 1 core)
17:17:35 TID=3660940 user=158 sys=0 wchan=futex_wait_queue_me
17:17:37 TID=3379676 user=174 sys=0 wchan=futex_wait_queue_me
17:17:43 TID=3660940 user=209 sys=0 wchan=futex_wait_queue_me
17:17:46 TID=3379676 user=226 sys=0 wchan=0
stack: futex_wait_queue_me <- futex_wait <- do_futex <- __x64_sys_futex (user space spin + futex)
[E4] cvm-03: the HEALTHY device hangs too (node-wide stall)
17:17:48 Common: CStarWindStorageDevice::hangedTaskExist: Storage device hanged operation:
location = C:\starwind\storage\mnt\md0\vol-nvme01\SW-0103-N01.img, cdb[0] = 0x8A / 0x88
hangedTaskExist per 10 s: 17:17:4x 774 | 5x 641 | 18:0x 1892 | 1x 2731 | 2x 2256 | 3x 5499 | 4x 13489
DistCs::enter (CSid 0xCCC5) retries per 10 s: 17:18:0x 168 | 1x 176 | 2x 200 | 3x 204 | 4x 133
17:17:56 cvm-02: SW-0203 resync aborts (status 3 from 2)
17:18:44 cvm-03: SW-0103 "changed own sync status to 3 from 1" (healthy device lost its 2nd copy)
[E4b] cvm-02 (the resync TARGET) at the same time: StarWindService ~1 core, NVMe lightly used
17:17:20 nvme ops+=4135 inflight=0 busy+=864ms | sw=125% wine=0% | 3261=OK
17:17:25 nvme ops+=941 inflight=0 busy+=500ms | sw=93.8% wine=0% | 3261=OK
17:17:29 nvme ops+=1810 inflight=0 busy+=772ms | sw=106.7% wine=0% | 3261=OK
17:17:42 nvme ops+=14656 inflight=0 busy+=1184ms | sw=12.5% wine=0% | 3261=OK
17:17:47 nvme ops+=13630 inflight=0 busy+=892ms | sw=113.3% wine=0% | 3261=OK
17:18:00 nvme ops+=4151 inflight=0 busy+=416ms | sw=125% wine=0% | 3261=OK
17:18:04 nvme ops+=5370 inflight=0 busy+=576ms | sw=106.2% wine=0% | 3261=OK
17:18:09 nvme ops+=20483 inflight=0 busy+=540ms | sw=75% wine=0% | 3261=OK
17:18:52 nvme ops+=338 inflight=0 busy+=380ms | sw=87.5% wine=0% | 3261=OK
17:18:57 nvme ops+=418 inflight=0 busy+=364ms | sw=106.2% wine=0% | 3261=OK
[E5] ESXi (7 hosts, VMFS heartbeat as plain SCSI read/write since ATS-HB was disabled)
17:17:40-17:17:45 heartbeat timedout on SW-0203 (6 hosts); 17:17:44-17:17:48 on SW-0103 (7 hosts)
17:18:49-17:19:12 recovered => 60-90 s with no I/O completing on both LUNs served by cvm-03
[E6] Same pattern earlier the same day (raw logs available)
15:53 cvm-02: 239 DistCs retries, "LEAVE ... Sharer return BUSY", "TIMEOUT_NOTIFY",
"FORCE LEAVE command on dist sharer refused", FileIO up to 26,576 ms -> evicted 15:54:13
16:43:44 cvm-02 SW-0203 resync completes; 16:43:46 DistCs retries start; 0x89 takes 11,788 ms;
evicted 16:44:18 ("timeout on local underlying storage device")
17:24:39 cvm-02 SW-0102 resync completes -> evicted again 17:27:52
16 evictions across the 3 nodes on 10/29 before 17:00.
RULED OUT: memory (24 GB, swap 0), CPU contention (reserved, hosts 7-13%), VM snapshots (removed),
NVMe/kernel (idle disk, SMART OK, dmesg clean), XFS (images contiguous, 2,363-5,553 extents per
6.5 TiB), network (jumbo ping OK, <1 Gbit/s), ESXi ATS heartbeat (disabled - stall reproduced).