Identifying saturated disks on CentOS 8
The culprit was sda, the magnetic CentOS disk. Most of the evidence pointed there. As someone commented (and seems to have deleted), the wait times on sda, dm-0, and dm-1 look suspicious. Sure enough, dm-0 (root) and dm-1 (swap) are also on sda. Watching iotop run, the bottleneck seemed to be triggered by a quick flash of Gnome activity followed by kswapd (swap) clogging the works. Closing Gnome with an "init 3" made a definite improvement, but there's no way a machine this powerful should be crippled by an idle login screen. SMART also reports 8000+ bad sectors on sda. My guess is many of these are in the swap space, causing swaps to cripple the system.
One thought was to move the swap to another disk but replacing sda seemed more practical. I started a disk clone with CloneZilla but it was estimating 3 hours and a fresh install would be faster, so I went with that. Now the server's running great! Here's a screen shot showing 1300+ files streaming simultaneously over 8Gbps, nice and stable. Problem solved!