How to Fix Ceph HEALTH_WARN and HEALTH_ERR on Proxmox VE

Updated on Oct 22, 2026
Mila H
18 MINS READ
Table of Contents
Proxmox Ceph troubleshooting

Proxmox Ceph problems usually come from capacity, disk, network, or placement group (PG) state. If you know which one you have, you can pick a safe fix and avoid the commands that destroy data. This guide is a runbook. You can start with a few read-only checks, find the cause, and then apply the fix in a safe order. 

Safety Rules Before You Fix Proxmox Ceph Problems

These rules keep Proxmox Ceph troubleshooting safe during every incident:

  1. Look first, change later. Run read-only commands before you fix anything.
  2. Change one thing at once. Then, check ceph -s again.
  3. Do not remove disks or nodes while PGs are degraded. Fewer copies means less safety.
  4. Never set min_size to 1 to make a pool work again. It risks data loss.
  5. Avoid these commands unless support tells you to use them: ceph osd purge, ceph osd lost, ceph pg force-create-pg, ceph-objectstore-tool, and pool delete.
  6. Wait until Ceph is already recovering. Many warnings go away on their own when recovery ends.

Before you start, make sure your cluster is built correctly. If you are setting up a new one, follow our guide to build a Ceph Tentacle cluster on Proxmox with NVMe.

Check the Cluster State

Before you fix anything, you need to know what is wrong. Start with these commands:

Bash
ceph -sceph health detailpveceph status
  • ceph -s shows the overall health, the monitors, the OSD count, the PG states, and the client I/O.
  •  ceph health detail explains each warning and names the OSDs, PGs, or monitors involved.

Also, you can open the Proxmox web interface and go to Node > Ceph. The health levels mean:

Status Meaning What to do
HEALTH_OK No problems found Nothing
HEALTH_WARN Something needs attention, but data is still served Find the cause in ceph health detail
HEALTH_ERR Serious problem, such as full OSDs or unavailable PGs Act now, but follow the safe order

Next, you can check more details with the following commands:

Bash
ceph osd tree            #shows which OSDs are up or down, and on which host.ceph osd df tree         #shows how full each OSD is.ceph df                  #shows the use per pool.ceph pg stat             #shows a short summary of all PGs.ceph mon stat            #shows the monitors.ceph crash ls            #shows recent daemon crashes.

Find the Cause of the Ceph Problem

As we said, most Ceph warnings come from capacity, disk, network, time, or PG state. You can use the following table to match your warning to its cause. This helps you pick the right fix and avoid commands that can harm your data.

Group Typical warnings First check Safe first action
Capacity OSD_NEARFULL, OSD_BACKFILLFULL, OSD_FULL, backfill_toofull ceph osd df tree Free space or add OSDs
Disk OSD down, slow ops on one OSD, crashes smartctl, journalctl Check the disk, then replace if bad
Network OSD flapping, slow ops on many OSDs, heartbeat errors ping, iperf3, ip -s link Fix the link, MTU, or switch port
Time or quorum Clock skew, MON down, quorum lost chronyc tracking, ceph quorum_status Fix time sync, restart the MON
PG state Degraded, undersized, inactive, peering, stale ceph pg dump_stuck Find the root cause first

1. Fix Capacity Problems

Ceph has three fill limits. Each one is a percentage of how full an OSD is, and each one triggers a different action. These are the defaults:

Limit Default What happens
nearfull 85% Warning only
backfillfull 90% Data cannot move to this OSD, so recovery can stall
full 95% Client writes stop

You can check the current values and the OSD usage with the commands below:

Bash
ceph osd dump | grep ratioceph osd df treeceph df

Look at the %USE and VAR columns. If one OSD is far above the others, the data is not balanced. If all OSDs are high, the cluster is simply running out of space.

Case A: One or few OSDs are fuller than the rest

Sometimes the cluster has enough free space, but a few OSDs hold more data than the others. This can trigger nearfull warnings on those OSDs. The fix is to move some data to the OSDs that have more free space. 

Turn on the balancer. It slowly moves PGs so all OSDs have a similar amount of data:

Bash
ceph balancer statusceph balancer mode upmapceph balancer on

The upmap mode needs all Ceph clients to be version Luminous or newer. Current Proxmox VE meets this. Also, you can lower the weight of the fullest OSDs, so they hold less data. Run a dry test:

Bash
ceph osd test-reweight-by-utilizationceph osd reweight-by-utilization

Also, check the PG count. If a pool has too few PGs, the data cannot spread well across OSDs:

Bash
ceph osd pool autoscale-status

Case B: The whole cluster is almost full

Sometimes all OSDs are close to full, not just a few. In this case, moving data will not help, because there is no free space left to use. You need to free space or add more storage.

  • Delete data you do not need, such as old VM disks, old backups, and old snapshots.
  • Add more OSDs or more nodes. This is the real fix.
  • Do not add a new OSD to a cluster that is already full and unstable. Stabilize it first.

Case C: Recovery is stuck because of backfillfull

If you see backfill_toofull in PG states, the target OSDs are too full. You can raise the backfillfull limit a little to let recovery finish:

Bash
ceph osd set-backfillfull-ratio 0.92

Do this only as a short fix, and set it back to the default after recovery ends:

Bash
ceph osd set-backfillfull-ratio 0.90

What to Do When OSDs Are Full (OSD_FULL)

When an OSD reaches the full limit, Ceph stops client writes to protect your data. VMs that use this storage can freeze or show I/O errors. This is an emergency, so you must free space. 

You can raise the full ratio by a very small amount, remove data, then set it back:

Bash
ceph osd set-full-ratio 0.96ceph osd set-full-ratio 0.95

Do not keep the higher value. Ceph needs free space to recover from failures.

2. Fix Slow Ops

A slow ops warning in Proxmox Ceph means some requests take too long. It looks like this:

Bash
HEALTH_WARN 12 slow ops, oldest one blocked for 64 sec, osd.7 has slow ops

The cause is usually a bad disk, a busy or broken network, or an OSD that is stuck.

Find Which OSDs Have Slow Ops

Before you fix slow ops, you need to know where they come from. To do this, run the commands below:

Bash
ceph health detailceph osd perf

One OSD with a much higher value than the others points to a disk problem. Many OSDs with high values on the same host or switch point to a network problem.

On the node that hosts the slow OSD, you must look at the requests:

Bash
ceph daemon osd.7 dump_ops_in_flightceph daemon osd.7 dump_historic_ops

These show what each request is waiting for. Waiting for a "sub op" or "replica" usually means another OSD or the network is slow.

Check If the Disk Is Failing

If one OSD is much slower than the others, its disk may be failing. Run the following commands on the node that hosts the slow OSD:

Bash
lsblksmartctl -a /dev/nvme0n1nvme smart-log /dev/nvme0n1journalctl -u ceph-osd@7 --since "1 hour ago"dmesg -T | grep -i -E "nvme|blk_update|I/O error"

Look for media errors, reallocated sectors, high temperature, or I/O errors. If the disk is failing, go to Step 4.

Check for Heavy Load on the Node

Sometimes the disk is fine, but the OSD is slow because the node is busy. Run the commands below to check for other load:

Bash
iostat -x 2 5top

Heavy recovery, a big backup job, or a deep scrub can slow client I/O. If recovery is the cause, you must give VMs a higher priority. On current Ceph releases, you can use the mClock profile:

Bash
ceph config set osd osd_mclock_profile high_client_ops

After the cluster is healthy, set it back with the command below:

Bash
ceph config rm osd osd_mclock_profile

Do Not Restart OSDs Without a Reason

Restarting an OSD can make things worse, because it starts peering again. Restart one OSD only when its logs show it is stuck, and only when the cluster has enough healthy copies:

Bash
ceph osd ok-to-stop 7systemctl restart ceph-osd@7

3. Fix Network Problems and Bottlenecks

Ceph needs a fast and stable network, so network checks are a key part of Proxmox Ceph troubleshooting. A bad network can cause slow ops, OSDs that keep going down and up, and slow recovery.

First, check the Ceph network settings in the config file:

Bash
grep -E "public_network|cluster_network" /etc/pve/ceph.conf
  • The public network is used by clients, monitors, and OSDs.
  • The cluster network is used by OSDs to copy data, recover data, and check on each other.

For best results, you can use a separate and fast storage network. If you run Ceph on rented hardware, dedicated servers with a private storage network keep Ceph traffic away from VM and internet traffic.

A slow or broken link between nodes can make Ceph slow. These tests show if the link has errors, runs at the right speed, and can carry enough traffic:

Bash
ip -s link showethtool eno1 | grep -E "Speed|Duplex|Link detected"ping -c 20 10.10.10.12

Replace eno1 and the IP with your storage interface and a peer node. Look for errors, drops, and wrong speed.

Then, test the speed between nodes with iperf3:

Bash
# On node 2iperf3 -s # On node 1iperf3 -c 10.10.10.12 -P 4 -t 30

A 10 Gbit link should give close to 9.4 Gbit/s. A much lower result means a bad cable, port, or switch setting.

Check MTU

A wrong MTU is a common hidden problem. If you use jumbo frames (MTU 9000), every node and every switch port must use it. Test it with:

Bash
ping -M do -s 8972 -c 5 10.10.10.12

If this fails but a normal ping works, the MTU does not match somewhere. Fix the MTU on all nodes and switch ports, or go back to 1500 everywhere.

Check the Ports

Ceph services talk to each other on set network ports. If a firewall blocks them, nodes cannot connect, and you may see slow ops, OSDs going down, or monitor problems. 

Ceph monitors use ports 3300 and 6789. OSDs and MGRs use the range 6800 to 7568. Make sure your firewall allows them between all Ceph nodes.

Why Ceph Needs Its Own Network

If VM traffic, backups, and Ceph recovery share one link, a large backup can cause Ceph slow ops. You must move Ceph to its own network, or at least to its own VLAN with enough speed. NVMe disks need 25 Gbit/s or more to use their speed in many setups.

4. Fix Failed or Flapping OSDs

An OSD can fail because of a bad disk, a crashed service, or a network problem. Also, it can keep going down and up again. Both cases can lead to degraded PGs and slow ops.

In this step, you check the OSD, try to bring it back, and replace the disk only if it is really bad. First, you must look at the status:

Bash
ceph osd treeceph osd statsystemctl status ceph-osd@7journalctl -u ceph-osd@7 -n 100 --no-pagertail -n 100 /var/log/ceph/ceph-osd.7.log

If the OSD Is Down but the Disk Is Healthy

Sometimes an OSD is down, but the disk has no errors. The service may have stopped or crashed. In this case, you can try to start it again:

Bash
systemctl start ceph-osd@7

If the service fails, read the log for the reason. Common reasons are a missing disk, a full root disk, or a LVM problem. Check with:

Bash
df -hceph-volume lvm listlvs

If the OSD Keeps Going Down and Up

Sometimes an OSD goes down, comes back, and then goes down again. This is usually caused by a network problem or a slow disk. To stop data from moving while you work, you can set these flags for a short time:

Bash
ceph osd set nooutceph osd set nodown

noout stops Ceph from marking down OSDs as out, so it does not start rebalancing. nodown stops monitors from marking OSDs down. Use nodown only for a short test, because it hides real failures.

Always remove the flags once you are finished:

Bash
ceph osd unset nodownceph osd unset noout

By default, Ceph marks a down OSD as out after 10 minutes (600 seconds), and then it starts to rebuild the data on other OSDs.

If the Disk Is Failing: Replace the OSD

If the disk has errors or has failed, the OSD must be replaced. Do this slowly and in the right order, so you do not lose data.

First, make sure the rest of the cluster is healthy enough. Other PGs should be active.

Then, mark the OSD out so data moves away from it; if it is still readable, this is the safest way:

Bash
ceph osd out 7

Wait until all PGs are active+clean. Watch with ceph -s. Next, check that it is safe to remove it:

Bash
ceph osd safe-to-destroy osd.7

Now you can stop and destroy the OSD with Proxmox tools:

Bash
systemctl stop ceph-osd@7pveceph osd destroy 7 --cleanup

Finally, you can replace the disk and create a new OSD:

Bash
pveceph osd create /dev/nvme1n1

If the disk has already failed and cannot be read, Ceph rebuilds the data from the other copies. Do not wait for active+clean in that case, but make sure you still have enough copies before you remove anything.

Only do one disk at once. Do not replace a second disk until the cluster is active+clean again.

After a crash, you can check what happened and clear the warning with:

Bash
ceph crash lsceph crash info <crash-id>ceph crash archive-all

Use archive-all only after you read the crash reports.

5. Fix Monitor Quorum and Time Sync

Ceph monitors must agree with each other, and their clocks must be the same. If a monitor goes offline or the time is off, Ceph can show warnings or stop working. More than half of the monitors must be online. If you have 3 monitors, at least 2 must work.

Bash
ceph mon statceph quorum_status --format json-prettysystemctl status ceph-mon@$(hostname)

If the ceph commands hang, quorum may be lost. You can add a timeout to see the error:

Bash
ceph -s --connect-timeout 10

You can ask one monitor about its own state, even if there is no quorum. Run this on the monitor node:

Bash
ceph daemon mon.$(hostname) mon_status

If the state is probing, electing, or synchronizing, the monitor is out of quorum. A monitor stays in probing until it finds enough other monitors.

Fix Time Sync on Ceph Nodes

Ceph monitors need clocks that are the same. If the time differs by more than 0.05 seconds, Ceph shows a clock skew warning. The fix is to make all nodes use the same time source. Check the time on every node:

Bash
timedatectlchronyc trackingchronyc sources -v

Proxmox VE uses chrony by default. You must make sure the service runs and the nodes can reach their time servers:

Bash
systemctl status chronysystemctl restart chronychronyc makestep

chronyc makestep forces a fast time correction. Use the same time servers on all nodes. You can set them in /etc/chrony/chrony.conf or in a file in /etc/chrony/sources.d/. If your nodes are virtual machines, their time can go wrong more easily, so check the time on the host too.

The warning may take a few minutes to go away after the time is fixed. Do not raise mon_clock_drift_allowed to hide it. Fix the time instead.

Fix a Monitor That Is Down

If a monitor is down, the cluster can still work as long as most monitors are online. But you should fix it fast, because losing one more monitor can stop the cluster. First, check the reason with:

Bash
journalctl -u ceph-mon@$(hostname) -n 100 --no-pagerdf -h /var/lib/ceph/mon

A full disk is a common reason. Ceph warns with MON_DISK_LOW when free space on the monitor disk is below 30%. You can free some space, then start the service:

Bash
systemctl restart ceph-mon@$(hostname)

If the monitor data is broken and the other monitors still have quorum, you can remove and create it again with Proxmox tools:

Bash
pveceph mon destroy <monid>pveceph mon create

Do this only when the other monitors are working and have quorum. Never remove a monitor if it would leave less than half of the monitors online.

6. Understand and Fix PG States

PGs are groups of objects that Ceph places on OSDs. A healthy PG is active+clean. You can list problem PGs with:

Bash
ceph pg statceph pg dump_stuck inactiveceph pg dump_stuck uncleanceph pg dump_stuck staleceph health detail

What Each PG State Means

Every PG has a state that tells you if your data is safe and available. The state is shown in ceph -s and ceph pg stat. Use the table below to see what each state means, if your data is at risk, and what to do.

State Meaning Data at risk? Usual cause Safe action
active+clean All good No None None
degraded Some copies are missing Less safety OSD down Bring the OSD back, or wait for recovery
undersized Fewer copies than the pool size Less safety OSD down or not enough hosts Fix the OSD or the CRUSH rule
remapped PG is moving to other OSDs No Rebalance Wait
backfilling Data is being copied to a new OSD No Recovery Wait
backfill_toofull Target OSD is too full Yes, if more fails Capacity See Step 3
peering OSDs are agreeing on the PG state Brief I/O pause Restart or flap Wait, check the network
inactive PG cannot serve I/O I/O blocked Not enough OSDs up Bring OSDs back
stale No report from the PG's OSDs I/O blocked All OSDs for it are down Find and start those OSDs
down A needed copy is offline I/O blocked Failed OSDs Bring back the OSD; do not mark it lost
incomplete Not enough info to recover Possible data loss Many failures Stop and get expert help

Degraded and misplaced are different. Degraded means fewer copies than wanted. Misplaced means the data is safe but not yet in its final place.

Degraded or Undersized PGs

Degraded and undersized PGs mean Ceph has fewer copies of your data than the pool needs. Your data is still there, but you have less safety. This usually happens when an OSD is down, or the cluster does not have enough hosts for the pool. The steps below show how to find the cause and fix it.

  1. Find which OSDs are down with ceph osd tree.
  2. Bring them back (Step 4).
  3. Watch recovery with ceph -s.

If PGs stay undersized with all OSDs up, check the pool and CRUSH rule:

Bash
ceph osd pool ls detailceph osd crush rule dump

For example, a size 3 pool with a rule that spreads copies over hosts needs at least 3 hosts. With only 2 hosts, PGs stay undersized.

Fix Inactive and Down PGs

Inactive and down PGs are more serious, because they can block reads and writes. VMs that use these PGs may freeze. Usually the cause is that the OSDs for these PGs are offline or cannot be reached. Query one PG to see why it is stuck:

Bash
ceph pg 2.1a query

Look at recovery_state. It tells you which OSDs it is waiting for blocked_by, down_osds_we_would_probe. In most cases, the fix is to start those OSDs or to fix the network between them.

For a pool at min_size 2 with size 3, a PG stops I/O when only one copy is online. This protects your data. Do not lower min_size to force it online.

Slow or Paused Recovery

If recovery is slow, you must check the network and the disks first. You can control recovery speed with the mClock profile:

Bash
ceph config set osd osd_mclock_profile high_recovery_ops

Use this only when your VMs can run with slower disk speed. When recovery is done, go back to balanced or high_client_ops.

For planned work, such as a node reboot, you can stop Ceph from rebalancing:

Bash
ceph osd set noout# do the maintenanceceph osd unset noout

Also, you can pause data movement for a short time:

Bash
ceph osd set norebalanceceph osd set nobackfillceph osd set norecover

Remove them with ceph osd unset <flag>. If you forget them, the cluster will stay unhealthy. Check ceph osd dump | grep flags to see the active flags.

Check That Everything Is Fixed

After you fix the problem, check that the cluster is really healthy. Run the commands below to confirm that all OSDs, monitors, and PGs are fine, and that no old flags are left.

Bash
ceph -sceph health detailceph osd dump | grep flagsceph osd df treeceph pg statceph crash ls

If a warning is harmless and you need to hide it for a while, you can mute it for a set time instead of ignoring it:

Bash
ceph health mute OSD_NEARFULL 1d

Conclusion

Most Ceph warnings have a simple cause. Look before you act, avoid risky commands, and give the cluster time to recover. Follow this runbook, and Proxmox Ceph troubleshooting becomes much easier.

We hope you enjoy this guide. For more information, you can check the official Ceph docs.