lighthouse/beacon_node
Jimmy Chen 2de3451011 Rate limiting backfill sync (#3936)
## Issue Addressed

#3212 

## Proposed Changes

- Introduce a new `rate_limiting_backfill_queue` - any new inbound backfill work events gets immediately sent to this FIFO queue **without any processing**
- Spawn a `backfill_scheduler` routine that pops a backfill event from the FIFO queue at specified intervals (currently halfway through a slot, or at 6s after slot start for 12s slots) and sends the event to `BeaconProcessor` via a `scheduled_backfill_work_tx` channel
- This channel gets polled last in the `InboundEvents`, and work event received is  wrapped in a `InboundEvent::ScheduledBackfillWork` enum variant, which gets processed immediately or queued by the `BeaconProcessor` (existing logic applies from here)

Diagram comparing backfill processing with / without rate-limiting: 
https://github.com/sigp/lighthouse/issues/3212#issuecomment-1386249922

See this comment for @paulhauner's  explanation and solution: https://github.com/sigp/lighthouse/issues/3212#issuecomment-1384674956

## Additional Info

I've compared this branch (with backfill processing rate limited to to 1 and 3 batches per slot) against the latest stable version. The CPU usage during backfill sync is reduced by ~5% - 20%, more details on this page:

https://hackmd.io/@jimmygchen/SJuVpJL3j

The above testing is done on Goerli (as I don't currently have hardware for Mainnet), I'm guessing the differences are likely to be bigger on mainnet due to block size.

### TODOs

- [x] Experiment with processing multiple batches per slot. (need to think about how to do this for different slot durations)
- [x] Add option to disable rate-limiting, enabed by default.
- [x] (No longer required now we're reusing the reprocessing queue) Complete the `backfill_scheduler` task when backfill sync is completed or not required
2023-04-03 03:02:55 +00:00
..
beacon_chain Rate limiting backfill sync (#3936) 2023-04-03 03:02:55 +00:00
builder_client Merge remote-tracking branch 'origin/unstable' into capella 2023-01-12 16:22:00 +11:00
client Clarify "Ready for Capella" (#4095) 2023-03-17 00:44:04 +00:00
eth1 exchangeCapabilities & Capella Readiness Logging (#3918) 2023-01-31 18:26:23 +01:00
execution_layer Reconstruct Payloads using Payload Bodies Methods (#4028) 2023-03-19 23:15:59 +00:00
genesis Fix the new BLS to execution change test 2023-01-25 15:47:07 +11:00
http_api Add finalized to HTTP API responses (#3753) 2023-03-30 06:08:37 +00:00
http_metrics Add content-type header to metrics server response (#3970) 2023-02-28 02:20:50 +00:00
lighthouse_network Correct log for ENR (#4133) 2023-03-29 23:55:55 +00:00
network Rate limiting backfill sync (#3936) 2023-04-03 03:02:55 +00:00
operation_pool Fix Capella schema downgrades (#4004) 2023-02-20 17:50:42 +11:00
src Rate limiting backfill sync (#3936) 2023-04-03 03:02:55 +00:00
store Add finalized to HTTP API responses (#3753) 2023-03-30 06:08:37 +00:00
tests Appease Clippy 1.68 and refactor http_api (#4068) 2023-03-13 01:40:03 +00:00
timer Use async code when interacting with EL (#3244) 2022-07-03 05:36:50 +00:00
Cargo.toml Release v4.0.1 (#4125) 2023-03-26 22:39:28 +00:00