The "-r" option to pg_basebackup is supposed to throttle the rate of the backup. But it only works properly if the server is mostly idle.
Every non-trivial call to XLogFlush or XLogBackgroundFlush will wake up the wal sender (the one which is not really sending wal, but base files), and the throttling routine doesn't go back to sleep after being awoke early. Rather, it releases another 32kb of data.
Should the basebackup.c throttle sleep in a loop until its time has expired?
Or should walsender.c WalSndWakeup not wake a wal sender whose status is WALSNDSTATE_BACKUP?
Or both?
I'm attaching a patch for each option. Each one independently solves the problem. But I think we should do both. There is no point in issuing unnecessary kill system calls, and there may also be more spurious wake-ups than just these ones.