Why not return the processor to the speed it was before it started waiting for io? Shouldn't that fix this problem without any downsides? Basically ignore iowait for idle calculation, instead of counting it at all, that seems the most sensible solution. That solves both the spiky CPU load and low CPU load, but high iowait load.