Can we see the colour code for the third graph (memory usage past hour)?
Do you have memory limits defined (either directly or via resource pools)?
It's probably worth a go. I wrote this a while back (here),
I was expecting RAM compression to help a bit, but was surprised by how much. RAM compression consistently reduced the swap rate by well over half with my ‘keen’ settings, but did seem to slow things down quite a bit too:
mem.MemZipAllocPct – 50
mem.MemZipLowMemMaxSwapOut – 50
mem.MemZipBalloonXferPct – 30
mem.MemZipMaxRejectionPct – 10
mem.MemSwapSkipPct – 75
Tweaking MemZipAllocPct and MemZipLowMemMaxSwapOut to 25% seems to provide a happy balance of swap and RAM compression throughputs.
On the other hand, since balloon only seems to be recovering 2GB out of 24GB in your host, perhaps it is possible to reduce the allocated RAM just a little on each VM and side-step the issue?