A 1.7 GB MariaDB process looked like the obvious culprit. The real problem was a PHP script with no memory limit and a server with no swap.
A worker measured 30 MB when fresh and 97 MB forty hours later, on an idle server. Nothing was leaking — that is simply how PHP returns memory.
Without swap, the first allocation that cannot be satisfied is immediately fatal to something — and the kernel picks its victim by size, not by blame.
No roundups, no “5 tools you must try.” Just the posts, when there is something worth sending.