[Work in Progress]
The microchassis is all about increasing the observability of Rust binaries.
Example intergration with hyper endpoint:
use microchassis::profiling::{jeprof, mallctl}; std::thread::Builder::new().name("pprof".to_string()).spawn(move || {
mallctl::set_thread_active(false).map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;let rt = tokio::runtime::Builder::new_current_thread().enable_all().build().map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;let make_service = hyper::service::make_service_fn(move |_conn| {let service = hyper::service::service_fn(move |req| handle(req));asyncmove{Ok::<_, io::Error>(service)}});let addr = SocketAddr::from(([127,0,0,1],3000));ifletErr(e) =
rt.block_on(asyncmove{ hyper::Server::bind(&addr).serve(make_service).await}){Err(io::Error::new(io::ErrorKind::Other, e))}else{Ok(())}})?;asyncfnhandle(req: hyper::Request<hyper::Body>) -> io::Result<hyper::Response<hyper::Body>>{let(parts, body) = req.into_parts();let body =
hyper::body::to_bytes(body).await.map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;let req = hyper::Request::from_parts(parts, body.into());let resp = jeprof::router(req).map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;let resp = resp.map(hyper::Body::from);Ok(resp)}Keep symbol in release binary.
[profile.release]
debug = 1strip = falseDisable ASLR if necessary or install the disable_aslr helper tool.
On Linux you should prefer setarch -R.
cargo install microchassis --features=disable_aslrUse package manager to install jeprof or download from
https://github.com/jemalloc/jemalloc/blob/master/bin/jeprof.in, rename to
jeprof and edit its version (x.y.z-0-commit) inside.
(optional) Install graphviz package.
(optional) Install flamegraph.pl from
https://raw.githubusercontent.com/brendangregg/FlameGraph/master/flamegraph.pl.
Run your binary with profiling enabled and activated:
MALLOC_CONF=prof:true,prof_active:true,lg_prof_sample:8 disable_aslr ./myserver(Use _RJEM_MALLOC_CONF if jemalloc is built with prefix.)
Or start with profiling not active and activate later via HTTP endpoint:
MALLOC_CONF=prof:true,prof_active:false,lg_prof_sample:8 disable_aslr ./myservercurl -X POST 'http://myserver:12345/pprof/conf?prof.active:true'Fetch a profile dump with jeprof and generate a flame/icicle graph.
jeprof --raw 'http://myserver:12345/pprof/heap'>heap.prof
jeprof --collapsed heap.prof | flamegraph.pl --reverse --invert >heap.svg