Add validator option to change niceness of snapshot packager thread

This commit is contained in:
Ivan Mironov 2021-10-27 06:56:16 +05:00 committed by Trent Nelson
parent 18b1baa3c1
commit c78f474373
6 changed files with 51 additions and 2 deletions

1
Cargo.lock generated
View File

@ -4558,6 +4558,7 @@ dependencies = [
"chrono",
"clap 2.33.3",
"rpassword",
"solana-perf",
"solana-remote-wallet",
"solana-sdk",
"tempfile",

View File

@ -12,6 +12,7 @@ edition = "2018"
[dependencies]
clap = "2.33.0"
rpassword = "5.0"
solana-perf = { path = "../perf", version = "=1.9.0" }
solana-remote-wallet = { path = "../remote-wallet", version = "=1.9.0" }
solana-sdk = { path = "../sdk", version = "=1.9.0" }
thiserror = "1.0.30"

View File

@ -370,6 +370,27 @@ where
}
}
pub fn is_niceness_adjustment_valid<T>(value: T) -> Result<(), String>
where
T: AsRef<str> + Display,
{
let adjustment = value.as_ref().parse::<i8>().map_err(|err| {
format!(
"error parsing niceness adjustment value '{}': {}",
value, err
)
})?;
if solana_perf::thread::is_renice_allowed(adjustment) {
Ok(())
} else {
Err(String::from(
"niceness adjustment supported only on Linux; negative adjustment \
(priority increase) requires root or CAP_SYS_NICE (see `man 7 capabilities` \
for details)",
))
}
}
#[cfg(test)]
mod tests {
use super::*;
@ -386,4 +407,11 @@ mod tests {
assert!(is_derivation("a/b").is_err());
assert!(is_derivation("0/4294967296").is_err());
}
#[test]
fn test_is_niceness_adjustment_valid() {
assert_eq!(is_niceness_adjustment_valid("0"), Ok(()));
assert!(is_niceness_adjustment_valid("128").is_err());
assert!(is_niceness_adjustment_valid("-129").is_err());
}
}

View File

@ -1,6 +1,7 @@
use solana_gossip::cluster_info::{
ClusterInfo, MAX_INCREMENTAL_SNAPSHOT_HASHES, MAX_SNAPSHOT_HASHES,
};
use solana_perf::thread::renice_this_thread;
use solana_runtime::{
snapshot_archive_info::SnapshotArchiveInfoGetter,
snapshot_config::SnapshotConfig,
@ -48,6 +49,7 @@ impl SnapshotPackagerService {
let t_snapshot_packager = Builder::new()
.name("snapshot-packager".to_string())
.spawn(move || {
renice_this_thread(snapshot_config.packager_thread_niceness_adj).unwrap();
let mut snapshot_gossip_manager = if enable_gossip_push {
Some(SnapshotGossipManager {
cluster_info,

View File

@ -35,6 +35,9 @@ pub struct SnapshotConfig {
/// This is the `debug_verify` parameter to use when calling `update_accounts_hash()`
pub accounts_hash_debug_verify: bool,
// Thread niceness adjustment for snapshot packager service
pub packager_thread_niceness_adj: i8,
}
impl Default for SnapshotConfig {
@ -54,6 +57,7 @@ impl Default for SnapshotConfig {
snapshot_utils::DEFAULT_MAX_INCREMENTAL_SNAPSHOT_ARCHIVES_TO_RETAIN,
accounts_hash_use_index: false,
accounts_hash_debug_verify: false,
packager_thread_niceness_adj: 0,
}
}
}

View File

@ -10,8 +10,8 @@ use {
solana_clap_utils::{
input_parsers::{keypair_of, keypairs_of, pubkey_of, value_of},
input_validators::{
is_keypair, is_keypair_or_ask_keyword, is_parsable, is_pow2, is_pubkey,
is_pubkey_or_keypair, is_slot, is_valid_percentage,
is_keypair, is_keypair_or_ask_keyword, is_niceness_adjustment_valid, is_parsable,
is_pow2, is_pubkey, is_pubkey_or_keypair, is_slot, is_valid_percentage,
},
keypair::SKIP_SEED_PHRASE_VALIDATION_ARG,
},
@ -910,6 +910,16 @@ pub fn main() {
.default_value(default_maximum_incremental_snapshot_archives_to_retain)
.help("The maximum number of incremental snapshot archives to hold on to when purging older snapshots.")
)
.arg(
Arg::with_name("snapshot_packager_niceness_adj")
.long("snapshot-packager-niceness-adjustment")
.value_name("ADJUSTMENT")
.takes_value(true)
.validator(is_niceness_adjustment_valid)
.default_value("0")
.help("Add this value to niceness of snapshot packager thread. Negative value \
increases priority, positive value decreases priority.")
)
.arg(
Arg::with_name("minimal_snapshot_download_speed")
.long("minimal-snapshot-download-speed")
@ -2328,6 +2338,8 @@ pub fn main() {
value_t_or_exit!(matches, "maximum_full_snapshots_to_retain", usize);
let maximum_incremental_snapshot_archives_to_retain =
value_t_or_exit!(matches, "maximum_incremental_snapshots_to_retain", usize);
let snapshot_packager_niceness_adj =
value_t_or_exit!(matches, "snapshot_packager_niceness_adj", i8);
let minimal_snapshot_download_speed =
value_t_or_exit!(matches, "minimal_snapshot_download_speed", f32);
let maximum_snapshot_download_abort =
@ -2395,6 +2407,7 @@ pub fn main() {
maximum_incremental_snapshot_archives_to_retain,
accounts_hash_use_index: validator_config.accounts_db_use_index_hash_calculation,
accounts_hash_debug_verify: validator_config.accounts_db_test_hash_calculation,
packager_thread_niceness_adj: snapshot_packager_niceness_adj,
});
validator_config.accounts_hash_interval_slots =