* move `ExecuteTimings` from `runtime::bank` to `program_runtime::timings` (cherry picked from commit7d32909e17
) # Conflicts: # core/Cargo.toml # ledger/Cargo.toml # programs/bpf/Cargo.lock * Add execute metrics (cherry picked from commitb25e4a200b
) * Add metrics for executor creation (cherry picked from commit848b6dfbdd
) * Add helper macro for `AddAssign`ing with saturating arithmetic (cherry picked from commitdeb9344e49
) * Use saturating_add_assign macro (cherry picked from commit72fc6096a0
) * Consolidate process instruction execution timings to own struct (cherry picked from commit390ef0fbcd
) Co-authored-by: Trent Nelson <trent@solana.com> Co-authored-by: Carl Lin <carl@solana.com>
This commit is contained in:
@@ -82,7 +82,7 @@ use {
|
||||
TransactionAccountRefCells, TransactionExecutor,
|
||||
},
|
||||
log_collector::LogCollector,
|
||||
timings::ExecuteDetailsTimings,
|
||||
timings::ExecuteTimings,
|
||||
},
|
||||
solana_sdk::{
|
||||
account::{
|
||||
@@ -119,7 +119,7 @@ use {
|
||||
precompiles::get_precompiles,
|
||||
program_utils::limited_deserialize,
|
||||
pubkey::Pubkey,
|
||||
secp256k1_program,
|
||||
saturating_add_assign, secp256k1_program,
|
||||
signature::{Keypair, Signature},
|
||||
slot_hashes::SlotHashes,
|
||||
slot_history::SlotHistory,
|
||||
@@ -212,36 +212,6 @@ impl RentDebits {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default, Debug)]
|
||||
pub struct ExecuteTimings {
|
||||
pub check_us: u64,
|
||||
pub load_us: u64,
|
||||
pub execute_us: u64,
|
||||
pub store_us: u64,
|
||||
pub update_stakes_cache_us: u64,
|
||||
pub total_batches_len: usize,
|
||||
pub num_execute_batches: u64,
|
||||
pub details: ExecuteDetailsTimings,
|
||||
}
|
||||
impl ExecuteTimings {
|
||||
pub fn accumulate(&mut self, other: &ExecuteTimings) {
|
||||
self.check_us = self.check_us.saturating_add(other.check_us);
|
||||
self.load_us = self.load_us.saturating_add(other.load_us);
|
||||
self.execute_us = self.execute_us.saturating_add(other.execute_us);
|
||||
self.store_us = self.store_us.saturating_add(other.store_us);
|
||||
self.update_stakes_cache_us = self
|
||||
.update_stakes_cache_us
|
||||
.saturating_add(other.update_stakes_cache_us);
|
||||
self.total_batches_len = self
|
||||
.total_batches_len
|
||||
.saturating_add(other.total_batches_len);
|
||||
self.num_execute_batches = self
|
||||
.num_execute_batches
|
||||
.saturating_add(other.num_execute_batches);
|
||||
self.details.accumulate(&other.details);
|
||||
}
|
||||
}
|
||||
|
||||
type BankStatusCache = StatusCache<Result<()>>;
|
||||
#[frozen_abi(digest = "6XG6H1FChrDdY39K62KFWj5XfDao4dd24WZgcJkdMu1E")]
|
||||
pub type BankSlotDelta = SlotDelta<Result<()>>;
|
||||
@@ -3607,7 +3577,7 @@ impl Bank {
|
||||
durable_nonce_fee: Option<DurableNonceFee>,
|
||||
enable_cpi_recording: bool,
|
||||
enable_log_recording: bool,
|
||||
execute_details_timings: &mut ExecuteDetailsTimings,
|
||||
timings: &mut ExecuteTimings,
|
||||
error_counters: &mut ErrorCounters,
|
||||
) -> TransactionExecutionResult {
|
||||
let legacy_message = match tx.message().legacy_message() {
|
||||
@@ -3620,11 +3590,17 @@ impl Bank {
|
||||
}
|
||||
};
|
||||
|
||||
let mut get_executors_time = Measure::start("get_executors_time");
|
||||
let executors = self.get_executors(
|
||||
tx.message(),
|
||||
&loaded_transaction.accounts,
|
||||
&loaded_transaction.program_indices,
|
||||
);
|
||||
get_executors_time.stop();
|
||||
saturating_add_assign!(
|
||||
timings.execute_accessories.get_executors_us,
|
||||
get_executors_time.as_us()
|
||||
);
|
||||
|
||||
let account_refcells = Self::accounts_to_refcells(&mut loaded_transaction.accounts);
|
||||
|
||||
@@ -3644,6 +3620,8 @@ impl Bank {
|
||||
};
|
||||
|
||||
let (blockhash, lamports_per_signature) = self.last_blockhash_and_lamports_per_signature();
|
||||
|
||||
let mut process_message_time = Measure::start("process_message_time");
|
||||
let process_result = MessageProcessor::process_message(
|
||||
&self.builtin_programs.vec,
|
||||
legacy_message,
|
||||
@@ -3655,14 +3633,25 @@ impl Bank {
|
||||
instruction_recorders.as_deref(),
|
||||
self.feature_set.clone(),
|
||||
compute_budget,
|
||||
execute_details_timings,
|
||||
timings,
|
||||
&*self.sysvar_cache.read().unwrap(),
|
||||
blockhash,
|
||||
lamports_per_signature,
|
||||
self.load_accounts_data_len(),
|
||||
);
|
||||
process_message_time.stop();
|
||||
saturating_add_assign!(
|
||||
timings.execute_accessories.process_message_us,
|
||||
process_message_time.as_us()
|
||||
);
|
||||
|
||||
let mut update_executors_time = Measure::start("update_executors_time");
|
||||
self.update_executors(process_result.is_ok(), executors);
|
||||
update_executors_time.stop();
|
||||
saturating_add_assign!(
|
||||
timings.execute_accessories.update_executors_us,
|
||||
update_executors_time.as_us()
|
||||
);
|
||||
|
||||
let status = process_result
|
||||
.map(|info| {
|
||||
@@ -3763,19 +3752,36 @@ impl Bank {
|
||||
let mut execution_time = Measure::start("execution_time");
|
||||
let mut signature_count: u64 = 0;
|
||||
|
||||
let execute_details_timings = &mut timings.details;
|
||||
let execution_results: Vec<TransactionExecutionResult> = loaded_txs
|
||||
.iter_mut()
|
||||
.zip(sanitized_txs.iter())
|
||||
.map(|(accs, tx)| match accs {
|
||||
(Err(e), _nonce) => TransactionExecutionResult::NotExecuted(e.clone()),
|
||||
(Ok(loaded_transaction), nonce) => {
|
||||
let mut feature_set_clone_time = Measure::start("feature_set_clone");
|
||||
let feature_set = self.feature_set.clone();
|
||||
feature_set_clone_time.stop();
|
||||
saturating_add_assign!(
|
||||
timings.execute_accessories.feature_set_clone_us,
|
||||
feature_set_clone_time.as_us()
|
||||
);
|
||||
|
||||
signature_count += u64::from(tx.message().header().num_required_signatures);
|
||||
|
||||
let mut compute_budget = self.compute_budget.unwrap_or_else(ComputeBudget::new);
|
||||
if feature_set.is_active(&tx_wide_compute_cap::id()) {
|
||||
if let Err(err) = compute_budget.process_transaction(tx, feature_set) {
|
||||
let mut compute_budget_process_transaction_time =
|
||||
Measure::start("compute_budget_process_transaction_time");
|
||||
let process_transaction_result =
|
||||
compute_budget.process_transaction(tx, feature_set);
|
||||
compute_budget_process_transaction_time.stop();
|
||||
saturating_add_assign!(
|
||||
timings
|
||||
.execute_accessories
|
||||
.compute_budget_process_transaction_us,
|
||||
compute_budget_process_transaction_time.as_us()
|
||||
);
|
||||
if let Err(err) = process_transaction_result {
|
||||
return TransactionExecutionResult::NotExecuted(err);
|
||||
}
|
||||
}
|
||||
@@ -3789,7 +3795,7 @@ impl Bank {
|
||||
durable_nonce_fee,
|
||||
enable_cpi_recording,
|
||||
enable_log_recording,
|
||||
execute_details_timings,
|
||||
timings,
|
||||
&mut error_counters,
|
||||
)
|
||||
}
|
||||
|
@@ -8,7 +8,7 @@ use {
|
||||
TransactionAccountRefCell,
|
||||
},
|
||||
log_collector::LogCollector,
|
||||
timings::ExecuteDetailsTimings,
|
||||
timings::ExecuteTimings,
|
||||
},
|
||||
solana_sdk::{
|
||||
account::WritableAccount,
|
||||
@@ -19,6 +19,7 @@ use {
|
||||
precompiles::is_precompile,
|
||||
pubkey::Pubkey,
|
||||
rent::Rent,
|
||||
saturating_add_assign,
|
||||
sysvar::instructions,
|
||||
transaction::TransactionError,
|
||||
},
|
||||
@@ -62,7 +63,7 @@ impl MessageProcessor {
|
||||
instruction_recorders: Option<&[InstructionRecorder]>,
|
||||
feature_set: Arc<FeatureSet>,
|
||||
compute_budget: ComputeBudget,
|
||||
timings: &mut ExecuteDetailsTimings,
|
||||
timings: &mut ExecuteTimings,
|
||||
sysvars: &[(Pubkey, Vec<u8>)],
|
||||
blockhash: Hash,
|
||||
lamports_per_signature: u64,
|
||||
@@ -120,15 +121,26 @@ impl MessageProcessor {
|
||||
let ProcessInstructionResult {
|
||||
compute_units_consumed,
|
||||
result,
|
||||
} = invoke_context.process_instruction(message, instruction, program_indices, &[], &[]);
|
||||
} = invoke_context.process_instruction(
|
||||
message,
|
||||
instruction,
|
||||
program_indices,
|
||||
&[],
|
||||
&[],
|
||||
timings,
|
||||
);
|
||||
time.stop();
|
||||
timings.accumulate_program(
|
||||
timings.details.accumulate_program(
|
||||
instruction.program_id(&message.account_keys),
|
||||
time.as_us(),
|
||||
compute_units_consumed,
|
||||
result.is_err(),
|
||||
);
|
||||
timings.accumulate(&invoke_context.timings);
|
||||
timings.details.accumulate(&invoke_context.timings);
|
||||
saturating_add_assign!(
|
||||
timings.execute_accessories.process_instructions.total_us,
|
||||
time.as_us()
|
||||
);
|
||||
result
|
||||
.map_err(|err| TransactionError::InstructionError(instruction_index as u8, err))?;
|
||||
}
|
||||
@@ -255,7 +267,7 @@ mod tests {
|
||||
None,
|
||||
Arc::new(FeatureSet::all_enabled()),
|
||||
ComputeBudget::new(),
|
||||
&mut ExecuteDetailsTimings::default(),
|
||||
&mut ExecuteTimings::default(),
|
||||
&[],
|
||||
Hash::default(),
|
||||
0,
|
||||
@@ -285,7 +297,7 @@ mod tests {
|
||||
None,
|
||||
Arc::new(FeatureSet::all_enabled()),
|
||||
ComputeBudget::new(),
|
||||
&mut ExecuteDetailsTimings::default(),
|
||||
&mut ExecuteTimings::default(),
|
||||
&[],
|
||||
Hash::default(),
|
||||
0,
|
||||
@@ -319,7 +331,7 @@ mod tests {
|
||||
None,
|
||||
Arc::new(FeatureSet::all_enabled()),
|
||||
ComputeBudget::new(),
|
||||
&mut ExecuteDetailsTimings::default(),
|
||||
&mut ExecuteTimings::default(),
|
||||
&[],
|
||||
Hash::default(),
|
||||
0,
|
||||
@@ -464,7 +476,7 @@ mod tests {
|
||||
None,
|
||||
Arc::new(FeatureSet::all_enabled()),
|
||||
ComputeBudget::new(),
|
||||
&mut ExecuteDetailsTimings::default(),
|
||||
&mut ExecuteTimings::default(),
|
||||
&[],
|
||||
Hash::default(),
|
||||
0,
|
||||
@@ -498,7 +510,7 @@ mod tests {
|
||||
None,
|
||||
Arc::new(FeatureSet::all_enabled()),
|
||||
ComputeBudget::new(),
|
||||
&mut ExecuteDetailsTimings::default(),
|
||||
&mut ExecuteTimings::default(),
|
||||
&[],
|
||||
Hash::default(),
|
||||
0,
|
||||
@@ -529,7 +541,7 @@ mod tests {
|
||||
None,
|
||||
Arc::new(FeatureSet::all_enabled()),
|
||||
ComputeBudget::new(),
|
||||
&mut ExecuteDetailsTimings::default(),
|
||||
&mut ExecuteTimings::default(),
|
||||
&[],
|
||||
Hash::default(),
|
||||
0,
|
||||
@@ -587,7 +599,7 @@ mod tests {
|
||||
None,
|
||||
Arc::new(FeatureSet::all_enabled()),
|
||||
ComputeBudget::new(),
|
||||
&mut ExecuteDetailsTimings::default(),
|
||||
&mut ExecuteTimings::default(),
|
||||
&[],
|
||||
Hash::default(),
|
||||
0,
|
||||
|
Reference in New Issue
Block a user