I next applied a bunch of recommendations in one hit because I'm impatient. I set `vm.dirty_ratio` and `vm.dirty_background_ratio` to 20% and 5%, to limit how much unwritten data can sit around waiting in memory, set zram swap to 16Gb, set the zfs_arc_cache_max to 25Gb, and zfs_arc_shrink_shift to 1, to more aggressively shrink the cache when memory is tight.
So far, it fared well with a single large copy. We'll see what happens when a whole sequence of them occur in a couple of hours time...