Drop system cache for trie benchmarks (#7242)

* 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>
This commit is contained in:
Nikolay Volf
2020-10-07 15:14:14 +03:00
committed by GitHub
parent 601e2fa139
commit add7c9ed5b
2 changed files with 63 additions and 0 deletions
+62
View File
@@ -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
@@ -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 }
}
}