The purge ran one DELETE over the whole retention cutoff in a single transaction, spiking undo/binlog and holding row locks on a table the fetch cron writes to. Now it loops in batches of 5000 rows with a short pause between batches, keeping each commit small.