From 54eb6345889165c5e5f62af5b24cc665980d2b1d Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 24 Apr 2024 23:29:09 -0700 Subject: [PATCH] add rocksdb compaction thread priority/iopriority w/ conf Signed-off-by: Jason Volk --- conduwuit-example.toml | 8 ++++++++ src/config/mod.rs | 17 +++++++++++++++++ src/database/rocksdb/mod.rs | 4 ++-- src/database/rocksdb/opts.rs | 8 +++++++- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/conduwuit-example.toml b/conduwuit-example.toml index aa46cbc3..55a40c0a 100644 --- a/conduwuit-example.toml +++ b/conduwuit-example.toml @@ -387,6 +387,14 @@ allow_profile_lookup_federation_requests = true # Defaults to your CPU physical core count (not logical threads). #rocksdb_parallelism_threads = 0 +# Enables idle IO priority for compaction thread. This prevents any unexpected lag in the server's operation and +# is usually a good idea. Enabled by default. +#rocksdb_compaction_ioprio_idle = true + +# Enables idle CPU priority for compaction thread. This is not enabled by default to prevent compaction from +# falling too far behind on busy systems. +#rocksdb_compaction_prio_idle = false + # Maximum number of LOG files RocksDB will keep. This must *not* be set to 0. It must be at least 1. # Defaults to 3 as these are not very useful. #rocksdb_max_log_files = 3 diff --git a/src/config/mod.rs b/src/config/mod.rs index 655e6d3c..df8fd3cd 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -228,6 +228,10 @@ pub(crate) struct Config { pub(crate) rocksdb_read_only: bool, #[serde(default)] pub(crate) rocksdb_periodic_cleanup: bool, + #[serde(default)] + pub(crate) rocksdb_compaction_prio_idle: bool, + #[serde(default = "true_fn")] + pub(crate) rocksdb_compaction_ioprio_idle: bool, pub(crate) emergency_password: Option, @@ -706,9 +710,22 @@ impl fmt::Display for Config { ), #[cfg(feature = "rocksdb")] ("RocksDB Recovery Mode", &self.rocksdb_recovery_mode.to_string()), + #[cfg(feature = "rocksdb")] ("RocksDB Repair Mode", &self.rocksdb_repair.to_string()), + #[cfg(feature = "rocksdb")] ("RocksDB Read-only Mode", &self.rocksdb_read_only.to_string()), + #[cfg(feature = "rocksdb")] ("RocksDB Periodic Cleanup", &self.rocksdb_periodic_cleanup.to_string()), + #[cfg(feature = "rocksdb")] + ( + "RocksDB Compaction Idle Priority", + &self.rocksdb_compaction_prio_idle.to_string(), + ), + #[cfg(feature = "rocksdb")] + ( + "RocksDB Compaction Idle IOPriority", + &self.rocksdb_compaction_ioprio_idle.to_string(), + ), ("Prevent Media Downloads From", { let mut lst = vec![]; for domain in &self.prevent_media_downloads_from { diff --git a/src/database/rocksdb/mod.rs b/src/database/rocksdb/mod.rs index afc47630..1eec597a 100644 --- a/src/database/rocksdb/mod.rs +++ b/src/database/rocksdb/mod.rs @@ -41,9 +41,9 @@ impl KeyValueDatabaseEngine for Arc { let mut col_cache = HashMap::new(); col_cache.insert("primary".to_owned(), Cache::new_lru_cache(col_cache_capacity_bytes)); - let db_env = Env::new()?; + let mut db_env = Env::new()?; let row_cache = Cache::new_lru_cache(row_cache_capacity_bytes); - let db_opts = db_options(config, &db_env, &row_cache, col_cache.get("primary").expect("cache")); + let db_opts = db_options(config, &mut db_env, &row_cache, col_cache.get("primary").expect("cache")); let load_time = std::time::Instant::now(); if config.rocksdb_repair { diff --git a/src/database/rocksdb/opts.rs b/src/database/rocksdb/opts.rs index 68b30b4d..a7fc4818 100644 --- a/src/database/rocksdb/opts.rs +++ b/src/database/rocksdb/opts.rs @@ -14,7 +14,7 @@ use super::Config; /// resulting value. Note that we require special per-column options on some /// columns, therefor columns should only be opened after passing this result /// through cf_options(). -pub(crate) fn db_options(config: &Config, env: &Env, row_cache: &Cache, col_cache: &Cache) -> Options { +pub(crate) fn db_options(config: &Config, env: &mut Env, row_cache: &Cache, col_cache: &Cache) -> Options { let mut opts = Options::default(); // Logging @@ -30,6 +30,9 @@ pub(crate) fn db_options(config: &Config, env: &Env, row_cache: &Cache, col_cach opts.set_max_background_jobs(threads.try_into().unwrap()); opts.set_max_subcompactions(threads.try_into().unwrap()); opts.set_max_file_opening_threads(0); + if config.rocksdb_compaction_prio_idle { + env.lower_thread_pool_cpu_priority(); + } // IO opts.set_manual_wal_flush(true); @@ -41,6 +44,9 @@ pub(crate) fn db_options(config: &Config, env: &Env, row_cache: &Cache, col_cach opts.set_skip_stats_update_on_db_open(true); //opts.set_max_file_opening_threads(threads.try_into().unwrap()); } + if config.rocksdb_compaction_ioprio_idle { + env.lower_thread_pool_io_priority(); + } // Blocks let mut table_opts = table_options(config);