1use sysinfo::SystemExt;23static PAGE_SIZE: usize = 4096;4static PERCENTAGE: f64 = 0.1;5static OVER_PERCENTAGE: f64 = 0.1;67fn create_memory(size: usize) -> Result<memmap2::MmapMut, std::io::Error> {8 let mut map = memmap2::MmapOptions::new().len(size).map_anon()?;9 assert!(map.len() == size);1011 for i in (0..map.len()).step_by(PAGE_SIZE) {12 map[i] = 0xAB;13 }1415 Ok(map)16}1718fn main() {19 let mut sys = sysinfo::System::new_with_specifics(sysinfo::RefreshKind::new().with_memory());2021 let mut allocated = 0;22 let mut _map: memmap2::MmapMut;2324 loop {25 sys.refresh_memory();26 println!("{}/{}", sys.used_memory(), sys.total_memory());27 let used = sys.used_memory();28 let total = sys.total_memory();2930 let mut needed = (total as f64 * PERCENTAGE) as i64 - used as i64;31 println!("needed = {needed}, allocated = {allocated}");3233 if needed > 0 {34 // Very slightly over-allocate to work around rounding issues and provide cushion to35 // avoid re-allocating frequently36 needed = (needed as f64 * 1.01) as i64;37 needed += allocated as i64;3839 println!("allocating {needed} bytes");4041 _map = create_memory(needed as usize).unwrap();42 allocated = needed as u64;4344 sys.refresh_memory();45 println!("actual = {}/{}", sys.used_memory(), sys.total_memory());46 } else if needed < -(total as f64 * OVER_PERCENTAGE) as i64 {47 // Deallocate if we're too high4849 needed += allocated as i64;50 needed = std::cmp::max(needed, 0);5152 println!("shrinking to {needed} bytes");5354 _map = create_memory(needed as usize).unwrap();55 allocated = needed as u64;56 }5758 println!();5960 std::thread::sleep(std::time::Duration::from_secs(60));61 }62}