diff --git a/Cargo.lock b/Cargo.lock index f62026696e..1663d4e5b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3263,8 +3263,7 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jemalloc_pprof" version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a883828bd6a4b957cd9f618886ff19e5f3ebd34e06ba0e855849e049fef32fb" +source = "git+https://github.com/erikgrinaker/rust-jemalloc-pprof?branch=symbolize#0b146a1e2013bbc7fc8dc45f208f868c0b8ed193" dependencies = [ "anyhow", "libc", @@ -3453,8 +3452,7 @@ dependencies = [ [[package]] name = "mappings" version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce9229c438fbf1c333926e2053c4c091feabbd40a1b590ec62710fea2384af9e" +source = "git+https://github.com/erikgrinaker/rust-jemalloc-pprof?branch=symbolize#0b146a1e2013bbc7fc8dc45f208f868c0b8ed193" dependencies = [ "anyhow", "libc", @@ -4729,10 +4727,10 @@ dependencies = [ [[package]] name = "pprof_util" version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c568b3f8c1c37886ae07459b1946249e725c315306b03be5632f84c239f781" +source = "git+https://github.com/erikgrinaker/rust-jemalloc-pprof?branch=symbolize#0b146a1e2013bbc7fc8dc45f208f868c0b8ed193" dependencies = [ "anyhow", + "backtrace", "flate2", "num", "paste", diff --git a/Cargo.toml b/Cargo.toml index 7228623c6b..afcf5ca1e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -116,7 +116,7 @@ inferno = "0.12.0" ipnet = "2.10.0" itertools = "0.10" itoa = "1.0.11" -jemalloc_pprof = "0.6" +jemalloc_pprof = { git = "https://github.com/erikgrinaker/rust-jemalloc-pprof", branch = "symbolize", version = "0.6", features = ["symbolize"] } jsonwebtoken = "9" lasso = "0.7" libc = "0.2" diff --git a/libs/http-utils/src/endpoint.rs b/libs/http-utils/src/endpoint.rs index be97b341d1..c9fc2cd33c 100644 --- a/libs/http-utils/src/endpoint.rs +++ b/libs/http-utils/src/endpoint.rs @@ -495,19 +495,10 @@ pub async fn profile_heap_handler(req: Request) -> Result, } Format::Pprof => { - let data = tokio::task::spawn_blocking(move || { - let bytes = prof_ctl.dump_pprof()?; - // Symbolize the profile. - // TODO: consider moving this upstream to jemalloc_pprof and avoiding the - // serialization roundtrip. - let profile = pprof::decode(&bytes)?; - let profile = pprof::symbolize(profile)?; - let profile = pprof::strip_locations(profile, STRIP_MAPPINGS, &STRIP_FUNCTIONS); - pprof::encode(&profile) - }) - .await - .map_err(|join_err| ApiError::InternalServerError(join_err.into()))? - .map_err(ApiError::InternalServerError)?; + let data = tokio::task::spawn_blocking(move || prof_ctl.dump_pprof()) + .await + .map_err(|join_err| ApiError::InternalServerError(join_err.into()))? + .map_err(ApiError::InternalServerError)?; Response::builder() .status(200) .header(CONTENT_TYPE, "application/octet-stream") @@ -520,8 +511,6 @@ pub async fn profile_heap_handler(req: Request) -> Result, let body = tokio::task::spawn_blocking(move || { let bytes = prof_ctl.dump_pprof()?; let profile = pprof::decode(&bytes)?; - let profile = pprof::symbolize(profile)?; - let profile = pprof::strip_locations(profile, STRIP_MAPPINGS, &STRIP_FUNCTIONS); let mut opts = inferno::flamegraph::Options::default(); opts.title = "Heap inuse".to_string(); opts.count_name = "bytes".to_string(); diff --git a/pageserver/src/bin/pageserver.rs b/pageserver/src/bin/pageserver.rs index e2b9a7f073..2d44bd9a12 100644 --- a/pageserver/src/bin/pageserver.rs +++ b/pageserver/src/bin/pageserver.rs @@ -672,6 +672,10 @@ fn start_pageserver( } }); + // Allocate a bunch of memory. + let alloc = allocate(256 * 1024 * 1024); + println!("allocated {}b", alloc.len()); + // Wait for cancellation signal and shut down the pageserver. // // This cancels the `shutdown_pageserver` cancellation tree. Right now that tree doesn't @@ -695,6 +699,17 @@ fn start_pageserver( }) } +#[inline(never)] +fn allocate(size: usize) -> Vec { + allocate_inline(size) +} + +#[inline(always)] +fn allocate_inline(size: usize) -> Vec { + println!("allocating {size}b"); + vec![9; size] +} + async fn create_remote_storage_client( conf: &'static PageServerConf, ) -> anyhow::Result {