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 {