diff --git a/Cargo.lock b/Cargo.lock index ff02ba2..4303a64 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -116,6 +116,13 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +[[package]] +name = "coreid" +version = "0.1.0" +dependencies = [ + "libc", +] + [[package]] name = "crc32c" version = "0.6.8" @@ -207,6 +214,7 @@ name = "kv_bench" version = "0.1.0" dependencies = [ "clap", + "coreid", "mace", "rand 0.9.2", ] diff --git a/Cargo.toml b/Cargo.toml index 53ab474..02b668b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ edition = "2024" mace = { path = "/home/workspace/gits/github/mace"} clap = { version = "4.5.42", features = ["derive"] } rand = "0.9.2" +coreid = { path = "coreid"} [profile.release] lto = true diff --git a/coreid/.gitignore b/coreid/.gitignore new file mode 100644 index 0000000..869df07 --- /dev/null +++ b/coreid/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock \ No newline at end of file diff --git a/coreid/Cargo.toml b/coreid/Cargo.toml new file mode 100644 index 0000000..a366e86 --- /dev/null +++ b/coreid/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "coreid" +version = "0.1.0" +edition = "2021" +authors = ["abbytsing@gmail.com"] + +[target.'cfg(any(target_os = "linux", target_os = "macos", target_os = "freebsd"))'.dependencies] +libc = "^0.2.0" diff --git a/coreid/src/lib.rs b/coreid/src/lib.rs new file mode 100644 index 0000000..db5145e --- /dev/null +++ b/coreid/src/lib.rs @@ -0,0 +1,37 @@ +#[cfg(target_os = "linux")] +use libc::{ + cpu_set_t, pthread_self, pthread_setaffinity_np, sched_getcpu, sysconf, CPU_SET, + _SC_NPROCESSORS_ONLN, +}; + +#[cfg(target_os = "linux")] +pub fn current_core() -> usize { + unsafe { sched_getcpu() as usize } +} + +#[cfg(target_os = "linux")] +pub fn cores_online() -> usize { + unsafe { sysconf(_SC_NPROCESSORS_ONLN) as usize } +} + +#[cfg(target_os = "linux")] +pub fn bind_core(id: usize) { + unsafe { + let mut set: cpu_set_t = std::mem::zeroed(); + CPU_SET(id % cores_online(), &mut set); + pthread_setaffinity_np(pthread_self(), size_of::(), &set); + } +} + +#[cfg(target_os = "linux")] +pub fn unbind_core() { + unsafe { + let mut set: cpu_set_t = std::mem::zeroed(); + pthread_setaffinity_np(pthread_self(), std::mem::size_of::(), &mut set); + } +} + +#[cfg(target_os = "linux")] +pub fn gettid() -> usize { + unsafe { libc::gettid() as usize } +} diff --git a/src/main.rs b/src/main.rs index f02bb46..24891e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -63,6 +63,7 @@ fn main() { let mut opt = Options::new(path); opt.sync_on_write = false; opt.tmp_store = true; + opt.consolidate_threshold = 512; // opt.cache_capacity = 3 << 30; // this is very important for large key-value store let db = Mace::new(opt.validate().unwrap()).unwrap();