diff --git a/Cargo.lock b/Cargo.lock index a75db5d1d14c87..a166bef826aeb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -755,7 +755,7 @@ checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -908,7 +908,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -1058,7 +1058,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -1189,7 +1189,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -1340,7 +1340,7 @@ checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -1833,7 +1833,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -1857,7 +1857,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -1868,7 +1868,7 @@ checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ "darling_core", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -1930,7 +1930,7 @@ checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -1941,7 +1941,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -2065,7 +2065,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -2171,7 +2171,7 @@ checksum = "03cdc46ec28bd728e67540c528013c6a10eb69a02eb31078a1bda695438cbfb8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -2483,7 +2483,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -3113,7 +3113,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -3657,9 +3657,9 @@ dependencies = [ [[package]] name = "lz4" -version = "1.28.0" +version = "1.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d1febb2b4a79ddd1980eede06a8f7902197960aa0383ffcfdd62fe723036725" +checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" dependencies = [ "lz4-sys", ] @@ -3969,7 +3969,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -4041,7 +4041,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -4675,7 +4675,7 @@ checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -5476,14 +5476,14 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] name = "serde_json" -version = "1.0.134" +version = "1.0.135" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" +checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" dependencies = [ "itoa", "memchr", @@ -5532,7 +5532,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -5582,7 +5582,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -7278,7 +7278,7 @@ version = "2.2.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -7950,7 +7950,7 @@ version = "2.2.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", "toml 0.8.12", ] @@ -8968,7 +8968,7 @@ dependencies = [ "bs58", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -10398,7 +10398,7 @@ checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" dependencies = [ "quote", "spl-discriminator-syn", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -10410,7 +10410,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.93", + "syn 2.0.95", "thiserror 1.0.69", ] @@ -10498,7 +10498,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -10768,9 +10768,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.93" +version = "2.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" +checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" dependencies = [ "proc-macro2", "quote", @@ -10803,7 +10803,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -10972,7 +10972,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -10984,7 +10984,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", "test-case-core", ] @@ -11029,7 +11029,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -11040,7 +11040,7 @@ checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -11186,7 +11186,7 @@ source = "git+https://github.com/anza-xyz/solana-tokio.git?rev=7cf47705faacf7bf0 dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -11430,7 +11430,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -11757,7 +11757,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", "wasm-bindgen-shared", ] @@ -11791,7 +11791,7 @@ checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -12184,7 +12184,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", "synstructure 0.13.1", ] @@ -12205,7 +12205,7 @@ checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -12225,7 +12225,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", "synstructure 0.13.1", ] @@ -12246,7 +12246,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] @@ -12268,7 +12268,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.95", ] [[package]] diff --git a/memory-management/Cargo.toml b/memory-management/Cargo.toml index 538667ea6dbaf0..26de3994146c37 100644 --- a/memory-management/Cargo.toml +++ b/memory-management/Cargo.toml @@ -10,8 +10,10 @@ edition = { workspace = true } [dependencies] arrayvec = { workspace = true } -jemallocator = { workspace = true } libc = { workspace = true } log = { workspace = true } memchr = "2.7.4" solana-metrics = { workspace = true } + +[target.'cfg(not(any(target_env = "msvc", target_os = "freebsd")))'.dependencies] +jemallocator = { workspace = true } diff --git a/memory-management/src/jemalloc_monitor.rs b/memory-management/src/jemalloc_monitor.rs index a9e50c6bbb29e9..e0a5b5ded8ab96 100644 --- a/memory-management/src/jemalloc_monitor.rs +++ b/memory-management/src/jemalloc_monitor.rs @@ -1,3 +1,4 @@ +#![cfg(not(any(target_env = "msvc", target_os = "freebsd")))] use { jemallocator::Jemalloc, std::{ diff --git a/memory-management/src/jemalloc_monitor_metrics.rs b/memory-management/src/jemalloc_monitor_metrics.rs index 1771d49acfa0ed..77f75a186c4aa8 100644 --- a/memory-management/src/jemalloc_monitor_metrics.rs +++ b/memory-management/src/jemalloc_monitor_metrics.rs @@ -1,3 +1,4 @@ +#![cfg(not(any(target_env = "msvc", target_os = "freebsd")))] use { crate::jemalloc_monitor::*, log::Level, solana_metrics::datapoint::DataPoint, std::time::Duration, @@ -47,15 +48,20 @@ fn watcher_thread() { } } +//Agave specific helper to watch for memory usage pub fn setup_watch_memory_usage() { let mut mps = MemPoolStats::default(); - // his list is brittle but there does not appear to be a better way + // this list is brittle but there does not appear to be a better way + // Order of entries matters here, as first matching prefix will be used + // So solGossip will match solGossipConsume as well for thread in [ "solPohTickProd", "solSigVerTpuVote", "solRcvrGossip", "solSigVerTpu", "solClusterInfo", + "solGossipCons", + "solGossipWork", "solGossip", "solRepair", "FetchStage", @@ -67,11 +73,9 @@ pub fn setup_watch_memory_usage() { "solSigVerify", "solRetransmit", "solRunGossip", - "solGossipWork", "solWinInsert", - "solGossipCons", - "solAccounts", "solAccountsLo", + "solAccounts", "solAcctHash", "solVoteSigVerTpu", "solTrSigVerTpu", diff --git a/memory-management/src/lib.rs b/memory-management/src/lib.rs index ab9007af8e00b8..d1479da2dd71c6 100644 --- a/memory-management/src/lib.rs +++ b/memory-management/src/lib.rs @@ -1,7 +1,9 @@ #![deny(clippy::arithmetic_side_effects)] pub mod aligned_memory; +#[cfg(not(any(target_env = "msvc", target_os = "freebsd")))] pub mod jemalloc_monitor; +#[cfg(not(any(target_env = "msvc", target_os = "freebsd")))] pub mod jemalloc_monitor_metrics; /// Returns true if `ptr` is aligned to `align`. diff --git a/memory-management/tests/jemalloc_wrap.rs b/memory-management/tests/jemalloc_wrap.rs new file mode 100644 index 00000000000000..c2a75d096dc65c --- /dev/null +++ b/memory-management/tests/jemalloc_wrap.rs @@ -0,0 +1,48 @@ +#![cfg(not(any(target_env = "msvc", target_os = "freebsd")))] +use {solana_memory_management::jemalloc_monitor::*, std::time::Duration}; + +#[global_allocator] +static GLOBAL_ALLOC_WRAP: JemWrapAllocator = JemWrapAllocator::new(); + +pub fn print_allocations() { + view_allocations(|stats| { + println!("allocated so far: {:?}", stats); + }); +} + +// This is not really a test as such, more a canary to check if the logic works and does not deadlock. +// None of the reported data is "exact science" +fn main() { + let mut mps = MemPoolStats::default(); + mps.add("Foo"); + mps.add("Boo"); + init_allocator(mps); + + let _s = "allocating a string!".to_owned(); + print_allocations(); + + let jh1 = std::thread::Builder::new() + .name("Foo thread 1".to_string()) + .spawn(|| { + let _s2 = "allocating a string!".to_owned(); + let _s3 = "allocating a string!".to_owned(); + let _s4 = "allocating a string!".to_owned(); + let jh2 = std::thread::Builder::new() + .name("Boo thread 1".to_string()) + .spawn(|| { + let _s2 = "allocating a string!".to_owned(); + let _s3 = "allocating a string!".to_owned(); + let _s4 = "allocating a string!".to_owned(); + std::thread::sleep(Duration::from_millis(200)); + }) + .unwrap(); + std::thread::sleep(Duration::from_millis(200)); + jh2.join().unwrap(); + }) + .unwrap(); + std::thread::sleep(Duration::from_millis(100)); + print_allocations(); + jh1.join().unwrap(); + print_allocations(); + deinit_allocator(); +} diff --git a/validator/Cargo.toml b/validator/Cargo.toml index 1817a3ecd56f39..606b427d88499e 100644 --- a/validator/Cargo.toml +++ b/validator/Cargo.toml @@ -45,7 +45,6 @@ solana-geyser-plugin-manager = { workspace = true } solana-gossip = { workspace = true } solana-ledger = { workspace = true } solana-logger = { workspace = true } -solana-memory-management = { workspace = true } solana-metrics = { workspace = true } solana-net-utils = { workspace = true } solana-perf = { workspace = true } @@ -80,6 +79,7 @@ tempfile = { workspace = true } [target.'cfg(not(any(target_env = "msvc", target_os = "freebsd")))'.dependencies] jemallocator = { workspace = true } +solana-memory-management = { workspace = true } [target."cfg(unix)".dependencies] libc = { workspace = true } diff --git a/validator/src/main.rs b/validator/src/main.rs index 34602e17610670..da33eef32a6fc9 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -1,7 +1,7 @@ #![allow(clippy::arithmetic_side_effects)] -//#[cfg(not(any(target_env = "msvc", target_os = "freebsd")))] -//use jemallocator::Jemalloc; +#[cfg(not(any(target_env = "msvc", target_os = "freebsd")))] +use jemallocator::Jemalloc; #[cfg(all( feature = "alloc_monitor", not(any(target_env = "msvc", target_os = "freebsd")) @@ -103,14 +103,14 @@ use { not(any(target_env = "msvc", target_os = "freebsd")) ))] #[global_allocator] -static GLOBAL_ALLOC_WRAP: JemWrapAllocator = JemWrapAllocator::new(); +static GLOBAL: JemWrapAllocator = JemWrapAllocator::new(); #[cfg(all( not(feature = "alloc_monitor"), not(any(target_env = "msvc", target_os = "freebsd")) ))] #[global_allocator] -static GLOBAL: jemallocator::Jemalloc = jemallocator::Jemalloc; +static GLOBAL: Jemalloc = Jemalloc; #[derive(Debug, PartialEq, Eq)] enum Operation {