Add metrics for logging time taken in replaystage steps (#9933)
automerge
This commit is contained in:
		@@ -103,6 +103,42 @@ pub struct ReplayStageConfig {
 | 
				
			|||||||
    pub rewards_recorder_sender: Option<RewardsRecorderSender>,
 | 
					    pub rewards_recorder_sender: Option<RewardsRecorderSender>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Default)]
 | 
				
			||||||
 | 
					pub struct ReplayTiming {
 | 
				
			||||||
 | 
					    num_iterations: u64,
 | 
				
			||||||
 | 
					    compute_bank_stats_elapsed: u64,
 | 
				
			||||||
 | 
					    select_vote_and_reset_forks_elapsed: u64,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					impl ReplayTiming {
 | 
				
			||||||
 | 
					    fn update(
 | 
				
			||||||
 | 
					        &mut self,
 | 
				
			||||||
 | 
					        compute_bank_stats_elapsed: u64,
 | 
				
			||||||
 | 
					        select_vote_and_reset_forks_elapsed: u64,
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        self.num_iterations += 1;
 | 
				
			||||||
 | 
					        self.compute_bank_stats_elapsed += compute_bank_stats_elapsed;
 | 
				
			||||||
 | 
					        self.select_vote_and_reset_forks_elapsed += select_vote_and_reset_forks_elapsed;
 | 
				
			||||||
 | 
					        if self.num_iterations == 100 {
 | 
				
			||||||
 | 
					            datapoint_info!(
 | 
				
			||||||
 | 
					                "replay-loop-timing-stats",
 | 
				
			||||||
 | 
					                (
 | 
				
			||||||
 | 
					                    "compute_bank_stats_elapsed",
 | 
				
			||||||
 | 
					                    self.compute_bank_stats_elapsed as i64 / 100,
 | 
				
			||||||
 | 
					                    i64
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                (
 | 
				
			||||||
 | 
					                    "select_vote_and_reset_forks_elapsed",
 | 
				
			||||||
 | 
					                    self.select_vote_and_reset_forks_elapsed as i64 / 100,
 | 
				
			||||||
 | 
					                    i64
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            self.num_iterations = 0;
 | 
				
			||||||
 | 
					            self.compute_bank_stats_elapsed = 0;
 | 
				
			||||||
 | 
					            self.select_vote_and_reset_forks_elapsed = 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub struct ReplayStage {
 | 
					pub struct ReplayStage {
 | 
				
			||||||
    t_replay: JoinHandle<Result<()>>,
 | 
					    t_replay: JoinHandle<Result<()>>,
 | 
				
			||||||
    commitment_service: AggregateCommitmentService,
 | 
					    commitment_service: AggregateCommitmentService,
 | 
				
			||||||
@@ -181,11 +217,11 @@ impl ReplayStage {
 | 
				
			|||||||
                let mut last_reset = Hash::default();
 | 
					                let mut last_reset = Hash::default();
 | 
				
			||||||
                let mut partition = false;
 | 
					                let mut partition = false;
 | 
				
			||||||
                let mut skipped_slots_info = SkippedSlotsInfo::default();
 | 
					                let mut skipped_slots_info = SkippedSlotsInfo::default();
 | 
				
			||||||
 | 
					                let mut replay_timing = ReplayTiming::default();
 | 
				
			||||||
                loop {
 | 
					                loop {
 | 
				
			||||||
                    let allocated = thread_mem_usage::Allocatedp::default();
 | 
					                    let allocated = thread_mem_usage::Allocatedp::default();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    thread_mem_usage::datapoint("solana-replay-stage");
 | 
					                    thread_mem_usage::datapoint("solana-replay-stage");
 | 
				
			||||||
                    let now = Instant::now();
 | 
					 | 
				
			||||||
                    // Stop getting entries if we get exit signal
 | 
					                    // Stop getting entries if we get exit signal
 | 
				
			||||||
                    if exit.load(Ordering::Relaxed) {
 | 
					                    if exit.load(Ordering::Relaxed) {
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
@@ -240,6 +276,7 @@ impl ReplayStage {
 | 
				
			|||||||
                        .filter(|(slot, _)| *slot >= forks_root)
 | 
					                        .filter(|(slot, _)| *slot >= forks_root)
 | 
				
			||||||
                        .map(|(_, bank)| bank)
 | 
					                        .map(|(_, bank)| bank)
 | 
				
			||||||
                        .collect();
 | 
					                        .collect();
 | 
				
			||||||
 | 
					                    let now = Instant::now();
 | 
				
			||||||
                    let newly_computed_slot_stats = Self::compute_bank_stats(
 | 
					                    let newly_computed_slot_stats = Self::compute_bank_stats(
 | 
				
			||||||
                        &my_pubkey,
 | 
					                        &my_pubkey,
 | 
				
			||||||
                        &ancestors,
 | 
					                        &ancestors,
 | 
				
			||||||
@@ -251,6 +288,7 @@ impl ReplayStage {
 | 
				
			|||||||
                        &bank_forks,
 | 
					                        &bank_forks,
 | 
				
			||||||
                        &mut all_pubkeys,
 | 
					                        &mut all_pubkeys,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
 | 
					                    let compute_bank_stats_elapsed = now.elapsed().as_micros();
 | 
				
			||||||
                    for slot in newly_computed_slot_stats {
 | 
					                    for slot in newly_computed_slot_stats {
 | 
				
			||||||
                        let fork_stats = progress.get_fork_stats(slot).unwrap();
 | 
					                        let fork_stats = progress.get_fork_stats(slot).unwrap();
 | 
				
			||||||
                        let confirmed_forks = Self::confirm_forks(
 | 
					                        let confirmed_forks = Self::confirm_forks(
 | 
				
			||||||
@@ -275,6 +313,7 @@ impl ReplayStage {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    Self::report_memory(&allocated, "select_fork", start);
 | 
					                    Self::report_memory(&allocated, "select_fork", start);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    let now = Instant::now();
 | 
				
			||||||
                    let (vote_bank, reset_bank, failure_reasons) =
 | 
					                    let (vote_bank, reset_bank, failure_reasons) =
 | 
				
			||||||
                        Self::select_vote_and_reset_forks(
 | 
					                        Self::select_vote_and_reset_forks(
 | 
				
			||||||
                            &heaviest_bank,
 | 
					                            &heaviest_bank,
 | 
				
			||||||
@@ -284,6 +323,11 @@ impl ReplayStage {
 | 
				
			|||||||
                            &progress,
 | 
					                            &progress,
 | 
				
			||||||
                            &tower,
 | 
					                            &tower,
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
 | 
					                    let select_vote_and_reset_forks_elapsed = now.elapsed().as_micros();
 | 
				
			||||||
 | 
					                    replay_timing.update(
 | 
				
			||||||
 | 
					                        compute_bank_stats_elapsed as u64,
 | 
				
			||||||
 | 
					                        select_vote_and_reset_forks_elapsed as u64,
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if heaviest_bank.is_some()
 | 
					                    if heaviest_bank.is_some()
 | 
				
			||||||
                        && tower.is_recent(heaviest_bank.as_ref().unwrap().slot())
 | 
					                        && tower.is_recent(heaviest_bank.as_ref().unwrap().slot())
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user