Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wrap create executor timings datapoint in a module (backport #22394) #22397

Merged
merged 1 commit into from Jan 19, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
48 changes: 31 additions & 17 deletions programs/bpf_loader/src/lib.rs
Expand Up @@ -80,6 +80,28 @@ fn map_ebpf_error(invoke_context: &dyn InvokeContext, e: EbpfError<BpfError>) ->
InstructionError::InvalidAccountData
}

mod executor_metrics {
#[derive(Debug, Default)]
pub struct CreateMetrics {
pub program_id: String,
pub load_elf_us: u64,
pub verify_code_us: u64,
pub jit_compile_us: u64,
}

impl CreateMetrics {
pub fn submit_datapoint(&self) {
datapoint_trace!(
"create_executor_trace",
("program_id", self.program_id, String),
("load_elf_us", self.load_elf_us, i64),
("verify_code_us", self.verify_code_us, i64),
("jit_compile_us", self.jit_compile_us, i64),
);
}
}
}

pub fn create_executor(
program_account_index: usize,
program_data_offset: usize,
Expand Down Expand Up @@ -116,13 +138,11 @@ pub fn create_executor(
reject_all_writable_sections: invoke_context.is_feature_active(&reject_all_elf_rw::id()),
..Config::default()
};
let program_id;
let load_elf_us: u64;
let mut jit_compile_us = 0u64;
let mut create_executor_metrics = executor_metrics::CreateMetrics::default();
let executable_result = {
let keyed_accounts = invoke_context.get_keyed_accounts()?;
let program = keyed_account_at_index(keyed_accounts, program_account_index)?;
program_id = *program.unsigned_key();
create_executor_metrics.program_id = program.unsigned_key().to_string();
let account = program.try_account_ref()?;
let data = &account.data()[program_data_offset..];
let mut load_elf_time = Measure::start("load_elf_time");
Expand All @@ -133,13 +153,13 @@ pub fn create_executor(
syscall_registry,
);
load_elf_time.stop();
load_elf_us = load_elf_time.as_us();
create_executor_metrics.load_elf_us = load_elf_time.as_us();
executable
};

saturating_add_assign!(
invoke_context.get_timings().create_executor_load_elf_us,
load_elf_us
create_executor_metrics.load_elf_us
);

let mut executable = executable_result.map_err(|e| map_ebpf_error(invoke_context, e))?;
Expand All @@ -149,33 +169,27 @@ pub fn create_executor(
verifier::check(text_bytes, &config)
.map_err(|e| map_ebpf_error(invoke_context, EbpfError::UserError(e.into())))?;
verify_code_time.stop();
let verify_elf_us = verify_code_time.as_us();
create_executor_metrics.verify_code_us = verify_code_time.as_us();
saturating_add_assign!(
invoke_context.get_timings().create_executor_verify_code_us,
verify_elf_us
create_executor_metrics.verify_code_us
);
if use_jit {
let mut jit_compile_time = Measure::start("jit_compile_time");
let jit_compile_result =
Executable::<BpfError, ThisInstructionMeter>::jit_compile(&mut executable);
jit_compile_time.stop();
jit_compile_us = jit_compile_time.as_us();
create_executor_metrics.jit_compile_us = jit_compile_time.as_us();
saturating_add_assign!(
invoke_context.get_timings().create_executor_jit_compile_us,
jit_compile_us
create_executor_metrics.jit_compile_us
);
if let Err(err) = jit_compile_result {
ic_msg!(invoke_context, "Failed to compile program {:?}", err);
return Err(InstructionError::ProgramFailedToCompile);
}
}
datapoint_trace!(
"create_executor_trace",
("program_id", program_id.to_string(), String),
("load_elf_us", load_elf_us, i64),
("verify_elf_us", verify_elf_us, i64),
("jit_compile_us", jit_compile_us, i64),
);
create_executor_metrics.submit_datapoint();
Ok(Arc::new(BpfExecutor { executable }))
}

Expand Down