VMware vSphere Knowledge Base

Phase 1 — Top 10 Common Issues ⚠ Break Scenarios ✓ Fix Procedures
10
Total Issues
7
Break Scenarios
3
Fix Procedures
Phase 1
Current Phase
1
vSphere HA Failover Not Triggering
VMs not restarted after host failure — FDM agent, heartbeat datastores, and isolation address misconfiguration
Impact: VMs remain powered off after a host failure. Production workloads experience unplanned downtime with no automatic recovery. SLA breach risk is immediate.
Symptoms
  • Host fails but VMs are not restarted on surviving hosts
  • vSphere Client shows HA status as "Misconfigured" or "Agent unreachable"
  • HA events in vCenter: "vSphere HA failover failed"
  • Heartbeat datastore count shows 0 or 1 (minimum 2 recommended)
  • FDM log: Isolated from all other nodes
Root Causes
  • FDM agent crashed or failed to start on the master host
  • No heartbeat datastores configured (only network heartbeat used)
  • Isolation address unreachable — host declares itself isolated
  • Admission control blocks VM restart due to insufficient resources
  • VM restart priority set to "Disabled"

vSphere HA relies on the FDM (Fault Domain Manager) agent running on each host. A master host monitors slave hosts via network heartbeats and datastore heartbeats. When the master detects a host failure, it initiates VM restarts on surviving hosts. If the FDM agent is down, heartbeat datastores are missing, or admission control is too strict, the failover chain breaks and VMs remain offline.

1

Check FDM agent status on each host

# SSH to each ESXi host:
/etc/init.d/fdm status

# Check FDM logs for errors:
cat /var/log/fdm.log | grep -i "error\|fail\|isolat" | tail -30
2

Verify HA advanced settings and isolation address

# Check HA isolation response and address:
esxcli system settings advanced list -o /das/

# Key settings to verify:
# das.isolationAddress0 — should be a reliable gateway IP
# das.useDefaultIsolationAddress — verify true/false
3

Check heartbeat datastore configuration

# From vSphere Client:
# Cluster → Configure → vSphere Availability → Heartbeat Datastores
# Verify at least 2 heartbeat datastores are listed

# PowerCLI:
Get-Cluster "ClusterName" | Get-HASetting | Select *heartbeat*
1

Restart FDM agent on affected hosts

# SSH to the ESXi host:
/etc/init.d/fdm restart

# Verify agent is running:
/etc/init.d/fdm status
# Expected: "VMware Fault Domain Manager is running"
2

Reconfigure HA on the cluster

# PowerCLI — force HA reconfiguration on all hosts:
$cluster = Get-Cluster "ClusterName"
$cluster | Get-VMHost | ForEach-Object {
    $_ | Set-VMHost -State "Connected" -Confirm:$false
}

# Or from vSphere Client:
# Right-click host → Reconfigure for vSphere HA
3

Configure isolation address and admission control

# Set a reliable isolation address (e.g., default gateway):
# Cluster → Configure → vSphere Availability → Advanced Options
# Add: das.isolationAddress0 = 10.0.0.1

# Adjust admission control:
# Cluster → Configure → vSphere Availability → Admission Control
# Set "Host failures cluster tolerates" = 1
# Choose "Cluster resource percentage" or "Dedicated failover hosts"
🛈 Best Practice: Always configure at least 2 heartbeat datastores. Set a custom isolation address that is highly available (e.g., your default gateway). Test HA failover in a maintenance window by shutting down a host gracefully. Verify VM restart priorities are set for critical VMs.
2
DRS Not Balancing VMs Across Hosts
VMs remain concentrated on one host despite resource imbalance — DRS automation, affinity rules, or threshold issues
Impact: Uneven resource utilization causes hot spots. Overloaded hosts experience CPU/memory contention, leading to VM performance degradation and potential HA admission control failures.
Symptoms
  • One host at 85%+ CPU/memory while others sit at 20%
  • DRS recommendations appear but are not applied
  • vCenter events: "DRS fault" or "Cannot move VM"
  • VMs pinned by affinity/anti-affinity rules
  • Resource pool limits preventing migration
Root Causes
  • DRS set to "Manual" or "Partially Automated"
  • Migration threshold too conservative (level 1–2)
  • VM-Host affinity rules constraining placement
  • vMotion network not configured or broken
  • Resource pool limits/reservations blocking migration

DRS calculates load balance recommendations every 5 minutes based on CPU and memory demand. When the automation level is set to Manual, recommendations are generated but never executed. Affinity rules and resource pool reservations further constrain DRS from migrating VMs. A conservative migration threshold (level 1) means DRS only moves VMs under extreme imbalance, allowing moderate hot spots to persist.

1

Check DRS configuration and recommendations

# PowerCLI — Check DRS settings:
Get-Cluster "ClusterName" | Select Name, DrsEnabled, DrsAutomationLevel

# Get pending DRS recommendations:
Get-DrsRecommendation -Cluster "ClusterName" | Format-Table -AutoSize
2

Review DRS faults in vCenter events

# PowerCLI — Check for DRS faults:
Get-VIEvent -Entity (Get-Cluster "ClusterName") -MaxSamples 100 |
  Where-Object { $_.FullFormattedMessage -match "DRS|migration" } |
  Select CreatedTime, FullFormattedMessage | Format-Table -Wrap

# vCenter UI: Cluster → Monitor → Events → Filter "DRS"
3

Check affinity rules and resource pool limits

# PowerCLI — List all DRS rules:
Get-DrsRule -Cluster "ClusterName" | Format-Table Name, Enabled, Type, VMIds

# Check resource pool limits:
Get-ResourcePool -Location (Get-Cluster "ClusterName") |
  Select Name, CpuLimitMHz, MemLimitGB, CpuReservationMHz, MemReservationGB
1

Set DRS to Fully Automated with appropriate threshold

# PowerCLI:
Set-Cluster "ClusterName" -DrsAutomationLevel FullyAutomated -Confirm:$false

# vCenter UI:
# Cluster → Configure → vSphere DRS → Edit
# Automation Level: Fully Automated
# Migration Threshold: 3 (default, recommended for most environments)
2

Review and adjust affinity rules

# List conflicting rules:
Get-DrsRule -Cluster "ClusterName" | Where { $_.Enabled } |
  Format-Table Name, Type, @{N="VMs";E={($_.VMIds | ForEach { (Get-VM -Id $_).Name }) -join ", "}}

# Disable overly restrictive rules:
Get-DrsRule -Cluster "ClusterName" -Name "Rule-Name" |
  Set-DrsRule -Enabled $false -Confirm:$false
3

Remove resource pool limits blocking migration

# PowerCLI — Remove CPU/Memory limits from resource pools:
Get-ResourcePool -Location (Get-Cluster "ClusterName") -Name "Problem-RP" |
  Set-ResourcePool -CpuLimitMHz $null -MemLimitGB $null -Confirm:$false

# Verify vMotion network is functional:
# Test from ESXi: vmkping -I vmk1 <destination_host_vmotion_ip>
🛈 Best Practice: Use DRS migration threshold level 3 (default) for most clusters. Avoid creating VM-Host affinity rules unless absolutely required (e.g., licensing). Monitor DRS imbalance via vCenter performance charts. Use Predictive DRS with vRealize Operations for proactive balancing.
3
vMotion Failure — Migration Timeout
VM migration fails with timeout or network error — VMkernel, MTU, firewall, and CPU compatibility issues
Impact: DRS cannot balance the cluster. Maintenance mode operations are blocked. HA failover capacity is reduced. Patch cycles stall because hosts cannot be evacuated.
Symptoms
  • vMotion fails at 10% or 90% with timeout
  • Error: "A general system error occurred: Timed out waiting for migration data"
  • Error: "The source detected that the destination failed to resume"
  • vpxd.log: Migration to host X failed with error VMotionInterfaceNotConfigured
  • Migration starts but never completes — stalls at pre-copy phase
Root Causes
  • No vMotion VMkernel adapter configured on source or destination
  • MTU mismatch between hosts (9000 vs 1500)
  • vMotion VLAN not trunked on physical switch
  • CPU incompatibility — EVC mode not enabled or mismatched
  • ESXi firewall blocking vMotion ports (8000, 8200)

vMotion transfers a VM's live memory state from one host to another over a dedicated VMkernel adapter. The process uses an iterative pre-copy mechanism: it copies all memory pages, then re-copies only the changed (dirty) pages. If the network is too slow (MTU mismatch, wrong VLAN), the dirty page rate exceeds the transfer rate, and the migration times out. If there's no vMotion VMkernel at all, the operation fails immediately. CPU incompatibility prevents the VM from resuming on the destination host.

1

Verify vMotion VMkernel exists on both hosts

# On each ESXi host:
esxcli network ip interface list
# Look for a vmk with "VMotion" service enabled

# Check which services are enabled:
esxcli network ip interface tag get -i vmk1
# Should show: VMotion
2

Test vMotion connectivity and MTU

# Ping with jumbo frames from source to destination:
vmkping -I vmk1 -d -s 8972 <destination_vmotion_ip>
# -d = don't fragment  -s 8972 = test 9000 MTU

# If this fails, check physical switch MTU and VLAN trunk:
esxcfg-vmknic -l
# Compare MTU values across all hosts
3

Check CPU compatibility and EVC mode

# PowerCLI — Check EVC mode:
Get-Cluster "ClusterName" | Select Name, EVCMode

# Check individual host CPU:
Get-VMHost | Select Name, ProcessorType, MaxEVCMode

# From vCenter UI:Cluster → Configure → VMware EVC
# All hosts must support the configured EVC baseline
1

Create or fix vMotion VMkernel adapter

# If vMotion vmk is missing, create one:
esxcli network ip interface add -i vmk2 -p "vMotion"

# Enable vMotion service on existing vmk:
# vCenter UI: Host → Configure → Networking → VMkernel adapters
# Edit vmk → Enable "vMotion" service

# PowerCLI:
New-VMHostNetworkAdapter -VMHost "esxi01" -PortGroup "vMotion-PG" `
  -VirtualSwitch "vSwitch1" -IP "10.10.20.11" -SubnetMask "255.255.255.0" `
  -VMotionEnabled $true
2

Fix MTU mismatch across the path

# Set consistent MTU on all ESXi hosts:
esxcli network ip interface set -i vmk1 -m 9000

# Set on vSwitch or dvSwitch:
esxcli network vswitch standard set -v vSwitch1 -m 9000

# IMPORTANT: Also configure physical switches:
# Cisco: interface GigabitEthernet1/0/1 → mtu 9216
# Verify end-to-end with vmkping -d -s 8972
3

Enable EVC mode for mixed-CPU clusters

# PowerCLI — Set EVC mode:
Set-Cluster "ClusterName" -EVCMode "intel-broadwell" -Confirm:$false
# Choose the baseline matching your OLDEST host CPU generation

# Prerequisites:
# - All VMs must be powered off or at a compatible CPU level
# - DRS must be enabled on the cluster
# - No VM can expose CPU features above the EVC baseline
EVC mode can only be raised to a higher baseline with VMs powered off. Plan a maintenance window if changing EVC on a production cluster.
🛈 Best Practice: Use dedicated vMotion NICs with jumbo frames (MTU 9000) for best performance. Enable EVC at cluster creation time before adding hosts. Use multi-NIC vMotion for large VMs to reduce migration time. Test vMotion after any network change.
4
ESXi Host Disconnected from vCenter
Host shows "Disconnected" or "Not Responding" — vpxa agent, management network, DNS, and certificate issues
Impact: vCenter cannot manage the host. DRS, HA monitoring, provisioning, and vMotion are unavailable for VMs on this host. Existing VMs continue running but cannot be managed remotely.
Symptoms
  • Host shows "Disconnected" or "Not Responding" in vCenter inventory
  • Cannot perform any operations on VMs via vCenter
  • vpxa.log: Failed to connect to vCenter
  • Direct ESXi host UI (DCUI/SSH) works fine — host is operational
  • vCenter alarm: "Host connection lost"
Root Causes
  • vpxa agent crashed or stopped on the ESXi host
  • Management network (vmk0) IP conflict or link down
  • DNS resolution failure — host cannot resolve vCenter FQDN
  • Expired or mismatched SSL certificates
  • Firewall blocking port 443 (HTTPS) or 902 (heartbeat)

The vpxa agent on each ESXi host maintains a persistent connection to vCenter Server (vpxd). This connection uses port 443 for API communication and port 902 for heartbeats. When vpxa cannot reach vCenter — due to network issues, DNS failure, certificate problems, or agent crashes — vCenter marks the host as disconnected. The host is fully operational; it just can't be managed centrally.

1

Check vpxa agent status and restart if needed

# SSH to the ESXi host:
/etc/init.d/vpxa status
/etc/init.d/vpxa restart

# Check vpxa logs:
tail -50 /var/log/vpxa.log
# Look for: "SSL handshake failed", "Connection refused", "DNS lookup failed"
2

Verify management network and DNS

# Check management VMkernel:
esxcli network ip interface list
# vmk0 should have correct IP and be Up

# Test DNS resolution:
nslookup vcenter.domain.com
# Must resolve to the correct vCenter IP

# Test connectivity to vCenter:
nc -z vcenter.domain.com 443
nc -z vcenter.domain.com 902
3

Check active network connections

# List all active connections:
esxcli network ip connection list | grep -E "443|902"
# Verify connections to vCenter IP exist

# Check firewall rules:
esxcli network firewall ruleset list | grep -i vpxa
esxcli network firewall ruleset set -e true -r vpxHeartbeats
1

Reconnect host from vCenter

# vCenter UI: Right-click the disconnected host → Connection → Connect
# If prompted, re-enter root credentials

# PowerCLI:
Set-VMHost -VMHost "esxi-host01.domain.com" -State "Connected" -Confirm:$false
2

Fix DNS and network connectivity

# Fix DNS on the ESXi host:
esxcli network ip dns server add -s 10.0.0.10
esxcli network ip dns server list

# Fix management network if IP is wrong:
esxcli network ip interface ipv4 set -i vmk0 -I 10.0.1.50 -N 255.255.255.0 -t static

# Verify default gateway:
esxcfg-route -l
esxcfg-route 10.0.1.1
3

Re-trust certificates if SSL handshake fails

# Remove and re-add the host to vCenter (last resort):
# 1. Disconnect host in vCenter
# 2. Remove host from inventory
# 3. Re-add host with FQDN

# Or reset vpxa certificate trust:
/etc/init.d/vpxa stop
rm /etc/vmware/vpxa/vpxa.cfg
/etc/init.d/vpxa start
# Then reconnect from vCenter (will re-push config)
Removing and re-adding a host will remove it from DRS/HA. VMs continue running but must be re-registered. Use this only as a last resort.
🛈 Best Practice: Always add ESXi hosts to vCenter using FQDN (not IP). Ensure forward and reverse DNS works for all hosts and vCenter. Monitor vpxa agent health via vCenter alarms. Keep certificates up to date — use VMCA or a trusted CA.
5
PSOD — Purple Screen of Death Recovery
Host crashes with purple diagnostic screen — coredump analysis, driver/firmware issues, and hardware failure
Impact: Complete host failure. ALL VMs on the host are instantly terminated. HA must restart VMs on other hosts. Potential data corruption if VMs had active I/O at crash time. Requires physical console access to view the PSOD screen.
Symptoms
  • Physical console displays a purple/pink diagnostic screen
  • All VMs on the host stop responding simultaneously
  • Host goes "Not Responding" in vCenter
  • HA restarts VMs on other hosts (if HA is functioning)
  • After reboot, /var/core/ contains a core dump file
Root Causes
  • NIC/HBA/GPU driver bug — most common PSOD cause
  • Hardware failure: memory ECC errors, CPU microcode bug
  • Firmware incompatibility with ESXi version
  • Kernel assertion failure (VMkernel bug)
  • Out-of-memory condition in VMkernel heap

A PSOD is the ESXi equivalent of a kernel panic. The VMkernel encounters an unrecoverable error — typically a driver passing bad data, a hardware fault, or an internal assertion failure. ESXi halts all execution, displays diagnostic information on the console (purple screen), writes a coredump to the configured dump partition or file, and waits for an administrator to reboot. The stack trace on the PSOD screen identifies the faulting module.

1

Collect and verify the coredump after reboot

# Check coredump configuration:
esxcli system coredump file list
esxcli system coredump partition list

# List available core dumps:
ls -la /var/core/
# Look for vmkernel-zdump.* files

# Copy coredump for analysis:
vm-support
# This generates a support bundle including the coredump
2

Analyze the PSOD backtrace

# Extract the stack trace from the coredump:
esxcli system coredump extract --corefile /var/core/vmkernel-zdump.1

# Key information from the PSOD screen:
# 1. "Module" line — identifies the faulting driver (e.g., nmlx5_core, ixgben)
# 2. Backtrace — shows the call stack at crash time
# 3. Build number — confirms ESXi version

# Check driver version:
esxcli software vib list | grep -i "nmlx5\|ixgbe\|qfle3\|lsi\|hpsa"
3

Check hardware health after reboot

# Check for memory errors:
esxcli hardware memory get
# Look for "Uncorrectable ECC Errors"

# Check system event log (IPMI/iLO/iDRAC):
# Access BMC → System Event Log → Filter for "Memory", "CPU", "PCI"

# Verify firmware versions:
esxcli hardware platform get
esxcli software vib list | grep -i firmware
1

Update the faulting driver/firmware

# If the PSOD backtrace points to a driver (e.g., nmlx5_core):

# Check VMware HCL for the correct driver version:
# https://www.vmware.com/resources/compatibility/search.php

# Update driver VIB:
esxcli software vib install -d /tmp/driver-bundle.zip

# Or use vLCM (vSphere Lifecycle Manager):
# Cluster → Updates → Image → Edit → Add vendor addon/driver
2

Apply ESXi patches if it's a known VMkernel bug

# Check VMware KB for your PSOD signature:
# Search KB for the module name + "PSOD"

# Apply the latest ESXi patch:
esxcli software profile update -p ESXi-8.0U2b-XXXXX-standard \
  -d https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml

# Or via vLCM baseline:
# Cluster → Updates → Baselines → Attach → Remediate
3

Replace hardware if memory/CPU errors detected

# If BMC event log shows memory DIMM errors:
# 1. Identify the failing DIMM slot from BMC logs
# 2. Place host in maintenance mode (evacuate VMs)
# 3. Power off and replace the DIMM
# 4. Run vendor diagnostics before returning to production

# Configure coredump persistence for future analysis:
esxcli system coredump file add -d /vmfs/volumes/datastore1 -f coredump-esxi01
esxcli system coredump file set -p /vmfs/volumes/datastore1/coredump-esxi01
esxcli system coredump file set -e true
🛈 Best Practice: Always configure a coredump file or partition so PSOD data is preserved across reboots. Keep drivers and firmware at versions listed in the VMware HCL. Use vLCM to maintain consistent driver/firmware across all hosts. Submit PSOD coredumps to VMware GSS for root-cause analysis via SR.
6
VM Power-On Failure — Insufficient Resources
VM won't start with "Insufficient resources" — admission control, reservations, swap file, and capacity issues
Impact: Critical VMs cannot be started. Disaster recovery and failover scenarios are blocked. Service restoration is delayed during incidents.
Symptoms
  • Error: "Insufficient resources to satisfy configured failover level for vSphere HA"
  • Error: "Unable to access file [datastore] vmname/vmname-flat.vmdk"
  • VM swap file cannot be created: "No space left on device"
  • vpxd.log: AdmissionCheck failed
  • Host has available CPU/RAM but power-on is still rejected
Root Causes
  • HA admission control reserves too much capacity for failover
  • VM memory reservation creates a swap file equal to unreserved memory
  • Datastore is full — no space for swap file (.vswp)
  • Memory overhead calculation exceeds available resources
  • Resource pool limit reached

When you power on a VM, ESXi must allocate physical resources: CPU slots, memory, and disk space for the VM's swap file. HA admission control may block the operation if it calculates that powering on this VM would leave insufficient resources for failover. Even if the host has physical capacity, a full datastore (no room for the .vswp file), resource pool limits, or memory overhead calculations can block the power-on.

1

Attempt power-on and capture the error

# CLI power-on with verbose output:
vim-cmd vmsvc/power.on <vmid>

# Get VM ID first:
vim-cmd vmsvc/getallvms | grep "vm-name"

# Check vpxd.log for admission control details:
# On VCSA:
grep -i "admission\|insufficient\|power.on" /var/log/vmware/vpxd/vpxd.log | tail -30
2

Check datastore free space and swap file requirements

# Check datastore space:
esxcli storage filesystem list
# Compare "Free" column — swap file needs (VM_Memory - Reservation) space

# PowerCLI:
Get-Datastore | Select Name,
  @{N="FreeGB";E={[math]::Round($_.FreeSpaceGB,2)}},
  @{N="CapacityGB";E={[math]::Round($_.CapacityGB,2)}},
  @{N="PercentFree";E={[math]::Round(($_.FreeSpaceGB/$_.CapacityGB)*100,1)}}
3

Check HA admission control policy

# PowerCLI:
Get-Cluster "ClusterName" | Select Name, HAEnabled, HAAdmissionControlEnabled,
  HAFailoverLevel, @{N="Policy";E={$_.ExtensionData.Configuration.DasConfig.AdmissionControlPolicy.GetType().Name}}

# Check current cluster capacity vs reserved:
Get-VMHost -Location (Get-Cluster "ClusterName") |
  Select Name, @{N="CPU_Used%";E={[math]::Round($_.CpuUsageMhz/$_.CpuTotalMhz*100)}},
  @{N="Mem_Used%";E={[math]::Round($_.MemoryUsageGB/$_.MemoryTotalGB*100)}}
1

Free datastore space or move VM to a datastore with space

# Find and remove orphaned VMDKs, old snapshots, ISO files:
# vCenter → Datastore → Files → Sort by size

# Storage vMotion the VM:
# PowerCLI:
Move-VM -VM "vm-name" -Datastore "datastore-with-space" -Confirm:$false

# Or reclaim space by consolidating snapshots:
vim-cmd vmsvc/snapshot.removeall <vmid>
2

Adjust HA admission control

# Reduce the reserved capacity:
# Cluster → Configure → vSphere Availability → Edit
# Change from "Dedicated failover hosts" to "Cluster resource percentage"
# Set CPU/Memory percentage to a reasonable value (e.g., 25%)

# PowerCLI:
$spec = New-Object VMware.Vim.ClusterConfigSpecEx
$spec.DasConfig = New-Object VMware.Vim.ClusterDasConfigInfo
$spec.DasConfig.AdmissionControlEnabled = $true
# Adjust percentage-based policy as needed
Disabling admission control is not recommended. It removes the safety net that ensures HA can restart VMs after a host failure. Adjust the policy instead.
3

Add memory reservation to reduce swap file size

# Set 100% memory reservation (eliminates .vswp file):
# VM → Edit Settings → Resources → Memory → Reservation = Max

# PowerCLI:
Get-VM "vm-name" | Get-VMResourceConfiguration |
  Set-VMResourceConfiguration -MemReservationGB 16
# Set to match the VM's configured memory
🛈 Best Practice: Keep at least 20% free space on datastores for swap files and snapshots. Use admission control with percentage-based policy. Right-size VMs to avoid over-allocation. For critical VMs, set memory reservations to avoid swap-related power-on failures.
7
vCenter Service Health — vpxd Crash / Restart Loop
vCenter unavailable, vpxd service crashing — disk space, database, and certificate health issues
Impact: Complete loss of centralized management. No DRS, no HA coordination, no provisioning, no VM management. All hosts and VMs continue running but are unmanageable. This is a P1 incident for any vSphere environment.
Symptoms
  • vSphere Client returns "503 Service Unavailable"
  • VCSA VAMI (port 5480) shows vpxd as "Stopped"
  • service-control --status shows vpxd stopped or restarting
  • vpxd.log: PANIC: Unexpected signal 11 or DB connection errors
  • VCSA disk partitions at 100% (especially /storage/log)
Root Causes
  • VCSA disk full — /storage/log or /storage/db at 100%
  • PostgreSQL database corruption or connection pool exhaustion
  • Expired VMCA or STS certificates
  • Memory exhaustion — vpxd heap overflow
  • Plugin or extension conflict causing vpxd crash

The vpxd service is the core of vCenter Server. It manages all host connections, VM operations, DRS scheduling, and HA coordination. When vpxd fails — due to disk space exhaustion (logs fill the partition), database issues (PostgreSQL crashes), or certificate expiration (STS token signing cert) — the entire vCenter management plane goes down. Hosts continue running VMs autonomously, but all centralized operations stop.

1

Check VCSA service status and disk space

# SSH to VCSA (or use VAMI shell):
service-control --status
# Or list all services:
vmon-cli --list

# Check disk usage:
df -h
# Critical partitions: /storage/log, /storage/db, /storage/seat
# If any are at 95%+, that's likely the cause
2

Review vpxd crash logs

# Check vpxd log for errors:
tail -100 /var/log/vmware/vpxd/vpxd.log
# Look for: "PANIC", "signal 11", "Cannot connect to database", "Out of memory"

# Check for certificate expiration:
for store in MACHINE_SSL_CERT TRUSTED_ROOT_CRLS; do
  /usr/lib/vmware-vmafd/bin/vecs-cli entry list --store "$store" --text | grep -A2 "Not After"
done
3

Check PostgreSQL database health

# Check if PostgreSQL is running:
service-control --status vmware-vpostgres

# Check DB connections:
/opt/vmware/vpostgres/current/bin/psql -U postgres -d VCDB \
  -c "SELECT count(*) FROM pg_stat_activity;"

# Check DB size:
/opt/vmware/vpostgres/current/bin/psql -U postgres -d VCDB \
  -c "SELECT pg_size_pretty(pg_database_size('VCDB'));"
1

Free disk space on VCSA

# Clear old log files:
find /var/log/vmware/ -name "*.log" -mtime +7 -exec rm {} \;
find /storage/log/ -name "*.gz" -mtime +14 -exec rm {} \;

# Clear core dumps:
rm -f /storage/core/*

# Truncate large active logs (if disk is 100% full):
> /var/log/vmware/vpxd/vpxd-1.log
> /var/log/vmware/vpxd/vpxd-2.log

# Verify space freed:
df -h /storage/log
2

Restart vCenter services

# Restart all services in correct order:
service-control --stop --all
service-control --start --all

# Or restart only vpxd:
service-control --stop vpxd
service-control --start vpxd

# Monitor startup:
tail -f /var/log/vmware/vpxd/vpxd.log
# Wait for: "Server is RUNNING"
3

Renew expired certificates (if STS cert expired)

# Check STS certificate expiration:
/usr/lib/vmware-vmafd/bin/dir-cli trustedcert list --login administrator@vsphere.local

# Use the VMware certificate fix script:
# Download and run fixsts.sh from VMware KB 79248
python /usr/lib/vmware-vmdir/share/config/ls_update_certs.py \
  --url https://vcenter.domain.com/lookupservice/sdk \
  --fingerprint <thumbprint> \
  --certfile /tmp/new-sts-cert.pem --admin administrator@vsphere.local
Take a VCSA snapshot before performing any certificate operations. Certificate renewal procedures can be complex and a rollback path is essential.
🛈 Best Practice: Configure VCSA log rotation to prevent /storage/log from filling. Set up monitoring for VCSA disk partitions (alert at 80%). Schedule certificate renewal 6 months before expiry. Take regular VCSA file-based backups. Use vCenter HA for production environments.
8
Snapshot Consolidation Failure
"Virtual machine disks consolidation is needed" — locked files, insufficient space, and CID mismatch
Impact: Snapshot delta disks grow continuously, consuming datastore space. Performance degrades as the snapshot chain lengthens. Risk of datastore full condition which can crash all VMs on that datastore. Backup solutions may fail.
Symptoms
  • vCenter warning: "Virtual machine disks consolidation is needed"
  • Snapshot manager shows "You are here" with no visible snapshots
  • Delta VMDK files (*-000001.vmdk) growing on datastore
  • Consolidation operation fails with "Unable to access file" or "File is locked"
  • VM performance degradation (high latency on writes)
Root Causes
  • Backup software failed mid-snapshot and left orphaned deltas
  • VMDK file locked by another host or process
  • CID (Content ID) mismatch in the snapshot chain
  • Insufficient free space on datastore to complete consolidation
  • VM has a running snapshot from a stale backup job
1

Identify orphaned snapshot files

# SSH to the ESXi host running the VM:
cd /vmfs/volumes/<datastore>/<vm-folder>/

# List all VMDK files and their sizes:
ls -lah *.vmdk
# Delta files: vmname-000001.vmdk, vmname-000002.vmdk, etc.
# These should not exist if snapshot manager shows no snapshots

# Check the snapshot descriptor:
cat vmname.vmsd
# If empty but delta files exist → orphaned snapshots
2

Check for locked files and release locks

# Find which host holds the lock:
vmkfstools -D /vmfs/volumes/<datastore>/<vm-folder>/vmname-000001-delta.vmdk
# Look for "owner" UUID — maps to an ESXi host

# If lock is held by a different host, check if a backup process is running
# on that host. Kill the stale backup process first.

# Find lock owners across all hosts:
# grep the MAC address from the lock owner in:
esxcfg-info | grep -i "mac address"
3

Consolidate disks

# Try consolidation from vCenter first:
# Right-click VM → Snapshots → Consolidate

# CLI alternative:
vim-cmd vmsvc/snapshot.removeall <vmid>

# If consolidation fails due to CID mismatch:
# 1. Check CID chain:
grep -i "CID\|parentCID" /vmfs/volumes/<datastore>/<vm-folder>/*.vmdk

# 2. Fix CID chain — ensure each delta's parentCID matches parent's CID
# Edit the .vmdk descriptor (NOT the -flat.vmdk data file)
Before manually editing VMDK descriptor files, take a backup of all .vmdk descriptor files. A wrong CID will make the entire disk chain unreadable.
🛈 Best Practice: Configure your backup solution to properly clean up snapshots after each job. Set up vCenter alarms for "VM disk consolidation needed". Limit snapshot age to 72 hours maximum. Never use snapshots as a long-term backup strategy — they degrade I/O performance and risk datastore exhaustion.
9
ESXi Host Stuck in Maintenance Mode
Host won't exit maintenance mode — powered-off VMs, HA reconfiguration, and DRS migration issues
Impact: Host capacity is unavailable to the cluster. HA failover capacity is reduced. If multiple hosts are stuck in maintenance mode, the cluster may not have enough resources to run all VMs. Patch/upgrade operations are stalled.
Symptoms
  • Host shows "Entering Maintenance Mode" indefinitely (progress stuck)
  • Host is in maintenance mode but "Exit Maintenance Mode" fails
  • DRS cannot evacuate all VMs (affinity rules, no capacity on other hosts)
  • VMs with local storage cannot be migrated
  • vCenter task shows "Reconfigure for HA" pending
Root Causes
  • Powered-off or suspended VMs registered on the host blocking entry
  • Anti-affinity rules preventing VM placement on other hosts
  • HA agent reconfiguration task stuck
  • USB/PCI passthrough devices preventing vMotion
  • vSAN data evacuation not completed (for vSAN hosts)
1

Identify what's blocking maintenance mode entry/exit

# Check for VMs still on the host:
esxcli vm process list
# All VMs must be migrated or powered off

# Check recent tasks in vCenter:
# Host → Monitor → Tasks & Events
# Look for stuck "Enter Maintenance Mode" or "Reconfigure for HA" tasks

# PowerCLI — Find VMs on this host:
Get-VMHost "esxi01" | Get-VM | Select Name, PowerState, VMHost
2

Exit maintenance mode via CLI

# SSH to the ESXi host:
esxcli system maintenanceMode set -e false

# Alternative:
vim-cmd hostsvc/maintenance_mode_exit

# If the above fails, try from PowerCLI:
Set-VMHost -VMHost "esxi01.domain.com" -State "Connected" -Confirm:$false

# Force exit (use with caution):
vim-cmd hostsvc/maintenance_mode_exit 0 1
# Second parameter 1 = force
3

Resolve stuck HA reconfiguration

# If HA reconfiguration is pending:
# 1. Disable HA on the cluster temporarily
# 2. Exit maintenance mode
# 3. Re-enable HA

# PowerCLI:
Set-Cluster "ClusterName" -HAEnabled:$false -Confirm:$false
Set-VMHost "esxi01" -State Connected -Confirm:$false
Set-Cluster "ClusterName" -HAEnabled:$true -Confirm:$false

# Or restart FDM on the host:
/etc/init.d/fdm restart
Temporarily disabling HA removes failover protection for the entire cluster. Perform this during a maintenance window and re-enable HA immediately after.
🛈 Best Practice: Before entering maintenance mode, verify DRS can place all VMs on other hosts. Power off or unregister VMs with local storage or passthrough devices first. Check for anti-affinity rules that might prevent VM placement. Use "Move to another host" for VMs that DRS can't migrate automatically.
10
vCenter Alarm Storm — False Positive Triage
Hundreds of alarms flooding vCenter — reset triggered alarms, disable non-critical alarms, and triage procedure
🛈 Impact: Alarm fatigue causes real issues to be missed. Email notification floods overwhelm operations teams. vCenter UI becomes slow due to excessive alarm processing. SNMP trap receivers may be overwhelmed.
Symptoms
  • Hundreds of yellow/red alarms in the vCenter Alarms panel
  • Email inbox flooded with alarm notification emails
  • Same alarm triggers and resets repeatedly (flapping)
  • vCenter UI sluggish due to alarm processing overhead
  • Operations team ignoring alerts due to alarm fatigue
Root Causes
  • Default alarm thresholds too aggressive for the environment
  • Network monitoring alarms trigger during planned maintenance
  • Storage latency alarms set at unrealistic thresholds
  • Alarm actions (email, SNMP) not filtered or rate-limited
  • Custom alarms duplicating built-in alarm functionality
1

Reset all triggered alarms in bulk

# PowerCLI — Reset all triggered alarms to green:
$alarmMgr = Get-View AlarmManager
$rootFolder = Get-View (Get-View ServiceInstance).Content.RootFolder

# Get all triggered alarms:
$triggeredAlarms = $rootFolder.TriggeredAlarmState
Write-Host "Found $($triggeredAlarms.Count) triggered alarms"

# Reset each alarm:
foreach ($alarm in $triggeredAlarms) {
    $alarmMgr.AcknowledgeAlarm($alarm.Alarm, $alarm.Entity)
}
Write-Host "All alarms acknowledged"
2

Disable non-critical and noisy alarms

# PowerCLI — List all alarm definitions with their enabled state:
Get-AlarmDefinition | Select Name, Enabled, Description |
  Sort-Object Name | Format-Table -Wrap

# Disable specific noisy alarms:
Get-AlarmDefinition -Name "Virtual machine CPU usage" |
  Set-AlarmDefinition -Enabled $false

# Disable alarm actions (email/SNMP) without disabling the alarm:
Get-AlarmDefinition -Name "Host memory usage" | Get-AlarmAction | Remove-AlarmAction -Confirm:$false

# Batch disable all alarm actions during maintenance:
Get-AlarmDefinition | Where { $_.Enabled } |
  ForEach { Get-AlarmAction -AlarmDefinition $_ | Remove-AlarmAction -Confirm:$false }
Don't disable all alarms permanently. Instead, tune thresholds and disable only truly non-critical alarms. Re-enable alarm actions after maintenance windows.
3

Tune alarm thresholds for your environment

# PowerCLI — Adjust alarm threshold example:
# Change "Datastore usage on disk" alarm from 75%/85% to 85%/95%:
$alarm = Get-AlarmDefinition -Name "Datastore usage on disk"
# Edit via vCenter UI: Alarm → Edit → Conditions
# Set Warning threshold: 85%
# Set Critical threshold: 95%

# Review alarm action configuration:
Get-AlarmDefinition | Where { $_.Enabled } |
  ForEach {
    $actions = Get-AlarmAction -AlarmDefinition $_
    if ($actions) {
      [PSCustomObject]@{
        Alarm = $_.Name
        ActionCount = $actions.Count
        ActionTypes = ($actions | Select -Expand ActionType) -join ", "
      }
    }
  } | Format-Table -AutoSize
🛈 Best Practice: Customize default alarm thresholds to match your environment's baseline. Use alarm action repeat intervals (e.g., notify once per hour, not every 5 minutes). Create a "Maintenance Mode" alarm action profile that suppresses notifications during planned work. Integrate vCenter alarms with your ITSM tool for proper incident routing rather than relying on email floods.