mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-10 12:11:59 +00:00
Closes: - https://github.com/sigp/lighthouse/issues/1914 Sign attestations prior to checking them against the slashing protection DB. This allows us to avoid the sequential DB checks which are observed in traces here: - https://github.com/sigp/lighthouse/pull/8508#discussion_r2576686107 Co-Authored-By: Jimmy Chen <jchen.tc@gmail.com> Co-Authored-By: Michael Sproul <michael@sigmaprime.io> Co-Authored-By: Michael Sproul <michaelsproul@users.noreply.github.com>
59 lines
2.1 KiB
Rust
59 lines
2.1 KiB
Rust
use rayon::{ThreadPool, ThreadPoolBuilder};
|
|
use std::sync::Arc;
|
|
|
|
const DEFAULT_LOW_PRIORITY_CPU_PERCENTAGE: usize = 25;
|
|
const DEFAULT_HIGH_PRIORITY_CPU_PERCENTAGE: usize = 80;
|
|
const MINIMUM_THREAD_COUNT: usize = 1;
|
|
|
|
pub enum RayonPoolType {
|
|
HighPriority,
|
|
LowPriority,
|
|
}
|
|
|
|
pub struct RayonPoolProvider {
|
|
/// Smaller rayon thread pool for lower-priority, compute-intensive tasks.
|
|
/// By default ~25% of CPUs or a minimum of 1 thread.
|
|
low_priority_thread_pool: Arc<ThreadPool>,
|
|
/// Larger rayon thread pool for high-priority, compute-intensive tasks.
|
|
/// By default ~80% of CPUs or a minimum of 1 thread. Critical/highest
|
|
/// priority tasks should use the global pool instead.
|
|
high_priority_thread_pool: Arc<ThreadPool>,
|
|
}
|
|
|
|
impl Default for RayonPoolProvider {
|
|
fn default() -> Self {
|
|
let low_prio_threads =
|
|
(num_cpus::get() * DEFAULT_LOW_PRIORITY_CPU_PERCENTAGE / 100).max(MINIMUM_THREAD_COUNT);
|
|
let low_priority_thread_pool = Arc::new(
|
|
ThreadPoolBuilder::new()
|
|
.num_threads(low_prio_threads)
|
|
.build()
|
|
.expect("failed to build low-priority rayon pool"),
|
|
);
|
|
|
|
let high_prio_threads = (num_cpus::get() * DEFAULT_HIGH_PRIORITY_CPU_PERCENTAGE / 100)
|
|
.max(MINIMUM_THREAD_COUNT);
|
|
let high_priority_thread_pool = Arc::new(
|
|
ThreadPoolBuilder::new()
|
|
.num_threads(high_prio_threads)
|
|
.build()
|
|
.expect("failed to build high-priority rayon pool"),
|
|
);
|
|
Self {
|
|
low_priority_thread_pool,
|
|
high_priority_thread_pool,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl RayonPoolProvider {
|
|
/// Get a scoped thread pool by priority level.
|
|
/// For critical/highest priority tasks, use the global pool instead.
|
|
pub fn get_thread_pool(&self, rayon_pool_type: RayonPoolType) -> Arc<ThreadPool> {
|
|
match rayon_pool_type {
|
|
RayonPoolType::HighPriority => self.high_priority_thread_pool.clone(),
|
|
RayonPoolType::LowPriority => self.low_priority_thread_pool.clone(),
|
|
}
|
|
}
|
|
}
|