2de3451011
## 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 |
||
---|---|---|
.. | ||
attestation_verification | ||
schema_change | ||
attestation_rewards.rs | ||
attestation_verification.rs | ||
attester_cache.rs | ||
beacon_block_reward.rs | ||
beacon_block_streamer.rs | ||
beacon_chain.rs | ||
beacon_fork_choice_store.rs | ||
beacon_proposer_cache.rs | ||
beacon_snapshot.rs | ||
block_reward.rs | ||
block_times_cache.rs | ||
block_verification.rs | ||
builder.rs | ||
canonical_head.rs | ||
capella_readiness.rs | ||
chain_config.rs | ||
early_attester_cache.rs | ||
errors.rs | ||
eth1_chain.rs | ||
eth1_finalization_cache.rs | ||
events.rs | ||
execution_payload.rs | ||
fork_choice_signal.rs | ||
fork_revert.rs | ||
head_tracker.rs | ||
historical_blocks.rs | ||
lib.rs | ||
light_client_finality_update_verification.rs | ||
light_client_optimistic_update_verification.rs | ||
merge_readiness.rs | ||
metrics.rs | ||
migrate.rs | ||
naive_aggregation_pool.rs | ||
observed_aggregates.rs | ||
observed_attesters.rs | ||
observed_block_producers.rs | ||
observed_operations.rs | ||
otb_verification_service.rs | ||
persisted_beacon_chain.rs | ||
persisted_fork_choice.rs | ||
pre_finalization_cache.rs | ||
proposer_prep_service.rs | ||
schema_change.rs | ||
shuffling_cache.rs | ||
snapshot_cache.rs | ||
state_advance_timer.rs | ||
sync_committee_rewards.rs | ||
sync_committee_verification.rs | ||
test_utils.rs | ||
timeout_rw_lock.rs | ||
validator_monitor.rs | ||
validator_pubkey_cache.rs |