mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-03 00:31:50 +00:00
Part of #7866 - Continuation of #7921 In the above PR, we enabled rayon for batch KZG verification in chain segment processing. However, using the global rayon thread pool for backfill is likely to create resource contention with higher-priority beacon processor work. This PR introduces a dedicated low-priority rayon thread pool `LOW_PRIORITY_RAYON_POOL` and uses it for processing backfill chain segments. This prevents backfill KZG verification from using the global rayon thread pool and competing with high-priority beacon processor tasks for CPU resources. However, this PR by itself doesn't prevent CPU oversubscription because other tasks could still fill up the global rayon thread pool, and having an extra thread pool could make things worse. To address this we need the beacon processor to coordinate total CPU allocation across all tasks, which is covered in: - #7789 Co-Authored-By: Jimmy Chen <jchen.tc@gmail.com> Co-Authored-By: Eitan Seri- Levi <eserilev@gmail.com> Co-Authored-By: Eitan Seri-Levi <eserilev@ucsc.edu>
28 lines
878 B
Rust
28 lines
878 B
Rust
use rayon::{ThreadPool, ThreadPoolBuilder};
|
|
use std::sync::Arc;
|
|
|
|
const DEFAULT_LOW_PRIORITY_DIVISOR: usize = 4;
|
|
const MINIMUM_LOW_PRIORITY_THREAD_COUNT: usize = 1;
|
|
|
|
pub struct RayonManager {
|
|
/// Smaller rayon thread pool for lower-priority, compute-intensive tasks.
|
|
/// By default ~25% of CPUs or a minimum of 1 thread.
|
|
pub low_priority_threadpool: Arc<ThreadPool>,
|
|
}
|
|
|
|
impl Default for RayonManager {
|
|
fn default() -> Self {
|
|
let low_prio_threads =
|
|
(num_cpus::get() / DEFAULT_LOW_PRIORITY_DIVISOR).max(MINIMUM_LOW_PRIORITY_THREAD_COUNT);
|
|
let low_priority_threadpool = Arc::new(
|
|
ThreadPoolBuilder::new()
|
|
.num_threads(low_prio_threads)
|
|
.build()
|
|
.expect("failed to build low-priority rayon pool"),
|
|
);
|
|
Self {
|
|
low_priority_threadpool,
|
|
}
|
|
}
|
|
}
|