This was a tough one for me to debug, had to have help from claude.ai. Here is the issue as summarized by claude.
Summary
A dynamic (cloud) compute node can end up in state
IDLE+CLOUD+POWERED_DOWN+NOT_RESPONDING. Slurm excludes such a node from scheduling, so it
is never selected for a job and ResumeProgram is never invoked — no EC2 API call is ever
made for it. clustermgtd does not recognize this state as unhealthy, so nothing ever clears
it. The node is invisible to normal monitoring: sinfo -R reports nothing, there is no
reason string, and the base state reads IDLE.
The result is silent, permanent capacity loss. On our cluster 250 of ~1720 dynamic nodes were
in this state across 30 compute resources, with 11 compute resources having zero usable
nodes. Two production queues had been running at half capacity for at least nine days. Jobs
pended with Nodes required for job are DOWN, DRAINED or reserved for jobs in higher priority partitions, which points an operator at the wrong cause — nothing was DOWN or DRAINED.
Environment
- ParallelCluster 3.13.2 (
aws-parallelcluster-cookbook-3.13.2)
- Slurm 24.05.8
- Dynamic nodes only. Compute resources spanning on-demand and spot, many instance families.
The effect is deterministic and easy to demonstrate
sbatch --test-only shows the node is not merely busy, it is not a candidate at all. Three
compute resources, same cluster, same moment:
# all 10 nodes in the latched state
$ sbatch --test-only -p od-c7a-2xl -c 1 --mem=1G --wrap="true"
allocation failure: Requested node configuration is not available
# nodes 1-2 clean, nodes 3-10 latched -> only a clean node is ever offered
$ sbatch --test-only -p od-m7a-xl -c 1 --mem=1G --wrap="true"
sbatch: Job ... to start at ... on nodes od-m7a-xl-dy-od-16-gb-4-cores-1
# all nodes clean
$ sbatch --test-only -p od-r7a-2xl -c 1 --mem=1G --wrap="true"
sbatch: Job ... to start at ... on nodes od-r7a-2xl-dy-od-64-gb-8-cores-2
Meanwhile the affected nodes look healthy by every normal check:
$ sinfo -R
REASON USER TIMESTAMP NODELIST
# empty
$ scontrol show node od-r7i-12xl-dy-od-384-gb-24-cores-6
State=IDLE+CLOUD+POWERED_DOWN+NOT_RESPONDING
Reason= # none
BootTime=None SlurmdStartTime=None
Why nothing recovers it
Two independent gaps that compose:
-
Slurm cannot clear the flag. NOT_RESPONDING is cleared when a node answers a ping,
and powered-down cloud nodes are deliberately never pinged — correctly, there is no
instance to ping. For a powered-down node the flag is therefore cleared by an event that
can never occur. Arguably the flag is also semantically meaningless for a node Slurm
itself powered off.
-
clustermgtd does not consider it unhealthy. Its health checks key on base state and on
EC2 reality. This node reads base state IDLE with no backing instance, which is exactly
what a correctly powered-down dynamic node looks like. It is in none of the remediation
sets. clustermgtd ran continuously for two months on our cluster, looping every 60
seconds, and never flagged any of the 250 nodes.
Compounding this, ParallelCluster sets idle_on_node_suspend itself:
/opt/slurm/etc/slurm.conf:39
SlurmctldParameters=idle_on_node_suspend,power_save_min_interval=30,node_reg_mem_percent=75
That converts the base state from DOWN to IDLE on suspend. A node left at
DOWN+...+NOT_RESPONDING would have appeared in sinfo -R and in clustermgtd's unhealthy
list. Flipping it to IDLE removes the only signal an operator would have had, which is why
this is silent rather than merely annoying.
The state also survives a slurmctld restart, since it is restored from StateSaveLoc:
[2026-08-20T11:32:21.535] Recovered state of 1936 nodes
[2026-08-20T11:32:21.535] Down nodes: sp-r7i-l-dy-sp-16-gb-1-cores-2
1936 nodes recovered, one reported down, 250 silently unschedulable.
What I could not determine
I cannot tell you what creates the state, and I want to be upfront that on 3.13.2 every
path I traced self-heals correctly:
- Spot reclamation. Traced seven nodes end to end. clustermgtd logged
no corresponding instance in EC2 / EC2 instance availability for node ... has timed out / Setting unhealthy dynamic nodes to down and power_down, and all seven landed at clean
IDLE+CLOUD+POWERED_DOWN. No latch.
- Resume capacity failure. Produces
update_node: node ... reason set to: (Code:UnfulfillableCapacity)Failure when resuming nodes then state set to DOWN — visible
in sinfo -R, and reset by the insufficient-capacity timeout. Working as intended.
- slurmctld restart. See above, does not create it.
The affected nodes had zero events in six-plus weeks of retained logs (clustermgtd back
to Jul 8, slurm_suspend.log back to Jul 25, slurm_resume.log, slurmctld.log). So these
were most likely created by an older version or a one-off control-plane interruption and then
never swept up. My origin logs have long since rotated.
Why this is still actionable
Because the absence of a repro does not reduce the impact. Even if the bug that creates this
state is already fixed, there is no remediation for nodes already in it. It survives
cluster updates and daemon restarts, and it is invisible. A cluster affected before an upgrade
stays permanently degraded afterwards with no signal at all. Ours lost half of two queues for
at least nine days; one user's job waited 39.9 hours and then failed with ReqNodeNotAvail.
Requests
- Remediate it. Have clustermgtd clear a stray
NOT_RESPONDING flag on a powered-down
dynamic node that has no backing instance. This is unambiguously safe: there is no
instance, nothing is running, and the flag conveys no information about a machine that
does not exist.
- Failing that, surface it. A node that Slurm will not schedule should be visible
somewhere — a reason string, a clustermgtd warning, anything. Silence is the expensive part.
- Consider whether
idle_on_node_suspend should apply to a node carrying
NOT_RESPONDING, given it is what suppresses the DOWN state that would otherwise have
made this observable.
Related in class, though a different trigger and a much louder symptom: #7470, where
clustermgtd likewise does not recognize a node state it did not create
(DOWN+CLOUD+MAINTENANCE+RESERVED+NOT_RESPONDING).
Workaround, for anyone who finds this
Detect:
scontrol show nodes --oneliner \
| awk '{for(i=1;i<=NF;i++){if($i ~ /^NodeName=/)n=substr($i,10); if($i ~ /^State=/)s=substr($i,7)}
if(s=="IDLE+CLOUD+POWERED_DOWN+NOT_RESPONDING") print n}'
Fix:
scontrol update nodename=<hostlist> state=power_down_force
The nodes cycle POWER_DOWN -> POWERING_DOWN -> clean IDLE+CLOUD+POWERED_DOWN within a
couple of clustermgtd passes, and pending jobs start once they land. On our cluster five jobs
that had been pending 11.5 hours started within a few minutes of the reset.
Note for anyone scripting this: match the state by whole +-delimited token, not substring —
POWERED_DOWN contains DOWN. And never reset a node in POWERING_UP, where
NOT_RESPONDING is legitimate and transient while the instance boots.
This was a tough one for me to debug, had to have help from claude.ai. Here is the issue as summarized by claude.
Summary
A dynamic (cloud) compute node can end up in state
IDLE+CLOUD+POWERED_DOWN+NOT_RESPONDING. Slurm excludes such a node from scheduling, so itis never selected for a job and
ResumeProgramis never invoked — no EC2 API call is evermade for it. clustermgtd does not recognize this state as unhealthy, so nothing ever clears
it. The node is invisible to normal monitoring:
sinfo -Rreports nothing, there is noreason string, and the base state reads
IDLE.The result is silent, permanent capacity loss. On our cluster 250 of ~1720 dynamic nodes were
in this state across 30 compute resources, with 11 compute resources having zero usable
nodes. Two production queues had been running at half capacity for at least nine days. Jobs
pended with
Nodes required for job are DOWN, DRAINED or reserved for jobs in higher priority partitions, which points an operator at the wrong cause — nothing was DOWN or DRAINED.Environment
aws-parallelcluster-cookbook-3.13.2)The effect is deterministic and easy to demonstrate
sbatch --test-onlyshows the node is not merely busy, it is not a candidate at all. Threecompute resources, same cluster, same moment:
Meanwhile the affected nodes look healthy by every normal check:
Why nothing recovers it
Two independent gaps that compose:
Slurm cannot clear the flag.
NOT_RESPONDINGis cleared when a node answers a ping,and powered-down cloud nodes are deliberately never pinged — correctly, there is no
instance to ping. For a powered-down node the flag is therefore cleared by an event that
can never occur. Arguably the flag is also semantically meaningless for a node Slurm
itself powered off.
clustermgtd does not consider it unhealthy. Its health checks key on base state and on
EC2 reality. This node reads base state
IDLEwith no backing instance, which is exactlywhat a correctly powered-down dynamic node looks like. It is in none of the remediation
sets. clustermgtd ran continuously for two months on our cluster, looping every 60
seconds, and never flagged any of the 250 nodes.
Compounding this, ParallelCluster sets
idle_on_node_suspenditself:That converts the base state from
DOWNtoIDLEon suspend. A node left atDOWN+...+NOT_RESPONDINGwould have appeared insinfo -Rand in clustermgtd's unhealthylist. Flipping it to
IDLEremoves the only signal an operator would have had, which is whythis is silent rather than merely annoying.
The state also survives a slurmctld restart, since it is restored from
StateSaveLoc:1936 nodes recovered, one reported down, 250 silently unschedulable.
What I could not determine
I cannot tell you what creates the state, and I want to be upfront that on 3.13.2 every
path I traced self-heals correctly:
no corresponding instance in EC2/EC2 instance availability for node ... has timed out/Setting unhealthy dynamic nodes to down and power_down, and all seven landed at cleanIDLE+CLOUD+POWERED_DOWN. No latch.update_node: node ... reason set to: (Code:UnfulfillableCapacity)Failure when resuming nodesthenstate set to DOWN— visiblein
sinfo -R, and reset by the insufficient-capacity timeout. Working as intended.The affected nodes had zero events in six-plus weeks of retained logs (
clustermgtdbackto Jul 8,
slurm_suspend.logback to Jul 25,slurm_resume.log,slurmctld.log). So thesewere most likely created by an older version or a one-off control-plane interruption and then
never swept up. My origin logs have long since rotated.
Why this is still actionable
Because the absence of a repro does not reduce the impact. Even if the bug that creates this
state is already fixed, there is no remediation for nodes already in it. It survives
cluster updates and daemon restarts, and it is invisible. A cluster affected before an upgrade
stays permanently degraded afterwards with no signal at all. Ours lost half of two queues for
at least nine days; one user's job waited 39.9 hours and then failed with
ReqNodeNotAvail.Requests
NOT_RESPONDINGflag on a powered-downdynamic node that has no backing instance. This is unambiguously safe: there is no
instance, nothing is running, and the flag conveys no information about a machine that
does not exist.
somewhere — a reason string, a clustermgtd warning, anything. Silence is the expensive part.
idle_on_node_suspendshould apply to a node carryingNOT_RESPONDING, given it is what suppresses theDOWNstate that would otherwise havemade this observable.
Related in class, though a different trigger and a much louder symptom: #7470, where
clustermgtd likewise does not recognize a node state it did not create
(
DOWN+CLOUD+MAINTENANCE+RESERVED+NOT_RESPONDING).Workaround, for anyone who finds this
Detect:
Fix:
The nodes cycle
POWER_DOWN->POWERING_DOWN-> cleanIDLE+CLOUD+POWERED_DOWNwithin acouple of clustermgtd passes, and pending jobs start once they land. On our cluster five jobs
that had been pending 11.5 hours started within a few minutes of the reset.
Note for anyone scripting this: match the state by whole
+-delimited token, not substring —POWERED_DOWNcontainsDOWN. And never reset a node inPOWERING_UP, whereNOT_RESPONDINGis legitimate and transient while the instance boots.