Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Commit

Permalink
Drop system cache for trie benchmarks (#7242)
Browse files Browse the repository at this point in the history
* add system clear cache

* move to shared

* rearrange a little-a

* add few tricks also

* use tempdir for buf as well

* Apply suggestions from code review

Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
  • Loading branch information
NikVolf and bkchr authored Oct 7, 2020
1 parent d67fc4c commit 87e7e86
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
1 change: 1 addition & 0 deletions bin/node/bench/src/trie.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ impl sp_state_machine::Storage<sp_core::Blake2Hasher> for Storage {
impl core::Benchmark for TrieReadBenchmark {
fn run(&mut self, mode: Mode) -> std::time::Duration {
let mut db = self.database.clone();

let storage: Arc<dyn sp_state_machine::Storage<sp_core::Blake2Hasher>> =
Arc::new(Storage(db.open(self.database_type)));

Expand Down
62 changes: 62 additions & 0 deletions bin/node/testing/src/bench.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,61 @@ impl BenchPair {
}
}

/// Drop system cache.
///
/// Will panic if cache drop is impossbile.
pub fn drop_system_cache() {
#[cfg(target_os = "windows")] {
log::warn!(
target: "bench-logistics",
"Clearing system cache on windows is not supported. Benchmark might totally be wrong.",
);
return;
}

std::process::Command::new("sync")
.output()
.expect("Failed to execute system cache clear");

#[cfg(target_os = "linux")] {
log::trace!(target: "bench-logistics", "Clearing system cache...");
std::process::Command::new("echo")
.args(&["3", ">", "/proc/sys/vm/drop_caches", "2>", "/dev/null"])
.output()
.expect("Failed to execute system cache clear");

let temp = tempfile::tempdir().expect("Failed to spawn tempdir");
let temp_file_path = format!("of={}/buf", temp.path().to_string_lossy());

// this should refill write cache with 2GB of garbage
std::process::Command::new("dd")
.args(&["if=/dev/urandom", &temp_file_path, "bs=64M", "count=32"])
.output()
.expect("Failed to execute dd for cache clear");

// remove tempfile of previous command
std::process::Command::new("rm")
.arg(&temp_file_path)
.output()
.expect("Failed to remove temp file");

std::process::Command::new("sync")
.output()
.expect("Failed to execute system cache clear");

log::trace!(target: "bench-logistics", "Clearing system cache done!");
}

#[cfg(target_os = "macos")] {
log::trace!(target: "bench-logistics", "Clearing system cache...");
if let Err(err) = std::process::Command::new("purge").output() {
log::error!("purge error {:?}: ", err);
panic!("Could not clear system cache. Run under sudo?");
}
log::trace!(target: "bench-logistics", "Clearing system cache done!");
}
}

/// Pre-initialized benchmarking database.
///
/// This is prepared database with genesis and keyring
Expand Down Expand Up @@ -124,6 +179,13 @@ impl Clone for BenchDb {
&fs_extra::dir::CopyOptions::new(),
).expect("Copy of seed database is ok");

// We clear system cache after db clone but before any warmups.
// This populates system cache with some data unrelated to actual
// data we will be quering further under benchmark (like what
// would have happened in real system that queries random entries
// from database).
drop_system_cache();

BenchDb { keyring, directory_guard: Guard(dir), database_type }
}
}
Expand Down

0 comments on commit 87e7e86

Please sign in to comment.