mirror of
https://github.com/neondatabase/neon.git
synced 2026-05-26 01:20:38 +00:00
This PR adds a component-level benchmarking utility for pageserver. Its name is `pagebench`. The problem solved by `pagebench` is that we want to put Pageserver under high load. This isn't easily achieved with `pgbench` because it needs to go through a compute, which has signficant performance overhead compared to accessing Pageserver directly. Further, compute has its own performance optimizations (most importantly: caches). Instead of designing a compute-facing workload that defeats those internal optimizations, `pagebench` simply bypasses them by accessing pageserver directly. Supported benchmarks: * getpage@latest_lsn * basebackup * triggering logical size calculation This code has no automated users yet. A performance regression test for getpage@latest_lsn will be added in a later PR. part of https://github.com/neondatabase/neon/issues/5771
35 lines
969 B
Rust
35 lines
969 B
Rust
use std::sync::Arc;
|
|
|
|
use pageserver_client::mgmt_api;
|
|
use tracing::info;
|
|
use utils::id::TenantTimelineId;
|
|
|
|
pub(crate) struct Spec {
|
|
pub(crate) limit_to_first_n_targets: Option<usize>,
|
|
pub(crate) targets: Option<Vec<TenantTimelineId>>,
|
|
}
|
|
|
|
pub(crate) async fn discover(
|
|
api_client: &Arc<mgmt_api::Client>,
|
|
spec: Spec,
|
|
) -> anyhow::Result<Vec<TenantTimelineId>> {
|
|
let mut timelines = if let Some(targets) = spec.targets {
|
|
targets
|
|
} else {
|
|
mgmt_api::util::get_pageserver_tenant_timelines_unsharded(api_client).await?
|
|
};
|
|
|
|
if let Some(limit) = spec.limit_to_first_n_targets {
|
|
timelines.sort(); // for determinism
|
|
timelines.truncate(limit);
|
|
if timelines.len() < limit {
|
|
anyhow::bail!("pageserver has less than limit_to_first_n_targets={limit} tenants");
|
|
}
|
|
}
|
|
|
|
info!("timelines:\n{:?}", timelines);
|
|
info!("number of timelines:\n{:?}", timelines.len());
|
|
|
|
Ok(timelines)
|
|
}
|